<?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>Mozilla Add-ons Blog &#187; guest posts</title>
	<atom:link href="http://blog.mozilla.com/addons/category/guest-posts/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.mozilla.com/addons</link>
	<description>Official Blog of Mozilla Add-ons</description>
	<lastBuildDate>Thu, 19 Nov 2009 18:52:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Firefox Mobile Add-ons &#8211; One Small Step for Mankind</title>
		<link>http://blog.mozilla.com/addons/2009/06/04/firefox-mobile-add-ons-one-small-step-for-mankind/</link>
		<comments>http://blog.mozilla.com/addons/2009/06/04/firefox-mobile-add-ons-one-small-step-for-mankind/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 21:17:30 +0000</pubDate>
		<dc:creator>rbango</dc:creator>
				<category><![CDATA[developers]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[guest posts]]></category>

		<guid isPermaLink="false">http://blog.mozilla.com/addons/?p=670</guid>
		<description><![CDATA[This is a re-post from Mozilla community member &#038; add-on developer Brian King:
By small in the title, I mean small devices. One large step was taken in the Fennec add-ons ecosystem over the weekend at the Mozilla/Maemo get together in Copenhagen [pictures, tweets]. Present were a large chunk of the Fennec developement team, add-on developers, [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "Firefox Mobile Add-ons &#8211; One Small Step for Mankind", url: "http://blog.mozilla.com/addons/2009/06/04/firefox-mobile-add-ons-one-small-step-for-mankind/" });</script>]]></description>
			<content:encoded><![CDATA[<p><em>This is a <a href="http://brian.kingsonline.net/talk/?p=423">re-post</a> from Mozilla community member &#038; add-on developer <a href="http://brian.kingsonline.net">Brian King</a>:</em></p>
<p>By small in the title, I mean small devices. One large step was taken in the Fennec add-ons ecosystem over the weekend at the <a title="Mozilla/Maemo Weekend" href="http://wiki.maemo.org/Mozilla_Maemo_Danish_Weekend">Mozilla/Maemo get together</a> in <a class="zem_slink" title="Copenhagen" rel="wikipedia" href="http://en.wikipedia.org/wiki/Copenhagen">Copenhagen</a> [<a title="mozmae on Flickr" href="http://www.flickr.com/photos/tags/mozmae/">pictures</a>, <a title="mozmae on Twitter" href="http://twitter.com/#search?q=mozmae">tweets</a>]. Present were a <a title="Fennec devs" href="http://www.flickr.com/photos/28959625@N04/3580907850/">large chunk of the Fennec developement team</a>, add-on developers, localisers, and community members. We shared the space with <a class="zem_slink" title="Maemo (operating system)" rel="homepage" href="http://www.maemo.org/">Maemo</a> developers and community members, and while there was not much overlap during sessions and hacking, there were some useful discussions on how we can work better together. The weekend was a mix of sessions and hacking, with the focus more on the latter. We ported add-ons, made new ones, found bugs, and had discussions on best practices and ways to improve the user experience. Here is a mini-report of what went down, from an add-ons perspective.</p>
<h2>Target</h2>
<p>It might be obvious to say this, but Fennec add-ons are much different beasts than their desktop counterparts. All the goodness of the Mozilla Platform is there and available to use, but the UI is completely different. Less hooks are available simply because there is less space, but the design and UI flow provide different challenges. Sure, there are toolstrips, aka vertical bars to stick icons on to, but what would happen if every extension did that. Pretty soon yours would be lost in the mix.</p>
<p><a title="Egotism" href="http://madhava.com/egotism/">Madhava Enros</a> did a good job of explain the design behind the Fennec UI. Dialogs and context menus are just 2 things among others that are out in Fennec, and their usage is strongly discouraged. With regard to dialogs, one concern I was hearing from devs is how to show preferences. Recent builds of Fennec (get desktop builds <a title="Recent Fennec Desktop builds" href="http://wiki.maemo.org/Mozilla_Maemo_Danish_Weekend/Developer_Challenge#Fennec_Desktop_Builds">here</a>, or ask on irc.mozilla.org#mobile) have already taken steps to address this.</p>
<div class="wp-caption aligncenter" style="width: 460px;"><a href="http://www.flickr.com/photos/king-molan/3594161733/"><img src="http://blog.mozilla.com/addons/files/2009/06/briks_fennec2.png" alt="Fennec Add-ons Manager" width="450" height="412" /></a></p>
<p class="wp-caption-text">Fennec Add-ons Manager</p>
</div>
<p>So as you can see, when Options is selected, the UI appears inline and not in a dialog. While there are still bugs, it is clever, but is it scalable for larger pref sets? Or should extension authors scale down?</p>
<h2>Stepping Back</h2>
<p>I started off my talk about porting existing extensions [Slides: <a title="PDF : Shrinking Add-ons" href="http://briks.si/presentations/danishweekend09/Shrinking_Add_ons.pdf">PDF</a> | <a title="PPT: Shrinking Add-ons" href="http://briks.si/presentations/danishweekend09/Shrinking_Add_ons.ppt">PPT</a>] by challenging authors to really think whether they should do it. Ask yourself, does it make sense in this context? Does it fit into the browsing habits of users of smaller devices, which is different than desktop usage? For example, users on the go want more information suggested to them as opposed to go hunting for it which can be cumbersome. Now I don’t want to discourage you from porting your add-on. We certainly need more. Keep in mind that it will be more work than just adding Fennec as a target application in install.rdf, and while doing it, get inspiration for new ideas. I think some of the best add-ons will be ones built from the ground up that take advantage of device capabilities such as GPS and voice.</p>
<p>The document story needs to get better. Mark Finkle <a title="Resource for Fennec add-on developers" href="http://starkravingfinkle.org/blog/2009/05/resources-for-fennec-add-on-developers/">posted last week</a> about his documentation efforts so far, and thanks to Mark for that. It gives us a solid foundation to add more. I urge everyone working in this area to post your finding on the Mozilla wiki / Devmo / your blog / anywhere to make life easier for those who follow and help promote adoption. I’ll be personally following up with all participants to make sure they do so.</p>
<h2>The Winners</h2>
<p>Before the event, we <a title="Fennec Add-ons Challenge" href="http://www.mozdev.org/drupal/blog/Mozdev-Mozilla-Europe-Firefox-Mobile-Add-ons-Challenge">offered a challenge</a> at short notice on Mozdev to developers to propose ports of their existing work or new add-ons for Fennec. 4 entrants got to go to Copenhagen. The winners were (in no particular order):</p>
<ol>
<li><strong>Fabrice Desre</strong> &#8211; Develop a “local guide” application leveraging the geolocation support in recent Fennec builds. The geoguide will show informations relevant for the user, like touristic information, photos, retaurants  and hotel etc. using various data sources such as flickr and dbpedia.  The focus here is not to rely on a cluttered map display, but to provide a clean UI : in the same spirit of the experiments going on  for the “new tab” in Firefox, but for a “new place”.</li>
<li><strong>Chris Neale</strong> &#8211; Port <strong><a title="Link Widgets" href="https://addons.mozilla.org/en-US/firefox/addon/2933">Link Widgets</a></strong> to Fennec.</li>
<li><strong>Marien Zwart</strong> &#8211; Port <strong><a href="http://radialcontextmz.mozdev.org/">RadialContext-mz</a></strong> to Fennec.</li>
<li><strong>Benoit Bailleux</strong> &#8211; <strong>autoOpenID</strong> looks for <a class="zem_slink" title="OpenID" rel="homepage" href="http://openid.net">OpenID</a> sign-in forms and (depending on its  configuration) can log-in automaticaly (or propose to) with no more  than one click.</li>
</ol>
<p>Of the four, Fabrice completed <strong><a title="GeoGuide" href="https://addons.mozilla.org/en-US/fennec/addon/12118">GeoGuide</a></strong>, Chris is almost complete, and Marien and Benoit are still working on it.</p>
<div class="wp-caption aligncenter" style="width: 460px;">
<p><a href="https://addons.mozilla.org/en-US/fennec/addon/12118"><br />
<img src="http://blog.mozilla.com/addons/files/2009/06/briks_fennec11.png" alt="briks_fennec1" title="briks_fennec1" width="450" height="312" class="alignnone size-full wp-image-672" /></a></p>
<p class="wp-caption-text">GeoGuide</p>
</div>
<p><strong>GeoGuide</strong> determines your location using the Geolocation API, and with that data present you with a map view, weather, local events, images, and wikipedia articles.</p>
<h2>And The Rest</h2>
<p>Some other good work came out the weekend.</p>
<ul>
<li><strong><a title="Nicolas Beloni" href="http://nicolasbelloni.com">Nicolas Belloni</a></strong> and <a title="Mattias Rost" href="http://www.sics.se/%7Erost/">Mattias Rost</a> are working on <strong>Detector</strong> which is their own words, “is an add-on to bring more fingerfriendliness to the content of webpages on Fennec. We strongly support Mozilla’s effort to make a browser adapted for mobile users. So we are aiming at adding more interaction to phone numbers, addresses and contacts’ names. The type of interaction style that we add to the content needs to be thought in order not to be destructive and to take into account the lack of contextual menu. To begin with, we want to detect phones numbers and give the possibility to users to call, save or sms this number”.</li>
<li>Jesper Hansen is working on a few things — The first is <strong>Save Image</strong>. Since Fennec has no possibility to save images, then this addon will provide a list of all images on the loaded page with name, ext, size and a single button to save it. <strong>Save Image</strong> will also provide a simple canvas dialog (or alternative) that slides up from the bottom of the screen when a onmousedown is being detected for longer than a specific time on an image. Second up, <strong>Toastercat</strong>: an add-on to monitor and display content of <a href="http://icanhascheezburger.com/" target="_blank">icanhascheezburger.com</a> (and friends, see <a href="https://addons.mozilla.org/en-US/firefox/addon/11945" target="_blank">https://addons.mozilla.org/en-US/firefox/addon/11945</a>) RSS feeds in a simple way without having to load the entire page but only rely on the content provided in the feed. A third add-on is related to <strong>about:config</strong> since Fennec is missing some features there.</li>
<li><strong>Fabrice</strong> followed up the excellent GeoGuide with the equally excellent <a title="GrafiTwit" href="https://addons.mozilla.org/en-US/firefox/addon/12191"> GrafiTwit</a>. This brings a new twist to tweeting, allow you to doodle on a canvas, send the picture off to Twitpic, and post the link to your stream.</li>
<li>I ported <a title="Zemanta" href="https://addons.mozilla.org/en-US/firefox/addon/7571">Zemanta</a>, a few hours of effort, and it now works as the desktop version bar a couple of bugs related to the icon in the location bar. Let me know if you want to try it out, it is not public yet.</li>
</ul>
<div class="wp-caption aligncenter" style="width: 460px;"><a href="http://www.flickr.com/photos/king-molan/3578190621/"><img src="http://blog.mozilla.com/addons/files/2009/06/briks_fennec3.png" alt="Zemanta on Fennec" width="450" height="392" /></a></p>
<p class="wp-caption-text">Zemanta on Fennec</p>
</div>
<p>There are a few more <a title="Fennec on Mozilla Add-ons" href="https://addons.mozilla.org/en-US/fennec">add-ons for Fennec available on Mozilla Add-ons</a>. <strong>UPDATE</strong>: <a title="Fennec search for extensions on AMO" href="https://addons.mozilla.org/en-US/fennec/search?q=&amp;cat=all&amp;as=true&amp;vfuz=true&amp;appid=60&amp;lver=any&amp;hver=any&amp;atype=1&amp;pid=0&amp;lup=&amp;pp=20&amp;sort=">More than a few</a>.</p>
<h2>Lessons Learned and Bugs</h2>
<p>One of the lessons learned is best summed up by the mantra ‘performance, performance, performance’. Things you take for granted on the desktop may bite you on the mobile device. Here are some <a title="Fennec performance guidelines" href="https://wiki.mozilla.org/Mobile/Fennec/Architecture#Performance_Related_Coding_Guidelines">performance related guidelines</a>. Another important point is to try if at all possible to test on one of the mobile devices that Fennec runs on. When testing existing add-ons on Nokia developer devices, it was apparent quickly that this was not done for some existing ones. The desktop versions just don’t highlight some issues, e.g. related to touch. Another alternative is to <a title="Maemo Virtual Image" href="http://maemovmware.garage.maemo.org/">run Maemo virtually</a>.</p>
<div class="wp-caption aligncenter" style="width: 460px;"><a href="http://www.flickr.com/photos/28959625@N04/3581109050/in/set-72157618950617291/"><img src="http://blog.mozilla.com/addons/files/2009/06/briks_fennec4.png" alt="Mozilla/Maemo Danish Weekend 2009" width="450" height="333" /></a></p>
<p class="wp-caption-text">Mozilla/Maemo Danish Weekend 2009</p>
</div>
<p>At this point, bugs are good. If you come across any, please report them and make them block <a title="Bug 492546" href="https://bugzilla.mozilla.org/show_bug.cgi?id=492546">bug 492546</a> [<strong><em><span style="display: inline;">Develop an extension showing a xul page in BrowserCanvas</span></em></strong>]. <span class="bz_first_comment_head"><span class="vcard"><span class="fn email">Vivien Nicolas of Mozilla Europe is working on identifying all XUL related bugs in Fennec, triaging, and following up on fixes.</span></span></span></p>
<p><a href="http://sharethis.com/item?&wp=2.8.6&amp;publisher=7e0eb025-1057-4238-a77c-a634ef8a9d63&amp;title=Firefox+Mobile+Add-ons+%26%238211%3B+One+Small+Step+for+Mankind&amp;url=http%3A%2F%2Fblog.mozilla.com%2Faddons%2F2009%2F06%2F04%2Ffirefox-mobile-add-ons-one-small-step-for-mankind%2F">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.com/addons/2009/06/04/firefox-mobile-add-ons-one-small-step-for-mankind/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mozilla in Indonesia</title>
		<link>http://blog.mozilla.com/addons/2009/06/01/mozilla-in-indonesia/</link>
		<comments>http://blog.mozilla.com/addons/2009/06/01/mozilla-in-indonesia/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 15:34:47 +0000</pubDate>
		<dc:creator>rbango</dc:creator>
				<category><![CDATA[events]]></category>
		<category><![CDATA[guest posts]]></category>
		<category><![CDATA[add-ons]]></category>
		<category><![CDATA[Indonesia]]></category>

		<guid isPermaLink="false">http://blog.mozilla.com/addons/?p=651</guid>
		<description><![CDATA[This is a re-post of Gen Kanai&#8217;s article on the Add-ons for Mozilla meetup at ITS Surabaya, a university in the second-largest city in Indonesia.
In a recent post at Ken Kovash&#8217;s Blog of Metrics regarding Firefox in Latvia passing 50% market share, Indonesia was ranked at 63% market share. With such a love for Firefox, [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "Mozilla in Indonesia", url: "http://blog.mozilla.com/addons/2009/06/01/mozilla-in-indonesia/" });</script>]]></description>
			<content:encoded><![CDATA[<p><em>This is a re-post of <a href="http://blog.mozilla.com/gen/">Gen Kanai&#8217;s</a> article on the <a href="http://blog.mozilla.com/gen/2009/05/29/mozilla-in-indonesia/">Add-ons for Mozilla meetup at ITS Surabaya</a>, a university in the second-largest city in Indonesia.</em></p>
<p>In a recent post at Ken Kovash&#8217;s Blog of Metrics regarding <a href="http://blog.mozilla.com/metrics/2009/05/01/latvians-love-firefox/">Firefox in Latvia passing 50% market share</a>, Indonesia was ranked at 63% market share. With such a love for Firefox, it&#8217;s also great to see that Indonesia has finally had it&#8217;s first Mozilla event last month.</p>
<p>Romi Hardiyanto, Mozilla&#8217;s localizer for Bahasa Indonesia, led an afternoon of presentations on Add-ons for Mozilla at <a href="http://www.its.ac.id/en/">ITS Surabaya</a>, a university in the <a href="http://en.wikipedia.org/wiki/Surabaya">second-largest city in Indonesia</a>. Romi has a great write-up of the event, <a href="http://blog.mozilla.web.id/2009/05/mozilla-day-at-its/">Mozilla Day at ITS</a>, at the brand new <a href="http://blog.mozilla.web.id/">Mozilla Indonesia blog</a>.</p>
<p>A photo of the students</p>
<p><a href="http://www.flickr.com/photos/rodin/3480973762/in/set-72157617396202518/"><img src="http://farm4.static.flickr.com/3547/3480973762_634ea69ce0_d.jpg" alt="The People" /><br />
</a></p>
<p><a href="http://hanifproject.wordpress.com/bout-the-project/"><br />
HΛniF: Hadits, Now in Firefox</a></p>
<p><a href="http://www.flickr.com/photos/rodin/3481609460/in/set-72157617396202518"><img src="http://farm4.static.flickr.com/3341/3481609460_3949673833_d.jpg" alt="HΛniF Presentation" /></a></p>
<p>Photos from the event are available at Romi&#8217;s <a href="http://www.flickr.com/photos/rodin/sets/72157617396202518/">Flickr</a>, Aini-san&#8217;s <a href="http://picasaweb.google.com/nurainir/MozillaDayDiITS#">Picasa</a> and Kiki&#8217;s <a href="http://www.facebook.com/album.php?aid=22943&amp;id=1111044925">Facebook</a>.</p>
<p>I would like to take a moment to thank Romi Hardiyanto, Mozilla&#8217;s tireless Bahasa Indonesia localizer for Firefox who, in addition to localizing Firefox for Indonesians, is also working to spread Firefox farther in Indonesia.  Thank you Romi!</p>
<p>This event would also not have happened without the support and coordination of <a href="http://ai23.wordpress.com/">Nur’ Aini Rakhmawati</a> of ITS Surabaya who hosted the event.  Thank you Aini-san!</p>
<p>Thank you also goes to <a href="http://chickswhoclick.wordpress.com/">Mary Colvig</a> who provided support from Marketing/Events.</p>
<p>Since there has been so much interest in Add-ons in Indonesia, we would like to explore the possibility of doing a similar or related Mozilla-focused event in Jakarta later this year, after the launch of Firefox 3.5.  If you would like to have a Mozilla event in Jakarta, please feel free to comment and leave your email so we can contact you.  We are looking for people in Jakarta who would volunteer to help us with some of the organizational work to create such an event.</p>
<p>Here is Romi Hardiyanto&#8217;s presentation on Add-ons (in Bahasa Indonesia, not English.)</p>
<div id="__ss_1352873" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Mozilla Addons Development Talk Its 20090424 Rodin" href="http://www.slideshare.net/romihardiyanto/mozilla-addons-development-talk-its-20090424-rodin?type=presentation">Mozilla Addons Development Talk Its 20090424 Rodin</a><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mozillaaddonsdevelopmenttalkits20090424rodin-090427131741-phpapp01&amp;stripped_title=mozilla-addons-development-talk-its-20090424-rodin" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mozillaaddonsdevelopmenttalkits20090424rodin-090427131741-phpapp01&amp;stripped_title=mozilla-addons-development-talk-its-20090424-rodin" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/romihardiyanto">Romi Hardiyanto</a>.</div>
</div>
<p><a href="http://www.flickr.com/photos/rodin/3480997284/in/set-72157617396202518/"><img src="http://farm4.static.flickr.com/3625/3480997284_b2be14bf98_d.jpg" alt="Purezilla" /></a></p>
<p>Here is <a href="http://linuxgembel.wordpress.com/">Kiki Ahmadi</a>&#8217;s presentation on the <a href="http://purezilla.wordpress.com/">PureZilla</a> add-on.</p>
<div id="__ss_1342933" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="PureZilla - Firefox addon for product information searching" href="http://www.slideshare.net/gembel_linux/purezilla-firefox-addon-for-product-information-searching?type=powerpoint">PureZilla &#8211; Firefox addon for product information searching</a><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentation-090426031749-phpapp01&amp;stripped_title=purezilla-firefox-addon-for-product-information-searching" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentation-090426031749-phpapp01&amp;stripped_title=purezilla-firefox-addon-for-product-information-searching" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/gembel_linux">Kiki Ahmadi</a>.</div>
</div>
<p>Thank you Romi and Aini-san and everyone who made Mozilla&#8217;s first event in Indonesia a success!</p>
<p><a href="http://www.flickr.com/photos/rodin/3480859735/in/set-72157617396202518/"><img src="http://farm4.static.flickr.com/3655/3480859735_736d8d87cf_d.jpg" alt="Romi Hardiyanto" /></a></p>
<p><a href="http://sharethis.com/item?&wp=2.8.6&amp;publisher=7e0eb025-1057-4238-a77c-a634ef8a9d63&amp;title=Mozilla+in+Indonesia&amp;url=http%3A%2F%2Fblog.mozilla.com%2Faddons%2F2009%2F06%2F01%2Fmozilla-in-indonesia%2F">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.com/addons/2009/06/01/mozilla-in-indonesia/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Firefox Mobile Add-ons Challenge</title>
		<link>http://blog.mozilla.com/addons/2009/05/12/firefox-mobile-add-ons-challenge/</link>
		<comments>http://blog.mozilla.com/addons/2009/05/12/firefox-mobile-add-ons-challenge/#comments</comments>
		<pubDate>Tue, 12 May 2009 20:45:06 +0000</pubDate>
		<dc:creator>Justin Scott (fligtar)</dc:creator>
				<category><![CDATA[developers]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[guest posts]]></category>
		<category><![CDATA[contests]]></category>
		<category><![CDATA[europe]]></category>

		<guid isPermaLink="false">http://blog.mozilla.com/addons/?p=615</guid>
		<description><![CDATA[Mozdev and Mozilla Europe are teaming up to sponsor a contest for mobile add-ons. The following post is from the Mozdev blog.

Here at Mozdev, we want to see more add-ons for Firefox Mobile (aka Fennec), so we are teaming up with Mozilla Europe to make a challenge. The task is straightforward. You need only at [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "Firefox Mobile Add-ons Challenge", url: "http://blog.mozilla.com/addons/2009/05/12/firefox-mobile-add-ons-challenge/" });</script>]]></description>
			<content:encoded><![CDATA[<p><i><a href="http://mozdev.org/">Mozdev</a> and <a href="http://mozilla-europe.org/en/">Mozilla Europe</a> are teaming up to sponsor a contest for mobile add-ons. The following post is from the <a href="http://www.mozdev.org/drupal/blog/Mozdev-Mozilla-Europe-Firefox-Mobile-Add-ons-Challenge">Mozdev blog</a>.</i></p>
<hr />
Here at Mozdev, we want to see more add-ons for <a href="https://wiki.mozilla.org/Mobile">Firefox Mobile (aka Fennec)</a>, so we are teaming up with <a href="http://mozilla-europe.org">Mozilla Europe</a> to make a challenge. The task is straightforward. You need only at this time to propose porting your existing add-on to Fennec, or write a new one, with a commitment to finishing it (or at least having a solid proof-of-concept) in time for the <a href="http://wiki.maemo.org/MozillaMaemoDanishWeekend">Mozilla Maemo Danish Weekend</a> on 30-31 May.</p>
<p>REQUIREMENTS<br />
(We are on a tight schedule and have logistics constraints, so apologise for the deadline and geographical restrictions)</p>
<ul>
<li>Write a short proposal stating what your add-on name and current install location, why you think it would be useful to mobile browser users, and how you plan on going about implementing it. Send it to <a href="mailto:brian@mozdev.org">brian@mozdev.org</a> by Friday 15 May, at 12:00 CET.</li>
<li>This challenge is <strong>only open to developers living in Europe</strong>.</li>
<li>The challenge open to current Mozdev project owners, and other developers who host their projects elsewhere.</li>
</ul>
<p>PRIZE</p>
<ul>
<li>10 developers will be chosen, and <a href="http://mozilla-europe.org">Mozilla Europe</a> will sponsor your travel and hotel expenses to attend the <a href="http://wiki.maemo.org/MozillaMaemoDanishWeekend">Mozilla Maemo Danish Weekend</a>.</li>
<li>Entries will be judged by Mozdev representatives.</li>
</ul>
<p>USEFUL RESOURCES<br />
<a href="http://wiki.maemo.org/MozillaMaemoDanishWeekend" title="http://wiki.maemo.org/MozillaMaemoDanishWeekend">http://wiki.maemo.org/MozillaMaemoDanishWeekend</a><br />
<a href="http://www.mozilla.org/projects/fennec/1.0b1/releasenotes/" title="http://www.mozilla.org/projects/fennec/1.0b1/releasenotes/">http://www.mozilla.org/projects/fennec/1.0b1/releasenotes/</a><br />
<a href="https://wiki.mozilla.org/Mobile/Fennec/Extensions" title="https://wiki.mozilla.org/Mobile/Fennec/Extensions">https://wiki.mozilla.org/Mobile/Fennec/Extensions</a><br />
<a href="https://wiki.mozilla.org/Mobile/Fennec/Architecture" title="https://wiki.mozilla.org/Mobile/Fennec/Architecture">https://wiki.mozilla.org/Mobile/Fennec/Architecture</a><br />
<a href="http://starkravingfinkle.org/blog/tags/mobile/" title="http://starkravingfinkle.org/blog/tags/mobile/">http://starkravingfinkle.org/blog/tags/mobile/</a><br />
<a href="http://www.mozdev.org/projects/applications/Fennec.html" title="http://www.mozdev.org/projects/applications/Fennec.html">http://www.mozdev.org/projects/applications/Fennec.html</a><br />
<a href="https://addons.mozilla.org/en-US/fennec/" title="https://addons.mozilla.org/en-US/fennec/">https://addons.mozilla.org/en-US/fennec/</a></p>
<p><a href="http://sharethis.com/item?&wp=2.8.6&amp;publisher=7e0eb025-1057-4238-a77c-a634ef8a9d63&amp;title=Firefox+Mobile+Add-ons+Challenge&amp;url=http%3A%2F%2Fblog.mozilla.com%2Faddons%2F2009%2F05%2F12%2Ffirefox-mobile-add-ons-challenge%2F">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.com/addons/2009/05/12/firefox-mobile-add-ons-challenge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An Invitation to Create Firefox Extensions for Good Causes</title>
		<link>http://blog.mozilla.com/addons/2009/02/23/an-invitation-to-create-firefox-extensions-for-good-causes/</link>
		<comments>http://blog.mozilla.com/addons/2009/02/23/an-invitation-to-create-firefox-extensions-for-good-causes/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 01:08:34 +0000</pubDate>
		<dc:creator>Justin Scott (fligtar)</dc:creator>
				<category><![CDATA[developers]]></category>
		<category><![CDATA[guest posts]]></category>

		<guid isPermaLink="false">http://blog.mozilla.com/addons/?p=333</guid>
		<description><![CDATA[The following is a guest post from Joe Solomon, Director of Social Actions&#8217; Change the Web Challenge.

Today we are launching Social Actions&#8217; Change the Web Challenge &#8211; a contest to build new web apps that help people make a difference on the millions of websites we visit everyday.  There will also be $10,000 in [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "An Invitation to Create Firefox Extensions for Good Causes", url: "http://blog.mozilla.com/addons/2009/02/23/an-invitation-to-create-firefox-extensions-for-good-causes/" });</script>]]></description>
			<content:encoded><![CDATA[<p><i>The following is a guest post from Joe Solomon, Director of Social Actions&#8217; Change the Web Challenge.</i></p>
<hr />
Today we are launching Social Actions&#8217; <a href="http://www.socialactions.com/changetheweb">Change the Web Challenge</a> &#8211; a contest to build new web apps that help people make a difference on the millions of websites we visit everyday.  There will also be $10,000 in prizes.  We are extremely excited to be partnering with Mozilla on this project!</p>
<p>Over at Social Actions <http://socialactions.com/> we&#8217;ve created an open database of 60,000+ actions from 40+ sites<http://socialactions.com/meet-the-platforms>- including <a href="http://www.globalgiving.com/">GlobalGiving</a>, <a href="http://www.change.org/">Change.org</a>, <a href="http://www.donorschoose.org/">DonorsChoose.org</a>, <a href="http://www.kiva.org/">Kiva.org</a>, <a href="http://www.nabuur.com/">Nabuur</a>, <a href="http://www.tigweb.org/">TakingITGlobal</a>, <a href="http://www.idealist.org/">Idealist.org</a>, and <a href="http://www.volunteermatch.org/">VolunteerMatch</a>.</p>
<p>What the <a href="http://www.socialactions.com/changetheweb">Change the Web Challenge</a> is about is getting these actions out there &#8211; by helping people find and share actions on the websites, blogs and social networks that we all visit everyday.</p>
<p>What makes Mozilla and Firefox add-ons in particular such a powerful platform for social change is that you can change the way people browse the web.  You can add an intimate and direct layer of social change to the browsing experience.  You can, with so many different possibilities, help people make a difference on any website.</p>
<p>For example, Marnie Webb created an <a href="http://my.socialactions.com/profiles/blogs/how-to-take-action-on-any-web">Ubiquity command</a> that lets you highlight any phrase on any site and find related ways to take action from Social Actions&#8217; <a href="http://socialactions.com/meet-the-platforms">40+ action sources</a>.</p>
<p>Our community members have also imagined (read: not built) an extension that replaces ads with actions (a la <a href="https://addons.mozilla.org/en-US/firefox/addon/6846">AddArt</a>), to another extension that would alert you to relevant actions as you browse the web (possibly like <a href="http://www.collactive.com">Collactive</a>), to a browser-based feed reader with the latest actions categorized by cause (by re-skinning <a href="https://addons.mozilla.org/en-US/firefox/addon/8586">ObamaFox</a>).</p>
<p>We hope you&#8217;ll join us in envisioning and building new Firefox extensions that combine the aggregated actions of Social Actions with the powerful reach and impact of Mozilla Firefox.</p>
<p>You can find out more about the Change the Web Challenge, including how to submit your project <a href="http://www.socialactions.com/changetheweb">here</a>.</p>
<p>More links:</p>
<ul>
<li><a href="http://www.socialactions.com/changetheweb">Change the Web Challenge Slideshow</a></li>
<li><a href="http://groups.google.com/group/social-actions-dev">Social Actions&#8217; Developers Google Group</a></li>
<li><a href="http://www.socialactions.com/developers">Developer Resources</a></li>
<li><a href="http://www.slideshare.net/JoeSolomon/firefox-extensions-for-social-change-presentation">Firefox Extensions for Social Change</a> (Slideshow)</li>
<li><a href="http://my.socialactions.com/events/how-can-mozilla-empower">March 3rd, Online Chat, How Can Mozilla Empower Movements &#038; Nonprofits</a></li>
</ul>
<p><a href="http://sharethis.com/item?&wp=2.8.6&amp;publisher=7e0eb025-1057-4238-a77c-a634ef8a9d63&amp;title=An+Invitation+to+Create+Firefox+Extensions+for+Good+Causes&amp;url=http%3A%2F%2Fblog.mozilla.com%2Faddons%2F2009%2F02%2F23%2Fan-invitation-to-create-firefox-extensions-for-good-causes%2F">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.com/addons/2009/02/23/an-invitation-to-create-firefox-extensions-for-good-causes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How to develop a Firefox extension</title>
		<link>http://blog.mozilla.com/addons/2009/01/28/how-to-develop-a-firefox-extension/</link>
		<comments>http://blog.mozilla.com/addons/2009/01/28/how-to-develop-a-firefox-extension/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 22:46:49 +0000</pubDate>
		<dc:creator>rbango</dc:creator>
				<category><![CDATA[developers]]></category>
		<category><![CDATA[documentation]]></category>
		<category><![CDATA[guest posts]]></category>
		<category><![CDATA[tutorials]]></category>

		<guid isPermaLink="false">http://blog.mozilla.com/addons/?p=271</guid>
		<description><![CDATA[
.code {
	background: #eee;
	width: 96%;
	padding: 1em 2%;
	overflow: auto;
}

Reposted with permission from Robert Nyman:
Admit that you have always wanted to know how to develop a Firefox extension but never had the time to learn.  Here I will walk you through and at the end of the article we will have created a fully functional Firefox extension!

Our [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "How to develop a Firefox extension", url: "http://blog.mozilla.com/addons/2009/01/28/how-to-develop-a-firefox-extension/" });</script>]]></description>
			<content:encoded><![CDATA[<style>
.code {
	background: #eee;
	width: 96%;
	padding: 1em 2%;
	overflow: auto;
}
</style>
<p><em><strong>Reposted with permission from <a href="http://www.robertnyman.com/2009/01/24/how-to-develop-a-firefox-extension/">Robert Nyman</a>:</strong></em></p>
<p>Admit that you have always wanted to know how to develop a Firefox extension but never had the time to learn. <img src='http://www.robertnyman.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley'> Here I will walk you through and at the end of the article we will have created a fully functional Firefox extension!</p>
<p><span id="more-1110"></span></p>
<h2>Our objective</h2>
<p>We will create a Firefox extension to find all links in the current web page, highlight those which have a <code>target</code> attribute and alert you how many links it found. The good part is that once you have done this, you have both an understanding of Firefox extension development as well as a blueprint for any extension you would want to develop in the future.</p>
<p><span id="more-271"></span></p>
<h2>What you need &#8211; setting up the developing environment</h2>
<p>First, let&#8217;s start with setting up your development environment. You need Firefox (duh) and basically whatever code editor you prefer. Then, there are some recommended things to do to prepare Firefox:</p>
<h3>Create a different development profile</h3>
<p>The first step is to create a different profile in Firefox, since you will do some settings and changes that you probably don&#8217;t want for your regular profile. In my case, I&#8217;ve created a new development profile named &#8220;dev&#8221;. The steps to do this are:</p>
<h4>Profile manager on Windows</h4>
<p>Open the Windows Start menu and choose the Run option (on Vista, it might not be there &#8211; just press <kbd>Windows key</kbd> + <kbd>R</kbd> in that case). In the run dialog, write <code>firefox -P</code> and press <kbd>enter</kbd>/click OK. Choose Create Profile in the dialog and follow the steps.</p>
<h4>Profile manager on Mac</h4>
<p>Open the Terminal (located under /Applications/Utilities) and type in <code>/Applications/Firefox.app/Contents/MacOS/firefox -profilemanager</code>. Choose Create Profile in the dialog and follow the steps.</p>
<h4>Profile manager on Linux</h4>
<p>Open a terminal, use <code><span class="lowercase"><acronym title="Compact Disk">CD</acronym></span></code> to navigate to your Firefox directory and then enter <code>./firefox -profilemanager</code>. Choose Create Profile in the dialog and follow the steps.</p>
<h3>Configuration settings for Firefox</h3>
<p>Open Firefox through the Profile Manager (process described above, or set the development profile as default during extension development). Then enter <code>about:config</code> in the address bar. It will warn you about changing settings, but it&#8217;s ok since what you will do is only minor changes for development. You can filter the existing settings, and if any of the below settings don&#8217;t exist, you can just create them.</p>
<h4>Recommended settings</h4>
<p>These are good to enable extension errors in the Firefox Error Console (Tools &gt; Error Console), disable XUL caching and such.</p>
<ul>
<li><code>javascript.options.showInConsole = true</code></li>
<li><code>nglayout.debug.disable_xul_cache = true</code></li>
<li><code>browser.dom.window.dump.enabled = true</code></li>
</ul>
<h4>Optional settings</h4>
<p>These aren&#8217;t necessary, but they might help you out. Personally, I don&#8217;t use these.</p>
<ul>
<li><code>javascript.options.strict = true</code></li>
<li><code>extensions.logging.enabled = true</code></li>
</ul>
<h2>Point your Firefox extensions directory to your extension</h2>
<p>Instead of constantly preparing and reinstalling your extension, there&#8217;s a simple way to add a pointer from your Firefox extensions directory to your code location. To do this, you must first find your profile directory:</p>
<h3>Find your profile directory</h3>
<p>The profile directory is where you will find all the settings for your Firefox profiles, including extension information.</p>
<h4>Find profile directory on Windows</h4>
<p>In Windows 2000 and XP, open Explorer and go to <code>C:\Documents and Settings\[your user name]\Application Data\Mozilla\Firefox\Profiles</code> and in Vista, go to <code>C:\Users\[your user name]\AppData\Roaming</code>.</p>
<h4>Find profile directory on Mac</h4>
<p>Open the Terminal and type in <code><span class="lowercase"><acronym title="Compact Disk">CD</acronym></span> ~/Library/Application\ Support/Firefox/profiles/</code>. There you will find your Firefox profiles, and they will be named with letters and numbers, followed by a dot (.) and then your profile name, e.g. <code>12a3bc4d.dev</code>.</p>
<h4>Find profile directory on Linux</h4>
<p>Open a terminal and type in <code><span class="lowercase"><acronym title="Compact Disk">CD</acronym></span> ~/.mozilla/</code>. In that location, you will find all your Firefox profiles, and they will be named with letters and numbers, followed by a dot (.) and then your profile name, e.g. <code>12a3bc4d.dev</code>.</p>
<h3>Pointing to an extension</h3>
<p>In your development profile folder, you will find a folder named <code>extensions</code>. In it, you will have code for all your installed extensions. Instead of placing your code there, you can create a pointer file. Do that by creating a file with a unique name for you (this will have to be the same as you chose for your <code>em:id</code> value in your <code>install.rdf</code> file &#8211; more on that below).</p>
<p>In the case of our example, create a file named <code>linktargetfinder@robertnyman.com</code>, without any extension, and in it just point it to where you will have your code, e.g. <code>C:\extensions\</code> (Windows) or <code>~/Sites/linktargetfinder/</code> (Mac).</p>
<h2>Creating folder structure and files</h2>
<p>What is needed to have a good base for your extension development, is to create the structure of the extension code. Start by creating this hierarchy:</p>
<p><img src="http://blog.mozilla.com/addons/files/2009/01/extension-structure.png" alt="A picture of a hierarchy with four folders, named chrome, defaults, locale and skin. The chrome has a child folder named content, the defaults folder has a child named preferences and the locale folders has a child folder named en-US. The root also contains two files, chrome.manifest and install.rdf"></p>
<h3><span class="lowercase">i</span>nstall.rdf</h3>
<p>We begin with the intimidating code of <code>install.rdf</code>. This is where you will have all the meta information about your extension, which versions of Firefox it supports and other assorted information. Our <code>install.rdf</code> will look like this:</p>
<pre class="code"><code>&lt;?xml version="1.0"?&gt;

&lt;<acronym title="Resource Description Framework">RDF</acronym> xmlns="http://www.w3.org/1999/02/22-<acronym title="Resource Description Framework">RDF</acronym>-syntax-ns#"
     xmlns:em="http://www.mozilla.org/2004/em-<acronym title="Resource Description Framework">RDF</acronym>#"&gt;

	&lt;Description about="urn:mozilla:install-manifest"&gt;
		&lt;em:id&gt;linktargetfinder@robertnyman.com&lt;/em:id&gt;

		&lt;em:name&gt;Link Target Finder&lt;/em:name&gt;
		&lt;em:version&gt;1.0&lt;/em:version&gt;
		&lt;em:type&gt;2&lt;/em:type&gt;
		&lt;em:creator&gt;Robert Nyman&lt;/em:creator&gt;

		&lt;em:description&gt;Finds links that have a target attribute&lt;/em:description&gt;
		&lt;em:homepageURL&gt;http://www.robertnyman.com/&lt;/em:homepageURL&gt;
		&lt;em:optionsURL&gt;chrome://linktargetfinder/content/options.xul&lt;/em:optionsURL&gt;

		&lt;em:targetApplication&gt;

			&lt;Description&gt;
				&lt;em:id&gt;{ec8030f7-c20a-464f-9b0e-13a3a9e97384}&lt;/em:id&gt;
				&lt;em:minVersion&gt;2.0&lt;/em:minVersion&gt;
				&lt;em:maxVersion&gt;3.1b2&lt;/em:maxVersion&gt;

			&lt;/Description&gt;
		&lt;/em:targetApplication&gt;
	&lt;/Description&gt;
&lt;/RDF&gt;</code></pre>
<p>Scary, right? Well, even if your not used to <acronym title="Resource Description Framework">RDF</acronym> it&#8217;s not that bad at all. Like most code, there&#8217;s some mandatory information that you will never need to change, and then some of your own to sprinkle in. The interesting parts for us are:</p>
<h4>In the <code>Description</code> node</h4>
<dl>
<dt><code>em:id</code></dt>
<dd>This is where you add your unique developer id, of your own choosing. Note that this has to be the same as the pointer file you created above.</dd>
<dt><code>em:name</code></dt>
<dd>The name of your extension.</dd>
<dt><code>em:version</code></dt>
<dd>Current version of your extension.</dd>
<dt><code>em:type</code></dt>
<dd>The type declares that is an extension, as opposed to, for instance, a theme.</dd>
<dt><code>em:creator</code></dt>
<dd>Well, you!</dd>
<dt><code>em:description</code></dt>
<dd>Describes your extension functionality. Will be shown in the Tools &gt; Add-ons window.</dd>
<dt><code>em:homepageURL</code></dt>
<dd>The <acronym title="Uniform Resource Locator">URL</acronym> of your extension&#8217;s web site.</dd>
<dt><code>em:optionsURL</code></dt>
<dd>The <acronym title="Uniform Resource Locator">URL</acronym> to where you will have your file for editing options/preferences.</dd>
</dl>
<h4>In the <code>Description/em:targetApplication</code> node</h4>
<dl>
<dt><code>em:id</code></dt>
<dd>This value is the actual id of Firefox. Change this if you want to develop for Thunderbird or something else.</dd>
<dt><code>em:minVersion</code></dt>
<dd>The minimum version of Firefox required to run the extension. <a href="https://addons.mozilla.org/en-US/firefox/pages/appversions">Valid Application Versions</a>.</dd>
<dt><code>em:maxVersion</code></dt>
<dd>The maximum version of Firefox required to run the extension. <a href="https://addons.mozilla.org/en-US/firefox/pages/appversions">Valid Application Versions</a>.</dd>
</dl>
<p>Read about more options in <a href="https://developer.mozilla.org/en/Install_Manifests">Install Manifests</a>.</p>
<h3><span class="lowercase">c</span>hrome.manifest</h3>
<p>The chrome of Firefox is everything around the content window. i.e. web browser toolbar, menus, statusbar etc. The next file for our extension, which will probably feel a bit awkward to edit, is the <code>chrome.mainfest</code> file. This one, however, is in conjunction with <code>install.rdf</code> the key to how your extension will be added to Firefox, and how it will work. Our <code>chrome.manifest</code> file looks like this:</p>
<pre class="code"><code>content     linktargetfinder    chrome/content/
content     linktargetfinder    chrome/content/ contentaccessible=yes
overlay chrome://browser/content/browser.xul chrome://linktargetfinder/content/browser.xul

locale	linktargetfinder	en-US	locale/en-US/

skin	linktargetfinder	classic/1.0	skin/
style	chrome://global/content/customizeToolbar.xul	chrome://linktargetfinder/skin/skin.css</code></pre>
<p>So, what are all those options? Let&#8217;s go through them:</p>
<dl>
<dt><code>content     linktargetfinder    chrome/content/</code></dt>
<dd>The path to where your extension content files will be found.</dd>
<dt><code>content     linktargetfinder    chrome/content/ contentaccessible=yes</code></dt>
<dd>Same as the above, but when <code>contentaccessible=yes</code> is added, it allows Firefox 3 and later to access the extension&#8217;s files and show them in the web browser (like within a web page). Found this excellent help through <a href="http://adblockplus.org/blog/web-pages-accessing-chrome-is-forbidden">Web pages accessing chrome:// is forbidden</a>.</dd>
<dt><code>overlay chrome://browser/content/browser.xul chrome://linktargetfinder/content/browser.xul</code></dt>
<dd>The path to which file you will use to override web browser elements, and add items to the toolbar, menu and statusbar.</dd>
<dt><code>locale	linktargetfinder	en-US	locale/en-US/</code></dt>
<dd>Used for localization of content.</dd>
<dt><code>skin	linktargetfinder	classic/1.0	skin/</code></dt>
<dd>Skin reference.</dd>
<dt><code>style	chrome://global/content/customizeToolbar.xul	chrome://linktargetfinder/skin/skin.css</code></dt>
<dd>Style overlays for chrome pages.</dd>
</dl>
<p>More information can be found in <a href="https://developer.mozilla.org/en/Chrome_Manifest">Chrome Manifest</a>.</p>
<h3><span class="lowercase">c</span>hrome folder</h3>
<p>Ok, once the mandatory parts are out of the way, now things start to get interesting. This is also when we start to look at XUL, which stands for <acronym title="eXtensible Markup Language">XML</acronym> User Interface Language. It is developed by Mozilla to create interfaces in Firefox, Thunderbird etc.</p>
<p>First, within the <code>chrome/content</code> folder, create three files:</p>
<ul>
<li><code>browser.xul</code></li>
<li><code>options.xul</code></li>
<li><code>linkTargetFinder.js</code></li>
</ul>
<h4><code><span class="lowercase">b</span>rowser.xul</code></h4>
<p>This is the file we will use to override some of the default look of the web browser, i.e. add a button to the toolbar, an item to the Tools menu and a statusbar icon. Let&#8217;s look at the complete browser.xul file and then break it down:</p>
<pre class="code"><code>&lt;?xml version="1.0"?&gt;
&lt;?xml-stylesheet href="chrome://linktargetfinder/skin/skin.css" type="text/css"?&gt;
&lt;!DOCTYPE linktargetfinder SYSTEM "chrome://linktargetfinder/locale/translations.dtd"&gt;
&lt;overlay id="sample" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"&gt;

		&lt;script src="linkTargetFinder.js" /&gt;

		&lt;menupopup id="menu_ToolsPopup"&gt;
			&lt;menuitem label="&#038;runlinktargetfinder;" key="link-target-finder-run-key" oncommand="linkTargetFinder.run()"/&gt;
		&lt;/menupopup&gt;

		&lt;keyset&gt;

			&lt;key id="link-target-finder-run-key" modifiers="accel alt shift" key="L" oncommand="linkTargetFinder.run()"/&gt;
		&lt;/keyset&gt;

		&lt;statusbar id="status-bar"&gt;
			&lt;statusbarpanel id="link-target-finder-status-bar-icon" class="statusbarpanel-iconic" src="chrome://linktargetfinder/skin/status-bar.png" tooltiptext="&#038;runlinktargetfinder;" onclick="linkTargetFinder.run()" /&gt;
		&lt;/statusbar&gt;

		&lt;toolbarpalette id="BrowserToolbarPalette"&gt;
			&lt;toolbarbutton id="link-target-finder-toolbar-button" label="Link Target Finder" tooltiptext="&#038;runlinktargetfinder;" oncommand="linkTargetFinder.run()"/&gt;
		&lt;/toolbarpalette&gt;
&lt;/overlay&gt;</code></pre>
<p>First, there some general <acronym title="eXtensible Markup Language">XML</acronym> syntax, then you include your <acronym title="Cascading Style Sheets">CSS</acronym> code and set a DOCTYPE for localization. It&#8217;s followed by the <code>overlay</code> root element with its Ghostbuster-inspired namespace (developers are truly geeks <img src='http://www.robertnyman.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley'> ).</p>
<p>After that you&#8217;re free to write whatever XUL you want, and basically it&#8217;s like <acronym title="HyperText Markup Language">HTML</acronym> should&#8217;ve been. What I mean with that is that it is filled with basic interface options that can&#8217;t be found anywhere in <acronym title="HyperText Markup Language">HTML</acronym>. For a complete overview of what you can do, please read the <a href="https://developer.mozilla.org/en/XUL_Reference">XUL Reference</a>.</p>
<p>In our code here, we start with adding a menu option to the Tools menu in Firefox, and connect it to a keyboard shortcut:</p>
<pre class="code"><code>&lt;menupopup id="menu_ToolsPopup"&gt;

	&lt;menuitem label="&#038;runlinktargetfinder;" key="link-target-finder-run-key" oncommand="linkTargetFinder.run()"/&gt;
&lt;/menupopup&gt;

&lt;keyset&gt;
	&lt;key id="link-target-finder-run-key" modifiers="accel alt shift" key="L" oncommand="linkTargetFinder.run()"/&gt;
&lt;/keyset&gt;</code></pre>
<p>Followed by adding an icon to the Firefox statusbar:</p>
<pre class="code"><code>&lt;statusbar id="status-bar"&gt;

	&lt;statusbarpanel id="link-target-finder-status-bar-icon" class="statusbarpanel-iconic" src="chrome://linktargetfinder/skin/status-bar.png" tooltiptext="&#038;runlinktargetfinder;" onclick="linkTargetFinder.run()" /&gt;
&lt;/statusbar&gt;</code></pre>
<p>And at the end, we add a button to the Firefox toolbar:</p>
<pre class="code"><code>&lt;toolbarpalette id="BrowserToolbarPalette"&gt;
	&lt;toolbarbutton id="link-target-finder-toolbar-button" label="Link Target Finder" tooltiptext="&#038;runlinktargetfinder;" oncommand="linkTargetFinder.run()"/&gt;
&lt;/toolbarpalette&gt;</code></pre>
<p>Note that you need to go to View &gt; Toolbars &gt; Customize&#8230; to add your button to the visible toolbar.</p>
<p>In the above examples, you might have noticed the <code>&#038;runlinktargetfinder;</code> code. That is used for localizing text, and its translation can be found in the <code>locale</code> folder. More on that later.</p>
<p>Another thing to notice, which can be tricky at first, is that some ids and classes for XUL elements actually have meaning for its display, stemming from core Firefox code. Make sure to read the <a href="https://developer.mozilla.org/en/XUL_Reference">XUL Reference</a> thoroughly for the elements you&#8217;re using.</p>
<p>If you want to use regular <acronym title="HyperText Markup Language">HTML</acronym> elements instead of/together with XUL, you can include the <acronym title="eXtensible HyperText Markup Language - HTML reformulated as XML">XHTML</acronym> definition in your root element, and then include any <acronym title="HyperText Markup Language">HTML</acronym> element with the <code>html:</code> prefix. Like this:</p>
<pre class="code"><code>&lt;overlay id="sample" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:<acronym title="HyperText Markup Language">HTML</acronym>="http://www.w3.org/1999/xhtml"&gt;

&lt;html:input type="submit" value="Send" /&gt;
</code></pre>
<h4><code><span class="lowercase">o</span>ptions.xul</code></h4>
<p>This file is used for the options/preferences dialog for your extension, and its path is pointed out in the <code>install.rdf</code> file in the <code>Description/em:optionsURL</code> node. The complete options file for our extension looks like this:</p>
<pre class="code"><code>&lt;?xml version="1.0"?&gt;
&lt;?xml-stylesheet href="chrome://global/skin/" type="text/css"?&gt;

&lt;prefwindow
     title="Link Target Finder Preferences"
     xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"&gt;

	&lt;prefpane label="Link Target Finder Preferences"&gt;
		&lt;preferences&gt;
			&lt;preference id="link-target-finder-autorun" name="extensions.linktargetfinder.autorun" type="bool"/&gt;

		&lt;/preferences&gt;

		&lt;groupbox&gt;
			&lt;caption label="Settings"/&gt;
			&lt;grid&gt;
				&lt;columns&gt;
					&lt;column flex="4"/&gt;

					&lt;column flex="1"/&gt;
				&lt;/columns&gt;
				&lt;rows&gt;
					&lt;row&gt;
						&lt;label control="autorun" value="Autorun"/&gt;
						&lt;checkbox id="autorun" preference="link-target-finder-autorun"/&gt;

					&lt;/row&gt;
				&lt;/rows&gt;
			&lt;/grid&gt;
		&lt;/groupbox&gt;	

	&lt;/prefpane&gt;

&lt;/prefwindow&gt;</code></pre>
<p>Again, some regular <acronym title="eXtensible Markup Language">XML</acronym> information and styling of the content. It then uses some XUL to layout the content of the preferences dialog. The interesting part here, though, is connecting the user input to the actual settings for the extension (those settings are to be found in the <code>prefs.js</code> file, mentioned in detail below).</p>
<p>To start with, you create a <code>preferences</code> group in the <code>options.xul</code> file with your desired preferences. Then, give each preference an id and connect it to the extension&#8217;s real preferences with the <code>name</code> attribute:</p>
<pre class="code"><code>&lt;preferences&gt;
	&lt;preference id="link-target-finder-autorun" name="extensions.linktargetfinder.autorun" type="bool"/&gt;
&lt;/preferences&gt;</code></pre>
<p>Then you create an element and add a <code>preference</code> attribute to it, pointing to the before-chosen <code>id</code>attribute for the preference in the <code>preferences</code> group. It will then automatically connect its value to that specific preference.</p>
<pre class="code"><code>&lt;checkbox id="autorun" preference="link-target-finder-autorun"/&gt;</code></pre>
<p>Note that you don&#8217;t need to add an OK button for the dialog &#8211; for instance, on Macs there won&#8217;t be one while it&#8217;s automatically added for Windows users. All about system compatibility, my friends.</p>
<h4><code><span class="lowercase">l</span>inkTargetFinder.js</code></h4>
<p>If you&#8217;re like me, this is where you will feel at home. Good ol&#8217; JavaScript code. <img src='http://www.robertnyman.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley'> </p>
<p>What&#8217;s nice here is that you can script any element in the XUL <em>and</em> any element in the <acronym title="HyperText Markup Language">HTML</acronym> content window as well. All you need to access the content window is to precede your document call with the <code>content</code> keyword, like this:</p>
<pre class="code"><code><strong>content</strong>.document.getElementsByTagName("a");</code></pre>
<p>Here&#8217;s the complete code of the <code>linkTargetFinder.js</code> file:</p>
<pre class="code"><code>var linkTargetFinder = function () {
	var prefManager = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
	return {
		init : function () {
			gBrowser.addEventListener("load", function () {
				var autoRun = prefManager.getBoolPref("extensions.linktargetfinder.autorun");
				if (autoRun) {
					linkTargetFinder.run();
				}
			}, false);
		},

		run : function () {
			var head = content.document.getElementsByTagName("head")[0],
				style = content.document.getElementById("link-target-finder-style"),
				allLinks = content.document.getElementsByTagName("a"),
				foundLinks = 0;

			if (!style) {
				style = content.document.createElement("link");
				style.id = "link-target-finder-style";
				style.type = "text/css";
				style.rel = "stylesheet";
				style.href = "chrome://linktargetfinder/skin/skin.css";
				head.appendChild(style);
			}	

			for (var i=0, il=allLinks.length; i&lt;il; i++) {
				elm = allLinks[i];
				if (elm.getAttribute("target")) {
					elm.className += ((elm.className.length &gt; 0)? " " : "") + "link-target-finder-selected";
					foundLinks++;
				}
			}
			if (foundLinks === 0) {
				alert("No links found with a target attribute");
			}
			else {
				alert("Found " + foundLinks + " links with a target attribute");
			}
		}
	};
}();
window.addEventListener("load", linkTargetFinder.init, false);</code></pre>
<p>While it&#8217;s a fair bit of code, it is also very basic. When the window loads, it runs the <code>init</code> method of the <code>linkTargetFinder</code> object. If the preference <code>autorun</code> is set to true, it calls its <code>run</code>  method immediately. Otherwise, it will only be called when the toolbar button, menu item or statusbar icon is clicked. This happens through the <code>oncommand</code> attribute on the elements in the <code>browser.xul</code> file.</p>
<p>The code in the <code>run</code> method is pretty straight-forward. It adds a <acronym title="Cascading Style Sheets">CSS</acronym> file from the extensions chrome folder to the current document, finds all links in it, loops through them and checks if they have a <code>target</code> attribute, counts those, highlights them and alerts you with the number of hits.</p>
<p>As you can see, there&#8217;s a pointer in the code to something called <code>gBrowser</code>. That is how to get a reference to the current web browser, and you could also use <code>getBrowser()</code> as well. Note that this sort of code is only available from within the XUL context of the web browser. More information and options can be found in <a href="https://developer.mozilla.org/en/Code_snippets/Tabbed_browser">Tabbed Browser.</a></p>
<p>The only unusual part for a JavaScript is the variable <code>prefManager</code>, which connects to Firefox preference manager, and later gets the <code>autorun</code> preference with the help of this code:</p>
<pre class="code"><code>var autoRun = prefManager.getBoolPref("extensions.linktargetfinder.autorun");</code></pre>
<p>The three types of extension preferences are string, integer and boolean, and the six methods to work with them are:</p>
<ul>
<li><code>getBoolPref()</code></li>
<li><code>setBoolPref()</code></li>
<li><code>getCharPref()</code></li>
<li><code>setCharPref()</code></li>
<li><code>getIntPref()</code></li>
<li><code>setIntPref()</code></li>
</ul>
<h3><span class="lowercase">d</span>efaults folder</h3>
<p>Within the <code>defaults</code> folder, you create a <code>preferences</code> folder and in that one a file named <code>pref.js</code>. This is used for the preferences you want to use for your extension, and looks like this:</p>
<pre class="code"><code>pref("extensions.linktargetfinder.autorun", false);</code></pre>
<h3><span class="lowercase">l</span>ocale folder</h3>
<p>Used for localization. In our case here, we just have one child folder for <code>en-US</code> content, but it can be easily extended. That folder has a file named <code>translations.dtd</code>, which contains translations for entities used in XUL files. Our file looks like this:</p>
<pre class="code"><code>&lt;!ENTITY runlinktargetfinder "Run Link Target Finder"&gt;</code></pre>
<p>Remember <code>&#038;runlinktargetfinder;</code> in the <code>browser.xul</code> file? This is where it gets its translation.</p>
<h3><span class="lowercase">s</span>kin folder</h3>
<p>Now when we have all functionality in place, let&#8217;s make things a little more pretty (just a little, ok?). In our <code>skin</code> folder, we have three files: <code>skin.css</code>, <code>status-bar.png</code> and <code>toolbar-large.png</code>. The images are, naturally, used for the toolbar and statusbar respectively.</p>
<p>The <acronym title="Cascading Style Sheets">CSS</acronym> in <code>skin.css</code> is used for setting the image for the toolbar, the size and space for the statusbar icon and the highlight look of links with a <code>target</code> attribute. The code looks like this:</p>
<pre class="code"><code>#link-target-finder-toolbar-button {
	list-style-image: <acronym title="Uniform Resource Locator">URL</acronym>("chrome://linktargetfinder/skin/toolbar-large.png");
}

#link-target-finder-status-bar-icon {
	width: 83px;
	margin: 0 5px;
}

.link-target-finder-selected {
	outline: 2px solid red !important;
}</code></pre>
<h2>Packaging and installing</h2>
<p>Firefox extensions are delivered like XPI files, and those are basically just ZIP files with another extension. Therefore, when you&#8217;re finished with your extension, all you need to do is ZIP your files together and give it an XPI extension. Note: do <em>not</em> ZIP the containing folder for your extension, just its contents (<code>chrome</code> folder, <code>chrome.manifest</code> and <code>install.rdf</code> files etc).</p>
<p>Once you have your XPI file, you can just drag and drop it into Firefox, and it will automatically install.</p>
<h3>Packaging with Windows</h3>
<p>Select all the contents of your extension folder, right-click and choose <code>Send To &gt; Compressed (Zipped) Folder</code>. Rename it to <code>.xpi</code> instead of <code>.zip</code> and you&#8217;re done!</p>
<h3>Packaging with Mac</h3>
<p>Open the Terminal, navigate to your extension with the <code><span class="lowercase"><acronym title="Compact Disk">CD</acronym></span></code> command and then type in <code>zip -r LinkTargetFinder.xpi *</code>. Ta daa!</p>
<h3>Packaging with Linux</h3>
<p>Open a terminal, get to your extension folder, and type in <code>zip -r LinkTargetFinder.xpi *</code> All done!</p>
<h2>Distribution of your extension</h2>
<p>There are two options of distributing your extension. Either use <a href="http://addons.mozilla.org/">addons.mozilla.org</a> or host it yourself. If you do it yourself, you can specify an <code>updateURL</code> in your <code>install.rdf</code> file, but note that since Firefox 3 it has to be a secure location, e.g. through <acronym title="Secure Sockets Layer (a security protocol)">SSL</acronym> or similar.</p>
<p>Personally, I&#8217;d recommend addons.mozilla.org for greater reach, auto-update pushing and statistics. The downside of it, though, is that the review process can take quite some time for your extension to get an approval. Before that it can still be downloaded as an experimental add-on, but people need to have an addons.mozilla account and log in to do so.</p>
<p>To make sure it doesn&#8217;t take longer than necessary, I recommend reading <a href="http://blog.mozilla.com/addons/2009/01/14/successfully-getting-your-addon-reviewed/"><br />
Successfully Getting your Addon Reviewed</a>.</p>
<h2>Downloads</h2>
<p>All the code I&#8217;ve created here is available both as a ZIP file of everything, so you can start experimenting, change stuff and see what happens. It is also available as an XPI file, which you can install in your Firefox just to test the functionality (drag and drop it into Firefox).</p>
<ul>
<li><a href="http://www.robertnyman.com/extensions/LinkTargetFinder.zip">Download Link Target Finder code as a ZIP file</a>.</li>
<li><a href="http://www.robertnyman.com/extensions/LinkTargetFinder.xpi">Download Link Target Finder as an XPI file</a>.</li>
</ul>
<h2>Happy extension developing!</h2>
<p>I hope this has been a good, albeit long, introduction to Firefox extension development and that it has helped you to grasp concepts you hadn&#8217;t gotten full control over yet. Good luck, and don&#8217;t hesitate to ask if you have any questions!</p>
<p><a href="http://sharethis.com/item?&wp=2.8.6&amp;publisher=7e0eb025-1057-4238-a77c-a634ef8a9d63&amp;title=How+to+develop+a+Firefox+extension&amp;url=http%3A%2F%2Fblog.mozilla.com%2Faddons%2F2009%2F01%2F28%2Fhow-to-develop-a-firefox-extension%2F">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.com/addons/2009/01/28/how-to-develop-a-firefox-extension/feed/</wfw:commentRss>
		<slash:comments>36</slash:comments>
		</item>
		<item>
		<title>Know Thy Add-on User</title>
		<link>http://blog.mozilla.com/addons/2009/01/20/know-thy-add-on-user/</link>
		<comments>http://blog.mozilla.com/addons/2009/01/20/know-thy-add-on-user/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 17:17:13 +0000</pubDate>
		<dc:creator>rbango</dc:creator>
				<category><![CDATA[developers]]></category>
		<category><![CDATA[guest posts]]></category>

		<guid isPermaLink="false">http://blog.mozilla.com/addons/?p=263</guid>
		<description><![CDATA[Mark Cramer is a guest writer for the AMO blog. He is CEO of SurfCanyon, the creators of the SurfCanyon Firefox add-on.
Creating software in a vacuum is incredibly difficult. While all add-on developers have a general idea of the value they’d like to deliver to their users, without copious and constant feedback it’s like flying [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "Know Thy Add-on User", url: "http://blog.mozilla.com/addons/2009/01/20/know-thy-add-on-user/" });</script>]]></description>
			<content:encoded><![CDATA[<p><em>Mark Cramer is a guest writer for the AMO blog. He is CEO of <a href="http://www.surfcanyon.com">SurfCanyon</a>, the creators of the <a href="https://addons.mozilla.org/en-US/firefox/addon/6549">SurfCanyon Firefox add-on</a>.</em></p>
<p>Creating software in a vacuum is incredibly difficult. While all add-on developers have a general idea of the value they’d like to deliver to their users, without copious and constant feedback it’s like flying in the dark. Knowing what your users want and what they don’t find interesting is incredibly important. It also helps to know what, if anything, they’re seeking and how they perceive what it is that your add-on does and how it works. Even if you’re delivering a valuable add-on, compatibility can also be a major issue since end users’ machines all look different and testing the limitless combinations of add-ons, desktop software and personal configurations is virtually impossible.</p>
<p>Listening and reacting to the people in the trenches can therefore make the difference between success and failure.</p>
<p>While it may seem daunting, you can take heart in the fact that users, when nurtured properly, can be an incredible resource for feedback, helpful advice, technical assistance and, on many occasions, even quality assurance. They can certainly be abrasive sometimes, but with a thick skin you can get tremendous value out of their “tough love.” In the spirit of trying to share a few thoughts, here are some humbly submitted, common sense ideas, along with a few tricks, that might help make the difference.<br />
 <strong><br />
1. Actively Seek Feedback</strong></p>
<p>The AMO page for every add-on enables users to leave comments. Check once a day for new feedback, post responses whenever appropriate and, when possible, follow up with the commenter if more information is needed. As a general rule, when communicating with users, keep it positive and constructive and control your emotions. While on occasion it might seem otherwise, malicious intent is extremely rare. Most people want to help, so always respond with that in mind.</p>
<p>The AMO page, however, should only be the beginning. For most add-ons, the percentage of people who download and then return to leave a comment is small. Finding other ways to elicit feedback is therefore imperative. Nevertheless, the challenge can be particularly difficult since it is not obviously when, where or how to ask for feedback. You could try to incorporate a feedback mechanism into the add-ons itself, but be careful about being overly intrusive. Real estate is very precious and most people don’t want things popping up at them. We have found, however, that one excellent way to resolve these issues is with an uninstall survey.</p>
<p>A survey page can be launched using an uninstall script. For actually running the survey and collecting the data, SurveyMonkey provides an excellent service. If you don’t mind having to erase the responses and start over every time you get 100 replies, you could run it for free. Keeping the survey very short will help conversion greatly. You might even consider one simple multiple-choice question: “Please tell us why you are uninstalling this add-on.” Allow for an open-ended response and consider making one of the answers “Temporary issue – I’ll be back!” While few people will leave an email, make sure to ask for it as those that do leave one will normally turn out to be very helpful.</p>
<p>Remember to keep your uninstall survey up to date. The open-ended responses will enable users to give whatever feedback they want, but if you use multiple-choice questions, make sure to keep the selections current with the functionality of your add-on. Moving the questions and responses around a bit will also help to remove “position bias” – people have a tendency to select the first choices.</p>
<p>We’ve found that the moment the user chooses to uninstall an add-on turns out to be an opportune time to request feedback. He or she has had an opportunity to evaluate the application and has just made a decision: to uninstall. Unfortunately this doesn’t afford a lot of opportunity for positive feedback (people who love the application will generally leave it installed and thus won’t ever see the survey, so you’ll have to find another mechanism for getting the positive reviews), but hearing from people who uninstall is what you really need to improve your add-on.</p>
<p><strong>2. Meticulously Pursue All Leads</strong></p>
<p>The majority of feedback, whether through the AMO page, the add-on’s website or the uninstall script, will not include contact information for the user. For obvious reasons, people are very reluctant to share their emails. In many cases, this can make the job of debugging or improving your application very difficult, especially when the feedback isn’t anything more than “it didn’t work.” Therefore, whenever a user is gracious enough to provide contact information along with the feedback, it’s important to capitalize on that opportunity to learn everything that you can. People who submit their email addresses are doing so for follow up, so don’t be afraid to contact them. That being said, restrict the communication to the subject matter at hand (their feedback) and don’t send them sales pitches or add them to any mailing lists.</p>
<p>Take pains to profusely express gratitude for their feedback at every opportunity. Pointing out how valuable their contributions are to resolving issues and improving your application, and then thanking them for their effort, turns out to be very helpful. It’s also the right thing to do. As a consequence, we’ve found that some people can be incredibly generous with their time and assistance. In order to debug issues, we’ve had people create new profiles for testing, uninstall and deactivate add-ons one at a time to find compatibility problems and install testing software as well as beta versions of our add-on. We even had one user send a video in order to demonstrate a particular thing he was experiencing.</p>
<p>Many people love problem solving and will look at providing you with useful information as a personal challenge. By offering them avenues for giving feedback, demonstrating respect for their time and offering them encouragement, AMO users will be an amazingly valuable resource for improving your add-on.</p>
<p><strong>3. Relentlessly Make Improvements</strong></p>
<p>Now that you’ve got the feedback and have an army of users helping you out, it’s naturally important to implement improvements as a result. New features and enhancements can take time to realize, but responding to your users should always be a top priority. That being said, just because one user asks for something doesn’t mean that you need to drop everything to deliver it, but with enough feedback you’ll begin to identify patterns. Keep in mind that if five people give similar feedback there might be hundreds out there that are thinking the same thing.</p>
<p>Compatibility issues can also be tricky to resolve since they typically involve other people’s software, although once again, other developers can be very helpful. If you reach out to developers with whom you have issues you’ll most likely find that most are eager to provide assistance. Add-on incompatibility issues work both ways, so it’s in everyone’s interest to work together. If another add-on developer were to contact you, I’m sure you’d do the same. Even if other developers are unable to modify their application in a timely fashion, perhaps they could help suggest a temporary work-around. We’ve found that the odds of not getting some form of assistance is very small and that most developers are enthusiastic about collaborating.</p>
<p>Finally, don’t hesitate to reach out to the AMO community for technical assistance. Many issues relating to the development of add-ons are tricky and a lot of the “art” is still being fashioned. Post questions to forums or send emails to other add-on developers. If you have a little bit of money to dedicate to something particular, RentACoder can be a cost-effective means of finding vetted developers with very specific talents.</p>
<p>I’m sure there are many other techniques for working with AMO users, but these suggestions might be a helpful place to get started. If other people have ideas, we’d love to hear them, so please post below. Everyone is always looking for ways to improve!</p>
<p><a href="http://sharethis.com/item?&wp=2.8.6&amp;publisher=7e0eb025-1057-4238-a77c-a634ef8a9d63&amp;title=Know+Thy+Add-on+User&amp;url=http%3A%2F%2Fblog.mozilla.com%2Faddons%2F2009%2F01%2F20%2Fknow-thy-add-on-user%2F">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.com/addons/2009/01/20/know-thy-add-on-user/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Firefox Extensions: Global Namespace Pollution</title>
		<link>http://blog.mozilla.com/addons/2009/01/16/firefox-extensions-global-namespace-pollution/</link>
		<comments>http://blog.mozilla.com/addons/2009/01/16/firefox-extensions-global-namespace-pollution/#comments</comments>
		<pubDate>Fri, 16 Jan 2009 16:13:29 +0000</pubDate>
		<dc:creator>rbango</dc:creator>
				<category><![CDATA[documentation]]></category>
		<category><![CDATA[general]]></category>
		<category><![CDATA[guest posts]]></category>
		<category><![CDATA[tutorials]]></category>

		<guid isPermaLink="false">http://blog.mozilla.com/addons/?p=258</guid>
		<description><![CDATA[Reposted with permission from Jan Odvarko (AKA Honza):
I have been recently asked by couple of developers how to properly design architecture of a Firefox extension. The first thing that immediately came to my mind at that point was a problem with global variables defined by extensions in ChromeWindow scope.
This problem can easily cause collisions among [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "Firefox Extensions: Global Namespace Pollution", url: "http://blog.mozilla.com/addons/2009/01/16/firefox-extensions-global-namespace-pollution/" });</script>]]></description>
			<content:encoded><![CDATA[<p><em>Reposted with permission from <a href="http://www.softwareishard.com/blog/planet-mozilla/firefox-extensions-global-namespace-pollution/">Jan Odvarko (AKA Honza)</a>:</em></p>
<p>I have been recently asked by couple of developers how to properly design architecture of a Firefox extension. The first thing that immediately came to my mind at that point was a problem with global variables defined by extensions in <a href="http://www.xulplanet.com./references/objref/ChromeWindow.html">ChromeWindow</a> scope.</p>
<p>This problem can easily cause collisions among various extensions. Something that should be always avoided (and is also part of AMO <a href="http://www.cesaroliveira.net/tea/archives/51">review</a> process) since this kind of issues is very hard to find. Yes, global variables are still <a href="http://yuiblog.com./blog/2006/06/01/global-domination/">evil</a>, especially in OOP world.</p>
<p>I don’t want to describe how to develop a new extension from scratch. For this there is already bunch of <a href="https://developer.mozilla.org/en/Building_an_Extension">detailed</a> <a href="http://kb.mozillazine.org/Getting_started_with_extension_development">articles</a>. I am rather concentrating on effective tactics how to make Firefox extension architecture maintainable and well designed.</p>
<p>So, read more if you are interested…</p>
<p><span id="more-27"></span></p>
<h3>Namespace Architecture</h3>
<p>Defining global variables is a way how to risk collisions with other extensions. I think that creating just one global variable per extension that is unique enough (composed e.g. from the name of the extension, domain URL, etc.) is sufficient strategy how to avoid undesirable collisions.</p>
<p>The architecture for namespaces used in Firebug, is based (more or less) on well known <a href="http://yuiblog.com/blog/2007/06/12/module-pattern/">module pattern</a> (originally described by <a href="http://en.wikipedia.org./wiki/Douglas_Crockford">Douglas Crockford</a>). It’s really simple and transparent so, I hadn’t understand how it actually works for a long time. I believe other extension developers can utilize this approach as well.</p>
<p>The basic idea is to wrap content of every JS file into its own scope that is represented by a function so, there are no global objects. See following snippet.</p>
<div class="dean_ch" style="white-space: nowrap;"><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></p>
<p><span class="co1">// TODO: entire JS code in this file is here</span><br />
<span class="br0">&#125;</span></div>
<p>This is what I am going to call a <em>namespace</em>.</p>
<p>The first question is how to ensure that the function is actually called and the code executed at the right time. The second question is how to share objects among more files (see <em>Sharing among namespaces</em> chapter below). Firebug solves this by registering every namespace and executing all when Firefox chrome UI is ready. See modified example.</p>
<div class="dean_ch" style="white-space: nowrap;">myExtension.<span class="me1">ns</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></p>
<p><span class="co1">// TODO: entire JS code in this file is here</span><br />
<span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
<p>The namespace (regular function) is passed as a parameter to <em>myExtension.ns</em> function. The <em>myExtension</em> object is the only global object that is defined by the extension. This is the singleton object that represents entire extension. Don’t worry if the name is long, there’ll be a shortcut for it (in real application it could be e.g. <em>comSoftwareIsHardMyExtension</em>).</p>
<p>The <em>ns</em> function is simple. Every function is pushed into an array.</p>
<div class="dean_ch" style="white-space: nowrap;"><span class="kw2">var</span> namespaces = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</p>
<p><span class="kw1">this</span>.<span class="me1">ns</span> = <span class="kw2">function</span><span class="br0">&#40;</span>fn<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> ns = <span class="br0">&#123;</span><span class="br0">&#125;</span>;</p>
<p>&nbsp; &nbsp; namespaces.<span class="me1">push</span><span class="br0">&#40;</span>fn, ns<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="kw1">return</span> ns;<br />
<span class="br0">&#125;</span>;</div>
<p>Actual execution of registered namespaces (functions) is only matter of calling <em>apply</em> on them.</p>
<div class="dean_ch" style="white-space: nowrap;"><span class="kw1">this</span>.<span class="me1">initialize</span> = <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i=<span class="nu0">0</span>; i&lt;namespaces.<span class="me1">length</span>; i+=<span class="nu0">2</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> fn = namespaces<span class="br0">&#91;</span>i<span class="br0">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> ns = namespaces<span class="br0">&#91;</span>i<span class="nu0">+1</span><span class="br0">&#93;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; fn.<span class="me1">apply</span><span class="br0">&#40;</span>ns<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span>;</div>
<p>Now, let’s put all together and see how the global extension (singleton) object is defined and initialized.</p>
<p>The following source code snippet represents a <em>browserOverlay.js</em> file that is included into an overlay (<em>browserOverlay.xul</em>)</p>
<div class="dean_ch" style="white-space: nowrap;"><span class="co1">// The only global object for this extension.</span><br />
<span class="kw2">var</span> myExtension = <span class="br0">&#123;</span><span class="br0">&#125;</span>;</p>
<p><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="co1">// Registration</span><br />
<span class="kw2">var</span> namespaces = <span class="br0">&#91;</span><span class="br0">&#93;</span>;</p>
<p><span class="kw1">this</span>.<span class="me1">ns</span> = <span class="kw2">function</span><span class="br0">&#40;</span>fn<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">var</span> ns = <span class="br0">&#123;</span><span class="br0">&#125;</span>;<br />
&nbsp; &nbsp; namespaces.<span class="me1">push</span><span class="br0">&#40;</span>fn, ns<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="kw1">return</span> ns;<br />
<span class="br0">&#125;</span>;<br />
<span class="co1">// Initialization</span><br />
<span class="kw1">this</span>.<span class="me1">initialize</span> = <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw2">var</span> i=<span class="nu0">0</span>; i&lt;namespaces.<span class="me1">length</span>; i+=<span class="nu0">2</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> fn = namespaces<span class="br0">&#91;</span>i<span class="br0">&#93;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> ns = namespaces<span class="br0">&#91;</span>i<span class="nu0">+1</span><span class="br0">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; fn.<span class="me1">apply</span><span class="br0">&#40;</span>ns<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p><span class="br0">&#125;</span>;<br />
<span class="co1">// Clean up</span><br />
<span class="kw1">this</span>.<span class="me1">shutdown</span> = <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; window.<span class="me1">removeEventListener</span><span class="br0">&#40;</span><span class="st0">&quot;load&quot;</span>, myExtension.<span class="me1">initialize</span>, <span class="kw2">false</span><span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; window.<span class="me1">removeEventListener</span><span class="br0">&#40;</span><span class="st0">&quot;unload&quot;</span>, myExtension.<span class="me1">shutdown</span>, <span class="kw2">false</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span>;<br />
<span class="co1">// Register handlers to maintain extension life cycle.</span><br />
window.<span class="me1">addEventListener</span><span class="br0">&#40;</span><span class="st0">&quot;load&quot;</span>, myExtension.<span class="me1">initialize</span>, <span class="kw2">false</span><span class="br0">&#41;</span>;</p>
<p>window.<span class="me1">addEventListener</span><span class="br0">&#40;</span><span class="st0">&quot;unload&quot;</span>, myExtension.<span class="me1">shutdown</span>, <span class="kw2">false</span><span class="br0">&#41;</span>;<br />
<span class="br0">&#125;</span><span class="br0">&#41;</span>.<span class="me1">apply</span><span class="br0">&#40;</span>myExtension<span class="br0">&#41;</span>;</div>
<p>As I mentioned above, there is just one global object <em>myExtension</em>.</p>
<p>To summarize, the object implements following methods:</p>
<ul>
<li><em>ns</em> &#8211; register a new namespace.</li>
<li><em>initialize</em> &#8211; initialize all namespaces.</li>
<li><em>shutdown</em> &#8211; clean up.</li>
</ul>
<p>And also, the code makes sure that <em>initialize</em> and <em>shutdown</em> methods are called at the right time. This is why event handlers are registered.</p>
<p>The <em>browserOverlay.xul</em> looks as follows now.</p>
<div class="dean_ch" style="white-space: nowrap;"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span><span class="re2">?&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;overlay</span> <span class="re0">xmlns</span>=<span class="st0">&quot;http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul&quot;</span><span class="re2">&gt;</span></span></p>
<p>&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;script</span> <span class="re0">src</span>=<span class="st0">&quot;chrome://namespace/content/browserOverlay.js&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;application/x-javascript&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;script</span> <span class="re0">src</span>=<span class="st0">&quot;chrome://namespace/content/Module1.js&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;application/x-javascript&quot;</span><span class="re2">/&gt;</span></span></p>
<p>&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;script</span> <span class="re0">src</span>=<span class="st0">&quot;chrome://namespace/content/Module2.js&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;application/x-javascript&quot;</span><span class="re2">/&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;/overlay<span class="re2">&gt;</span></span></span></div>
<p>And the <em>Module1.js</em> and <em>Module2.js</em> files are both the same.</p>
<div class="dean_ch" style="white-space: nowrap;">myExtension.<span class="me1">ns</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="co1">// TODO: entire JS code in this file is here</span><br />
<span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
<h3>Sharing among namespaces</h3>
<p>Now, when we have our script within a local scope(s), let’s answer the question how to share functionality and data among individual namespaces. The general idea is to use the one global object we have &#8211; <em>myExtension</em>.</p>
<p>First of all, see the following source code (<em>lib.js</em> file).</p>
<div class="dean_ch" style="white-space: nowrap;">myExtension.<span class="me1">LIB</span> = <span class="br0">&#123;</span></p>
<p>&nbsp; &nbsp; <span class="co1">// Shared APIs</span><br />
&nbsp; &nbsp; getCurrentURI: <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> window.<span class="me1">location</span>.<span class="me1">href</span>;</p>
<p>&nbsp; &nbsp; <span class="br0">&#125;</span>,</p>
<p>&nbsp; &nbsp; <span class="co1">// Extension singleton shortcut</span><br />
&nbsp; &nbsp; theApp: myExtension,</p>
<p>&nbsp; &nbsp; <span class="co1">// XPCOM shortcuts</span><br />
&nbsp; &nbsp; Cc: Components.<span class="me1">classes</span>,</p>
<p>&nbsp; &nbsp; Ci: Components.<span class="me1">interfaces</span>,</p>
<p>&nbsp; &nbsp; <span class="co1">// Etc.</span><br />
<span class="br0">&#125;</span>;</div>
<p>You can see that a new LIB property is created within our global <em>myExtension</em> singleton. This objects represents a library of functions that should be shared among all modules in our extension. At this point, you can also get inspiration from <a href="http://en.wikipedia.org./wiki/Java_package">Java Packaging</a> and create whole tree of namespaces within the global singleton (just like e.g. <a href="http://developer.yahoo.com/yui/yahoo/">YUI</a> does)</p>
<p>The <em>lib.js</em> file is included in <em>browserOvelay.xul</em> (just after <em>browserOverlay.js</em>)</p>
<div class="dean_ch" style="white-space: nowrap;"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span><span class="re2">?&gt;</span></span></p>
<p><span class="sc3"><span class="re1">&lt;overlay</span> <span class="re0">xmlns</span>=<span class="st0">&quot;http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul&quot;</span><span class="re2">&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;script</span> <span class="re0">src</span>=<span class="st0">&quot;chrome://myextension/content/browserOverlay.js&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;application/x-javascript&quot;</span><span class="re2">/&gt;</span></span></p>
<p>&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;script</span> <span class="re0">src</span>=<span class="st0">&quot;chrome://myextension/content/lib.js&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;application/x-javascript&quot;</span><span class="re2">/&gt;</span></span><br />
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;script</span> <span class="re0">src</span>=<span class="st0">&quot;chrome://myextension/content/Module1.js&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;application/x-javascript&quot;</span><span class="re2">/&gt;</span></span></p>
<p>&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;script</span> <span class="re0">src</span>=<span class="st0">&quot;chrome://myextension/content/Module2.js&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;application/x-javascript&quot;</span><span class="re2">/&gt;</span></span><br />
<span class="sc3"><span class="re1">&lt;/overlay<span class="re2">&gt;</span></span></span></div>
<p>Let’s also improve our module script a bit.</p>
<div class="dean_ch" style="white-space: nowrap;">myExtension.<span class="me1">ns</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">with</span> <span class="br0">&#40;</span>myExtension.<span class="me1">LIB</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="co1">// TODO: entire JS code in this file is here</span></p>
<p><span class="kw2">var</span> moduleVariable = <span class="st0">&quot;Accessible only from withing this module&quot;</span>;</p>
<p>dump<span class="br0">&#40;</span><span class="st0">&quot;myExtension.Module initialization &quot;</span> + getCurrentURI<span class="br0">&#40;</span><span class="br0">&#41;</span> + <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span>;</p>
<p><span class="br0">&#125;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
<p>By utilizing <strong>with</strong> statement we can simply access all library functions as if they would be a global functions.</p>
<p>In case we want to access our singleton global object we can also utilize <em>theApp</em> shortcut (useful especially if the name is long) as follows:</p>
<div class="dean_ch" style="white-space: nowrap;">myExtension.<span class="me1">ns</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="kw1">with</span> <span class="br0">&#40;</span>myExtension.<span class="me1">LIB</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="co1">// TODO: entire JS code in this file is here</span></p>
<p>theApp.<span class="me1">sharedValue</span> = <span class="st0">&quot;A new shared property&quot;</span>;</p>
<p><span class="br0">&#125;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
<p>Here is how the architecture look like from UML perspective.</p>
<p><img src="http://blog.mozilla.com/addons/files/2009/01/namespaces-300x225.png" alt="Namespaces within a Firefox extension." align="center" /></p>
<p>Download example extension <a href="http://www.softwareishard.com/downloads/examples/extensions/namespaces-20090115.xpi">here</a>.</p>
<p><a href="http://sharethis.com/item?&wp=2.8.6&amp;publisher=7e0eb025-1057-4238-a77c-a634ef8a9d63&amp;title=Firefox+Extensions%3A+Global+Namespace+Pollution&amp;url=http%3A%2F%2Fblog.mozilla.com%2Faddons%2F2009%2F01%2F16%2Ffirefox-extensions-global-namespace-pollution%2F">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.com/addons/2009/01/16/firefox-extensions-global-namespace-pollution/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Successfully Getting your Addon Reviewed</title>
		<link>http://blog.mozilla.com/addons/2009/01/14/successfully-getting-your-addon-reviewed/</link>
		<comments>http://blog.mozilla.com/addons/2009/01/14/successfully-getting-your-addon-reviewed/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 15:54:24 +0000</pubDate>
		<dc:creator>rbango</dc:creator>
				<category><![CDATA[developers]]></category>
		<category><![CDATA[guest posts]]></category>
		<category><![CDATA[add-on reviews]]></category>
		<category><![CDATA[editors]]></category>
		<category><![CDATA[policy]]></category>

		<guid isPermaLink="false">http://blog.mozilla.com/addons/?p=253</guid>
		<description><![CDATA[Thanks to AMO Editor Cesar Oliveira for allowing us to repost this here:
As the addon review queue grows beyond 600 nominated and updated addons, it is more important than ever to make sure your extension passes review the first time around. Editors have a review guide, and a well hidden but publicly viewable set of [...]<script type="text/javascript">SHARETHIS.addEntry({ title: "Successfully Getting your Addon Reviewed", url: "http://blog.mozilla.com/addons/2009/01/14/successfully-getting-your-addon-reviewed/" });</script>]]></description>
			<content:encoded><![CDATA[<p><em>Thanks to AMO Editor <a href="http://www.cesaroliveira.net/">Cesar Oliveira</a> for allowing us to repost this here:</em></p>
<p>As the addon review queue grows beyond 600 nominated and updated addons, it is more important than ever to make sure your extension passes review the first time around. Editors have a <a href="https://wiki.mozilla.org/Update:Editors/ReviewingGuide">review</a> guide, and a well hidden but publicly <a href="https://addons.mozilla.org/en-US/firefox/pages/policy">viewable set of policies</a>. But here is a quick list of the most cited reasons for addon refusal :</p>
<ol>
<li>Addon should have at least 3 user reviews before being nominated. External reviews count too, but you have to mention them in your nomination message. Softpedia reviews do not count.</li>
<li>Wrap your <a href="http://blogger.ziesemer.com/2007/10/respecting-javascript-global-namespace.html">loose variables</a>. All objects, variables, and anything that your addon makes global should be wrapped to avoid conflicts with other addons.</li>
<li>Look at the error console. Is your extension throwing up javascript errors? Fix it. There are some <a href="https://developer.mozilla.org/en/Setting_up_extension_development_environment">options</a> you can set in about:config to help you with this.</li>
<li>You break functionality in the host application (Firefox, Thunderbird, etc.).</li>
<li>Your extension doesn’t work properly, or showing unexpected results. This is what user reviews are expected to catch, but you really should get someone who wasn’t involved to test and report bugs.</li>
</ol>
<p>There are other less common things that can get you busted too. I’ll just list them here for completeness sake :</p>
<ol>
<li>Including remote javascript/css or other files, anywhere. Include them in your xpi file instead.</li>
<li>CSS warnings on the error console if your submitting a theme.</li>
</ol>
<p>If you have any doubts, check the public policies page linked above.</p>
<p>And don’t ask when your extension will be reviewed in the comments. Because every answer will be the same : When someone gets around to it. It could be sooner if you’d help!</p>
<p><a href="http://sharethis.com/item?&wp=2.8.6&amp;publisher=7e0eb025-1057-4238-a77c-a634ef8a9d63&amp;title=Successfully+Getting+your+Addon+Reviewed&amp;url=http%3A%2F%2Fblog.mozilla.com%2Faddons%2F2009%2F01%2F14%2Fsuccessfully-getting-your-addon-reviewed%2F">ShareThis</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.mozilla.com/addons/2009/01/14/successfully-getting-your-addon-reviewed/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
