• Firefox 4 Add-on Compatibility presentation

    July 7th, 2010 by jorge with 3 comments »

    I’m presenting about Firefox 4 Add-on Compatibility at the Mozilla Summit a little later today. Here are the slides in PDF version for all of those interested.

    Firefox 4 for Add-on Developers

    For now, this is a pretty good reference if you want to start supporting the Firefox 4 betas in your add-ons. I’ll be elaborating on this subject through the following weeks, in the Add-ons Blog.

  • Add-on packaging – Manifests revisited and wiki

    May 25th, 2010 by jorge with 15 comments »

    I’ve been spending some time working on the new wiki for the Add-on Packaging Spec. Here it is.

    At the moment I’m writing the complete manifest file specification, basically copying and adapting the current specifications for install manifests and chrome manifests. I’m pretty much done with the former, and will be adding the latter probably tomorrow.

    After receiving lots of feedback regarding the manifest format, I agreed to take the manifest file the XML way. I followed JJ Barton’s suggestion of using HTML instead of a custom XML format, which leads to a very simple and familiar manifest format, with some very nice visualization options. This is the first time I’ve used the :before pseudo-class and the CSS content property, and I must say that they blew me away, limited as the latter is. Cool stuff.

    If you want to discuss the pros and cons of the HTML manifest format, please fire away in the comments. I will be adding more content to the wiki as the project progresses.

  • Add-on packaging spec, part 3

    May 20th, 2010 by jorge with 5 comments »

    This is a specification for a project that will be implemented for the Google Summer of Code, and it can still change as feedback is received. There are no concrete plans of making this a part of Firefox in the near future. Read my previous post for more info.

    Part 3 – Installation

    Add-on performance has been a hot topic recently, given that add-ons are a significant contributor to slowdowns, specially at startup. One of the reasons I’ve seen mentioned is how extensions are laid out in the file system after installation. The suggestion is to educate developers on how to package add-ons taking performance into account. That’s not a bad approach, but I think it’s easier for developers and more effective in general if the post-install procedure handles performance optimizations. This might even be necessary, considering that different applications and different platforms can have different ways to optimize for performance.

    The add-on installer should package most if not all files into a single, uncompressed JAR file, as suggested in this bug report:

    • Add-ons in the new format should not have internal chrome JARs.
    • All files that can be efficiently read from a JAR file will be moved into a single uncompressed JAR (like a TAR) upon installation. This is a single JAR for all add-ons using the new system. One possible “cheat” to accomplish this is to create a fake add-on install directory, with a single JAR and a generated manifest that includes the information for all add-ons contained in it. This manifest could even be an “old style” chrome.manifest, in case changing chrome resolution rules turns out to be too difficult.
    • Files that can’t be put in the JAR (this is mentioned in the bug report, and I don’t know why this is the case), such as binary libraries and components should ideally be grouped together in the same place where the big JAR will be located. One concern here would be file name collisions and the way these files are automagically loaded from their special folders, which may be hard to overcome. In case this is too difficult, it’s probably best to lay them out like it’s done now: on their separate extension directories.

    From a performance perspective, this is what makes most sense for all platforms as far as I know, so it would be the default and maybe only behavior. However, if different packaging requirements come up for specific platforms, it can and should be implemented, with the great advantage that it will be possible to do so, at least with add-ons using the new system.

    Spec corrections

    • By far, the most debated point in this spec has been the format chosen for the manifest. I’m convinced now, JSON was not the right way to go. I really like John J Barton’s idea of an HTML manifest, so I think I will pursue this approach. It makes sense due to familiarity, IDE support and even skinability. Somebody mentioned that I should also cover update.rdf and McCoy. This will be done in the new XML-based spec, and it should be very straightforward.
    • In part 2 I mentioned that having internal JARs would still be possible. I’m reconsidering this decision. Since the new format is meant to be a fresh start in several regards, I’m thinking it would be a bad idea to drag these old practices back, considering that they would have a negative effect on the post-install process.

    The final project spec will be moved to a wiki, where it makes more sense to have a document that will likely see many iterations and corrections. I will being working on this as soon as possible, and will post a link in this blog once there’s something everybody can look at.

    I will also post updates when there’s more progress on the project.

    Acknowledgements

    • Google, for creating the very cool GSOC and keeping it alive for many years.
    • Gerv, choffman, and all GSOC admins.
    • Hebert Duarte, for volunteering to implement this project.
    • Everyone who has been posting comments and giving me feedback. It’s all very valuable and not a single comment has gone unread.

    Thank you all!

  • Add-on packaging spec, part 2

    May 18th, 2010 by jorge with 8 comments »

    This is a specification for a project that will be implemented for the Google Summer of Code, and it can still change as feedback is received. There are no concrete plans of making this a part of Firefox in the near future. Read my previous post for more info.

    Part 2 – URL resolution

    Here’s a simple chrome.manifest file, as exemplified in part 1:

    content   xulschoolhello              jar:chrome/xulschoolhello.jar!/content/
    skin      xulschoolhello  classic/1.0 jar:chrome/xulschoolhello.jar!/skin/
    locale    xulschoolhello  en-US       jar:chrome/xulschoolhello.jar!/locale/en-US/
    
    overlay chrome://browser/content/browser.xul  chrome://xulschoolhello/content/browserOverlay.xul

    There are two things I find silly about it:

    1. The file and directory structure is too complicated for a simple add-on. It could be simpler, but the form above is the current recommended way of doing things.
    2. If this is the default, recommended way of doing things, then why is it necessary to explicitly declare it?

    This part of the specification aims to remove as much redundancy as possible from chrome (and other) declarations, as well as provide sensible defaults so that simple add-ons are simple to develop.

    The simplest manifest

    Let’s begin with the new manifest file introduced in the previous part of the spec:

    {
      "id" : "helloworld@xulschool.com",
      "name" : "XUL School Hello World",
      "description" : "Welcome to XUL School!",
      "version" : "0.1",
      "authors" : "Appcoast",
      "homepageURL" : "https://developer.mozilla.org/en/XUL_School",
      "type" : "2",
      "targetApplications" : {
        "id" : "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}",
        "minVersion" : "3.0",
        "maxVersion" : "3.6.*"
      },
      "domains" : "xulschoolhello",
      "overlays" : {
        "source" : "chrome://xulschoolhello/content/overlay.xul",
        "target" : "chrome://browser/content/browser.xul"
      }
    }

    A couple of notes before diving in:

    • There’s an ongoing discussion of what format is best for the manifest, JSON or some form of XML or HTML. Examples are being presented as JSON but could change eventually. If you want to join the discussion, please do so in Part 1.
    • The “domains” property is now plural, as it should be. (Thanks Wladimir!)

    The highlighted sections are the equivalent of the chrome.manifest file presented above. The “domains” declaration covers the “content”,  “skin” and “locale” declarations in the old format. However, the file layout also needs to change, since the defaults for the new format are much simpler than in the old one. Here are the default resolutions for all URLs and other special folders:

    • “content” and “skin” URLs default to the root directory, where the manifest file is located. This means that the simplest of add-ons would consist of the manifest file and an overlay file zipped together. Complex add-ons would of course require directory structures in order to keep everything organized, but that’s left to the authors to determine.
    • “locale” URLs are a little more involved. If the author only wishes to ship the add-on in one locale, then the locale files can be located in the root directory, just like “content” and “skin” files. If there are more languages, they can be organized under “/locale/en-US/” and similar. The “locale” directory in the root would have that special meaning, and all directories within it are considered locale folders and are automatically registered. There’s no need for chrome declarations even in this case.
    • “resource” URLs will also default to the root directory, and will use the same domain. In the example extension above, “resource://xulschoolhello/hello.jsm” would point to the “hello.jsm” file in the root of the add-on package.
    • The “components” and “platform” folders will continue to have their special meaning.
    • The default preferences file will be named “defaultPrefs.js” and will also reside in the package root.

    Advanced manifests

    The defaults defined above should be adequate for most add-ons I’ve ever seen (and I’ve seen a lot!), but we can’t leave out add-ons that require more than this. It’s very important that the new system is as flexible as possible for authors, and that add-ons can be migrated to it without requiring significant changes or refactoring.
    First of all, the “domains” attribute can be extended to include declarations similar to old-style manifests. Here’s the equivalent of the first chrome.manifest declarations in the first example:

    "domains" : {
      "name" : "xulschoolhello",
      "content" : {
        "location" : "jar:chrome/xulschoolhello.jar!/content/"
      },
      "skin" : {
        "location" : "jar:chrome/xulschoolhello.jar!/skin/"
      },
      "locale" : {
        "locale" : "en-US",
        "location" : "jar:chrome/xulschoolhello.jar!/locale/en-US/"
      }
    },

    Some notes about this expanded format:

    • “domains” can be an array, in case multiple domains need to be defined.
    • The name of the skin is still redundant, so there’s no need to specify it.
    • “content”, “skin”, “locale” and “resources” can be arrays, to specify multiple entries.
    • “content”, “skin”, “locale” and “resources” support a “flags” attribute, in order to support manifest flags. This attribute can also be specified on overlays, overrides and style declarations, which are not exemplified but are the same as the overlay declaration shown before.

    Moreover, it should be possible to change the locations of any of our “special” files and folders, in order to give developers maximum flexibility. For this, the manifest can have a “locations” attribute, exemplified here:

    "locations" : {
      "defaultPrefs" : "prefs/myPrefs.js",
      "components" : "code/myComponents/",
      "platform" : "code/platform/"
    },
    

    The only file that has a mandated name and location would be the manifest file. The rest can be organized to the authors’ preference, provided they don’t like the defaults and they want to tinker with the manifest.

    Manifest Localization

    Localizing manifests is an arduous task. The most modern way to do it involves adding all the localized information in the manifest file, which isn’t yet supported by the most popular add-on localization community, Babelzilla. Keeping the manifest properly localized becomes a burden to add-on developers, and most don’t even bother.

    The suggested solution in the new system is to take advantage of the existing localization infrastructure. The manifest localization file will default to the location “chrome://firstDeclaredDomain/locale/manifest.properties”, or can be explicitly defined (needs to be a chrome locale URL):

    "localized" : "chrome://xulschoolhello/locale/manifest.properties",
    

    This localized file would hold strings corresponding to the localizable attributes:

    name = Hola Mundo de XUL School
    description = Bienvenido a XUL School!
    translator.1 = Jorge
    translator.2 = Somebody else

    The .1 and .2 suffix is just a way to handle multi-valued attributes.

    Moving this information out of the manifest has one drawback: the add-on installer needs to do some additional effort to show these values during installation, since it will require to figure out the location of the localized file. This isn’t too hard to figure out using the manifest, though, and the advantages outweigh a few additional ms during installation.

    Part 3 of this specification will cover add-on installation and any pending topics. It will also introduce a wiki page where the full spec will be fleshed out and all edge cases will be covered.

  • Add-on packaging spec, part 1

    May 13th, 2010 by jorge with 17 comments »

    This is a specification for a project that will be implemented for the Google Summer of Code, and it can still change as feedback is received. There are no concrete plans of making this a part of Firefox in the near future. Read my previous post for more info.

    Part 1 – The Manifest File

    Most add-ons rely on 2 manifest files: install.rdf and chrome.manifest. The install manifest holds add-on metadata such as its name, description, icon path and compatibility information. The chrome manifest determines where to locate chrome files under different circumstances (OS, application, version, etc.), as well as overlays, skins and locales.

    These files are written in very different text formats, and they are not completely independent from each other. For example, the install manifest uses chrome paths to locate the extension icon, preferences window and about window, if defined. Install manifests also hold localized data which hasn’t been integrated properly into the add-on localization system. It’s also worth noting that the average add-on has very short and simple manifest files, including a significant amount of boilerplate code.

    In order to simplify the packaging system, both manifest files should be merged into a single file. The file specification should allow for the least amount of unnecessary declarations that is possible, so that simple add-ons are simple to make. It should also be robust enough not to limit complex add-on creation, and it should cover every single non-obsoleted feature of both current manifest files. It should work for all add-ons that currently use the XPI format: extensions, themes, locale, and multi-item packages.

    The chosen format for the manifest file is JSON. The reasons behind this decision are:

    • JSON is a very compact and easy to read format.
    • It’s widely used and well known.
    • Firefox and Mozilla-based applications already include a fast and safe JSON parser.
    • The Jetpack project uses JSON for its manifest file, and using the same base for all add-ons helps maintain consistency and ease switching between platforms if needed.

    The only major disadvantage is not being able to comment in JSON files. There are workarounds, but they’re not very pretty.

    The manifest file will be named manifest.json. It’s not package.json like previously speculated because it doesn’t serve the exact same purpose as package manifests in Jetpack, and it would cause confusion about the meaning of packages. It’s not install.json because it could be easily confused with the old install.js manifests.

    The presence of manifest.json in the XPI file will indicate this file needs to be handled as a v2 package. If manifest.json isn’t found, the current install system should be used. XPIs should be able to include old and new manifest files in order to be backward-compatible with application versions that don’t support the new system.

    A simple manifest file

    A very simple Hello World add-on (taken from XUL School) would have the following manifest files.

    install.rdf

    <?xml version="1.0"?>
    
    <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
      xmlns:em="http://www.mozilla.org/2004/em-rdf#">
      <Description about="urn:mozilla:install-manifest">
        <em:id>helloworld@xulschool.com</em:id>
        <em:name>XUL School Hello World</em:name>
        <em:description>Welcome to XUL School!</em:description>
        <em:version>0.1</em:version>
        <em:creator>Appcoast</em:creator>
        <em:homepageURL>https://developer.mozilla.org/en/XUL_School</em:homepageURL>
        <em:type>2</em:type>
        <em:targetApplication>
          <Description>
            <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
            <em:minVersion>3.0</em:minVersion>
            <em:maxVersion>3.6.*</em:maxVersion>
          </Description>
        </em:targetApplication>
      </Description>
    </RDF>

    chrome.manifest

    content   xulschoolhello              jar:chrome/xulschoolhello.jar!/content/
    skin      xulschoolhello  classic/1.0 jar:chrome/xulschoolhello.jar!/skin/
    locale    xulschoolhello  en-US       jar:chrome/xulschoolhello.jar!/locale/en-US/
    
    overlay chrome://browser/content/browser.xul  chrome://xulschoolhello/content/browserOverlay.xul

    The equivalent manifest file in the new system would be the following.

    manifest.json

    {
      id : "helloworld@xulschool.com",
      name : "XUL School Hello World",
      description : "Welcome to XUL School!",
      version : "0.1",
      authors : "Appcoast",
      homepageURL : "https://developer.mozilla.org/en/XUL_School",
      type: "2",
      targetApplications : {
        id : "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}",
        minVersion : "3.0",
        maxVersion : "3.6.*"
      },     
      domain : "xulschoolhello",
      overlays : {
        source : "chrome://xulschoolhello/content/overlay.xul",
        target : "chrome://browser/content/browser.xul"
      }
    }

    The (not really) missing chrome declarations will be covered in part 2 of this specification.

    Plural attributes in the manifest file (authors, targetApplications, overlays, and others) can either be a single value or object, or an array of them. So, if there were multiple authors to the add-on, the following would also work:

    authors : [ "Appcoast", "Mozilla" ],

    Part 2 of this specification will attempt to cover all possible attributes in the manifest file, as well as attribute localization.

  • Add-on Packaging Idea now a GSOC project

    May 13th, 2010 by jorge with 2 comments »

    When I wrote my previous post about making add-on packaging simpler, I hoped but didn’t expect much to come out of it. It was more like taking a peek into the community and see how much interest there was for these kinds of proposal. I have a real desire to see things like this come to fruition, but not enough time or resources to do it myself. And it’s very difficult for a volunteer to handle a project of such magnitude.

    But then the Google Summer of Code came to the rescue. I believe Gerv mentioned it in one of our weekly all hands meetings, and I thought “it’s a long short, but what the hell”. I just threw the idea into the candidates list. In a matter of a couple of weeks, the idea went from candidate to proposal, to approved proposal, to approved proposal with an assigned student. So, this summer, Hebert Duarte from Brazil will be working on the add-on packaging idea, and hopefully we will have a working implementation within a couple of months. That’s awesome!

    Now it’s my responsibility to guide Hebert in the right direction, and to give him all he needs to get this project going. For that I will be posting a more detailed specification of the new add-on packaging system, to try to cover the quirks and special cases that need to be addressed. Expect it to appear on this blog very soon. Coding begins on May 24th, so I want to have everything figured out by then. Your feedback as usual is welcome.

    Note that having a working implementation doesn’t guarantee it will become part of Firefox or other applications any time soon. At the moment there are no plans or expectations of when and if we will be including this into the Mozilla code base. That’s a whole other project ;)

  • XPI v2 – Making Extension Development Easier

    March 23rd, 2010 by jorge with 17 comments »

    Note: this is just me throwing some ideas around. It is not an official proposal or spec. Having said that, I would like everyone that has interest in extension development to read this post and tell me what they think.

    I’ve been an extension developer for a long time, and I like to think that developing extensions is actually quite easy. Maybe it has to do with my C++/Java background, where setting up a development environment is much more involved than using a text editor and zipping some files together.
    That doesn’t negate the fact that the Mozilla add-ons platform is old, and showing its age. There are a number of problems with it that make it hard to take the first steps into add-on development, and it’s amazing how little has been done to solve them over the past years. These are the top 3 in my mind:

    • Extensions can’t be installed or uninstalled without a browser restart.
      • That’s bug 256509. Can it be fixed? Probably, but it would take a major development effort.
    • The documentation about extension development is incomplete or outdated.
      • I’m working on this in the XUL School project, to be finished soon.
    • Getting started with a basic “hello world” extension is too much effort: install.rdf, chrome.manifest, chrome JAR, content, skin, locale, defaults, OMG!

    The last point is the one I want to tackle in this post. There’s a ridiculous amount of boilerplate, redundant coding to do even for the most basic of add-ons, specially if you’re making an extension that should be skinable and localizable. These are the specific problems I’ve identified:

    • There are two manifest files: install.rdf and chrome.manifest, in completely different formats.
    • They are both defined in relatively obscure formats. The install.rdf file is one of the very few places where RDF is still used in Firefox. Sticking to a dying format (at least in this context) is a very bad idea.
    • The default chrome structure (with content, locale, skin, etc.) is too bureaucratic and inflexible, and almost completely redundant. Most add-ons have exactly the same structure, and having to define it every single time is unnecessary.

    I think we can reimagine add-on packaging in way that simple tasks can be performed in the simplest of ways, and so that it can scale to be as fine-tuned as it is today. So here are my ideas.#1 Merge install.rdf and chrome.manifest into a single file. What format should be used? I think JSON is as good as any other, and Mozilla already includes a native and very fast JSON parser. This manifest file could also match the package.json manifests being used for Jetpacks. package.json is actually a pretty good name for the manifest file. Perhaps the same standard can be use for Jetpacks and other add-ons?

    #2 Default to the root extension directory for chrome URLs in order to minimize chrome.manifest declarations. This means that a hello world extension could have this structure:

    • helloworld.xpi2
      • package.json
      • overlay.xul
      • overlay.js
      • overlay.dtd

    And the manifest file would be something like:

    {
      id : “helloworld@xulforge.com”,
      name : “Hello World!”,  
      type: “2”
      compatibility :    
        { id : “{ec8030f7-c20a-464f-9b0e-13a3a9e97384}”,
          minVersion : “3.5”,
          maxVersion : “3.6.*”},     
      domain: “helloworldchrome”,
      overlays:      
        { source : “chrome://helloworldchrome/content/overlay.xul”,
          target : “chrome://browser/content/browser.xul”}
    }

    (Note: ‘compatibility’ and ‘overlays’ can be arrays when there’s more than one item. And the ‘domain’ value is a general declaration of the chrome domain.)

    In this new system, you would be able to have all of your chrome files in the root directory and have no need for chrome directives other than declaring your main overlay. Also, in your root directory you can have a locale or skin folder that the system would know how to handle without any changes to the manifest. If a file isn’t found in the locale or skin folder, then the system falls back to the root directory as a last resource. Of course it would still be possible to declare specific locations for content, locale and skin in the manifest, in order to allow the “old style” to be used.

    What about other special locations?

    • platform and components will continue to have their special meanings.
    • JSM files can be handled just the same as chrome files, except that they use resource:// instead of chrome://.
    • The default preferences file should also be moved to the root and have a predetermined name, like defaultPrefs.js.

    #3 Installing the package. When you install an XPI file, the file is unpacked in your profile directory. It is common (but not mandatory) practice for chrome files to be packed in a JAR file, which remains packed after installation. According to recent discussions about add-on performance, it’s more efficient to keep files packed together. Instead of requiring authors to use the internal JAR approach, I think it makes more sense to require authors *not* to use JARs, and then keep the packed XPI in the profile on installation. Files that need to be extracted, like the manifest (maybe) and binary components (according to this) can be extracted upon installation. This way it’s up to the platform and not the developer to look after performance.That’s it. Given that this new packaging system would be backwards-incompatible with the current one, it might make sense to change the file extension to something like XPI2, in order to make a clearer distinction between the 2. However it should suffice to look for the manifest file in order to identify the system in use.
    How hard is this to implement? I think #1 and #3 are fairly simple to implement. #2 is the one that may present a bigger challenge, since the chrome URL system is something that runs deep in the Mozilla code, and changing its file location rules could cause breakage or vulnerabilities in non-add-on code. It might also be possible to limit the scope of these changes to add-ons only, but again, that may require lots of work. I’d love to hear the opinions of those who work on this part of the platform.

    Some may wonder how does Jetpack fit into this whole idea. Well, Jetpack is a different platform, and it may very well replace traditional add-ons in the long term, but we’re still a long ways to go. We shouldn’t see Jetpack as some kind of competition, but as a lesson in what we can do better. If we improve add-on packaging to be closer to Jetpack packaging (I think this would be), then it’s a win for both, because it’ll make it less painful for developers to choose and switch between either platform.

    I’d love to hear what experienced developers (both add-on and platform) think about this. I think there’s a real gain for novice developers in this if we were to implement it. I intentionally left out some details for brevity, but I’ll be happy to discuss them in the comments. Thanks for reading.

  • Doing my part for open audio

    March 4th, 2010 by jorge with 3 comments »

    The past few years have been completely surreal for me. I still can’t quite believe I’m working for Mozilla and helping the project in such a significant way. It’s one of those things you dream about but you never expect it to become true. Then it happens and you realize it’s just a matter of working hard and doing things right. Go figure.

    I keep feeling the same about a side project of mine that began shortly before I joined Mozilla. A long time friend of mine has lead a heavy metal band called Pneuma for quite a few years now. They had to break ties with their production company recently because of unacceptable delays on their part, and lots of the typical crap professional musicians have to deal with. They were looking for people to invest in the independent production of their next album, and I guess I was just in the right place at the right time.

    Of course I wouldn’t invest in them if I didn’t think they were really good.  I have great expectations for their upcoming album and I’m helping them in every way I can. The best way I can help them is by bringing my knowledge of the web and technology to the table. So far I’ve helped them set up their temporary website and twitter account. I will also be helping them out with their online distribution, because not having your album listed on the iTunes Store is a very new and very big mistake a band can easily make.

    But I digress. The point of this post is that I decided to use HTML5 on their site, and provide their first single in open OGG/Vorbis format (falling back to MP3 and Quicktime), with the added bonus that the band agreed to have the track available for download and free distribution. So anybody can listen and download the track in their preferred format, MP3 or OGG. The audio player looks fantastic on the site, by the way. Much better than QuickTime or WMP plugins. The audio quality is also great, and the file is much smaller than its MP3 counterpart.

    Adding also to the surrealism of the whole “music producer” side of my life is the fact that Pneuma will be the opening act at the first Metallica concert in Costa Rica, next Sunday. This is the biggest concert in Costa Rican history, and I’m pretty sure I’ll be backstage. I haven’t really taken that in yet, there’s just too much work to do before the concert. But WOW.

    If you like thrash / progressive metal, I recommend you visit http://pneumametal.com/ and have a quick listen. I think you’ll be pleasantly surprised.

  • MAOW Perú afterthoughts

    March 4th, 2010 by jorge with no comments »

    The first Latin American MAOW (Mozilla Add-ons Workshop) was held last Saturday in Lima, Perú. The event was organized by Percy Cabello from the Mozilla Perú community, also the maintainer of the very awesome Mozilla Links blog.

    I did the first part of the workshop, explaining extension development.

    Me explaining stuff

    I learned from this experience that it’s not a good idea to cover all of the boilerplate parts of extension development in a presentation with such limited time. For future events I think it’s a better idea to have some sort of required reading before attending, so that it’s easier just to dive into the actual juicy parts and get stuff done. I still managed to cover several topics surrounding extension development, and the slides were full of references that people can follow to continue learning about the topic.

    The second part of the event was about Jetpack development, and was presented by newly appointed Jetpack Ambassador Hernán Rodríguez, from Agentina:

    Hernán showing shinny stuff

    Hernán did a fantastic job. I also should give Jetpack some credit because it is incredibly easy to get started in a few minutes. The attendees had a chance to play around and do more experimenting than on my presentation. We had some fun playing around with Hernán Twitter slidebar and messing around with CSS transformations.

    The event was a great success, and this was all thanks to the great work of the Mozilla Perú community. I was pleasantly surprised of how well organized they are, and the great deal of large-scale technology events that are held in Perú that could be good platforms for Mozilla to attract new community members.

    Much more details about this event can be read (in Spanish) in the Mozilla Perú blog and Hernán’s blog:

    Thanks again to Percy and Mozilla Perú community for organizing this event. I hope to see you again soon!

  • And now they wait…

    January 24th, 2010 by jorge with 10 comments »

    I guess giving 3 month’s advanced notice wasn’t enough for most add-on authors. I guess this is partly our fault, and we should stress enough how important it is for them to stay up to date with Firefox new, or at least the Add-ons Blog.

    On Thursday, the update queue had about 80 add-on updates in line to be reviewed. This is a short as it’s been for a very long time. Today it stands close to 200 updates, and will continue to grow in the following couple of weeks. All authors are now rushing out updates because they just realized Firefox 3.6 is out.

    Well, now it’s up to the editor team to catch up. It’ll take a while, I think. Authors that decided to update after the 3.6 release will now have to wait. It’s bad for everyone, and the result of bad communication. That’s something we’ll need to work on.