<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>code on Oxymoronical</title>
    <link>https://www.oxymoronical.com/blog/tag/code/</link>
    <description>Recent content in code on Oxymoronical</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 09 Feb 2026 18:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.oxymoronical.com/blog/tag/code/feed/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Can&#39;t you do this faster with AI?</title>
      <link>https://www.oxymoronical.com/blog/2026/01/cant-you-do-this-faster-with-ai/</link>
      <pubDate>Mon, 09 Feb 2026 18:00:00 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2026/01/cant-you-do-this-faster-with-ai/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m hearing this question asked a lot lately. Both within Mozilla and from others in the industry. You come up with a plan for implementing some feature, put your best estimate on how long it will take to implement, and then you get push back from folks several levels removed from the project along the lines of &lt;em&gt;&amp;ldquo;Wouldn&amp;rsquo;t this be faster if you used AI?&amp;rdquo;&lt;/em&gt;, or &lt;em&gt;&amp;ldquo;Can&amp;rsquo;t Claude Code do most of this?&amp;rdquo;&lt;/em&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making a case sensitive directory on Windows and macOS</title>
      <link>https://www.oxymoronical.com/blog/2025/06/making-a-case-sensitive-directory/</link>
      <pubDate>Thu, 05 Jun 2025 08:53:00 +0100</pubDate>
      <guid>https://www.oxymoronical.com/blog/2025/06/making-a-case-sensitive-directory/</guid>
      <description>&lt;p&gt;Now that Firefox has &lt;a href=&#34;https://github.com/mozilla-firefox/firefox&#34;&gt;switched to git&lt;/a&gt; as its canonical source code repository a number of us have been longing for all the nice features that Mercurial used to provide that are much more awkward with git. So many of us have been experimenting with &lt;a href=&#34;https://jj-vcs.github.io/jj/latest/&#34;&gt;Jujutsu&lt;/a&gt; which provides a lot of what is missing. It&amp;rsquo;s pretty good, I recommend giving it a go if you are also forced to use git!&lt;/p&gt;&#xA;&lt;p&gt;But it has &lt;a href=&#34;https://github.com/jj-vcs/jj/issues/1737&#34;&gt;an annoying bug&lt;/a&gt;. If you&amp;rsquo;re on a case insensitive filesystem (the default on macOS and Windows) and a change renames a file in a way that only changes the case of the filename then Jujutsu gets confused. I think what&amp;rsquo;s going on is when it tries to apply the change it tells the OS to rename the file and then the OS sees that the filename is the &amp;ldquo;same&amp;rdquo; and does nothing. Subsequently Jujutsu constantly thinks there is a change because the filename on disk doesn&amp;rsquo;t exactly match what it expects and everything gets messy. The workaround is to manually rename those files to the correct names but that is annoying. I don&amp;rsquo;t know if Mozilla are particularly bad at this but the two examples in the issue are us and another just landed recently 😂.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Some thoughts on coding with AI</title>
      <link>https://www.oxymoronical.com/blog/2025/05/thoughts-on-coding-with-ai/</link>
      <pubDate>Sat, 24 May 2025 20:17:00 +0100</pubDate>
      <guid>https://www.oxymoronical.com/blog/2025/05/thoughts-on-coding-with-ai/</guid>
      <description>&lt;p&gt;As you probably know AI tools are here and expectations range from &amp;ldquo;This is going to destroy the environment and make everyone unemployed&amp;rdquo; to &amp;ldquo;This is going to usher in a golden age freeing humanity from drudgery&amp;rdquo;. The reality is of course somewhere between the two and I don&amp;rsquo;t think we&amp;rsquo;re really going to know exactly where for many years.&lt;/p&gt;&#xA;&lt;p&gt;I believe strongly in learning and understanding the tools available to us so that we can make pragmatic choices about what tools to use when. So for quite a while I&amp;rsquo;ve made various attempts to try using AI for coding. Most of my attempts have involved going to ChatGPT and asking it to write some code for me or answer questions about API specs. And it&amp;rsquo;s never been a great experience. Generally the code it generated wouldn&amp;rsquo;t work and it would confidently lie about what specs required. Clearly some people find this useful but I&amp;rsquo;ve never quite found out why yet.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tests don&#39;t replace Code Review</title>
      <link>https://www.oxymoronical.com/blog/2024/05/tests-dont-replace-code-review/</link>
      <pubDate>Wed, 01 May 2024 23:02:00 +0100</pubDate>
      <guid>https://www.oxymoronical.com/blog/2024/05/tests-dont-replace-code-review/</guid>
      <description>&lt;p&gt;I frequently see a bold claim come up in tech circles. That as a team you&amp;rsquo;re wasting time by doing code reviews. You should instead rely on automated tests to catch bugs. This surprises me because I can&amp;rsquo;t imagine anyone thinking that such a blanket statement is true. But then most of the time this is brought up in places like Twitter where nuance is impossible and engagement farming is rife. Still it got me thinking about why I think code review is important even if you have amazing tests.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Announcing LocalNS</title>
      <link>https://www.oxymoronical.com/blog/2022/05/announcing-localns/</link>
      <pubDate>Mon, 02 May 2022 20:07:21 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2022/05/announcing-localns/</guid>
      <description>&lt;p&gt;I mess around with a bunch of different projects in my spare time but it’s been a long time since I’ve thought one was worth tidying up into an actual release. Maybe it will be useful to you?&lt;/p&gt;&#xA;&lt;p&gt;The problem I faced was that I had a whole bunch of services that I installed on my network, some in docker, some as standalone servers, some behind a &lt;a href=&#34;https://traefik.io/traefik/&#34;&gt;Traefik&lt;/a&gt; proxy. In the docker case I was using &lt;a href=&#34;https://docs.docker.com/network/macvlan/&#34;&gt;macvlan&lt;/a&gt; networking so each service had its own IP address accessible to the entire network. Once I learned how to do all that it became trivial to spin up a new local service, say &lt;a href=&#34;https://www.influxdata.com/products/influxdb-overview/&#34;&gt;InfluxDB&lt;/a&gt; or &lt;a href=&#34;https://grafana.com/&#34;&gt;Grafana&lt;/a&gt; with a couple of lines in a docker-compose file.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Creating HTML content with a fixed aspect ratio without the padding trick</title>
      <link>https://www.oxymoronical.com/blog/2019/10/creating-html-content-with-a-fixed-aspect-ratio-without-the-padding-trick/</link>
      <pubDate>Wed, 30 Oct 2019 10:01:09 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2019/10/creating-html-content-with-a-fixed-aspect-ratio-without-the-padding-trick/</guid>
      <description>&lt;p&gt;It seems to be a common problem, you want to display some content on the web with a certain aspect ratio but you don’t know the size you will be displaying at. How do you do this? CSS doesn’t really have the tools to do the job well currently (there are &lt;a href=&#34;https://jonathankingston.github.io/logical-sizing-properties/&#34;&gt;proposals&lt;/a&gt;). In my case I want to display a video and associated controls as large as possible inside a space that I don’t know the size of. The size of the video also varies depending on the one being displayed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Please watch your character encodings</title>
      <link>https://www.oxymoronical.com/blog/2019/07/Please-watch-your-character-encodings/</link>
      <pubDate>Wed, 10 Jul 2019 13:38:01 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2019/07/Please-watch-your-character-encodings/</guid>
      <description>&lt;p&gt;I started writing this as a newsgroup post for one of Mozilla’s mailing lists, but it turned out to be too long and since this part was mainly aimed at folks who either didn’t know about or wanted a quick refresher on character encodings I decided to blog it instead. Please let me know if there are errors in here, I am by no means an expert on this stuff either and I do get caught out sometimes!&lt;/p&gt;</description>
    </item>
    <item>
      <title>hgchanges is down, probably for good</title>
      <link>https://www.oxymoronical.com/blog/2017/02/hgchanges-is-down-probably-for-good/</link>
      <pubDate>Mon, 06 Feb 2017 14:01:35 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2017/02/hgchanges-is-down-probably-for-good/</guid>
      <description>&lt;p&gt;My little tool to help folks track when changes are made to files or directories in Mozilla’s mercurial repositories has gone down again. This time an influx of some 8000 changesets from the servo project are causing the script that does the updating to fail so I’ve turned off updating. I no longer have any time to work on this tool so I’ve also taken it offline and don’t really have any intention to bring it back up again. Sorry to the few people that this inconveniences. Please go lobby the engineering productivity folks if you still need a tool like this.&lt;/p&gt;</description>
    </item>
    <item>
      <title>On Firefox module ownership</title>
      <link>https://www.oxymoronical.com/blog/2016/12/On-Firefox-module-ownership/</link>
      <pubDate>Wed, 14 Dec 2016 16:15:24 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2016/12/On-Firefox-module-ownership/</guid>
      <description>&lt;p&gt;It has been over eleven years since I first wrote a patch for Firefox. It was reviewed by the then-Firefox module owner, Mike Connor. If you had told me then that at some point in the future &lt;em&gt;I&lt;/em&gt; was going to be the module owner I probably would have laughed at you. I didn’t know at the time how much Mozilla would shape my life. Yet yesterday Dave Camp handed over the reigns to me and here we are.&lt;/p&gt;</description>
    </item>
    <item>
      <title>New Firefox reviewers</title>
      <link>https://www.oxymoronical.com/blog/2016/06/New-Firefox-reviewers/</link>
      <pubDate>Wed, 08 Jun 2016 09:34:36 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2016/06/New-Firefox-reviewers/</guid>
      <description>&lt;p&gt;I’m delighted to announce that I’ve just made Andrew Swan (aswan on IRC) a reviewer for Firefox code. That also reminds me that I failed to announce when I did the same for Rob Helmer (rhelmer). Please inundate them with patches.&lt;/p&gt;&#xA;&lt;p&gt;There are a few key things I look for when promoting folks to reviewers, surprisingly none of them are an understanding of the full breadth of code in Firefox or Toolkit:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Improving the performance of the add-ons manager with asynchronous file I/O</title>
      <link>https://www.oxymoronical.com/blog/2016/01/Improving-the-performance-of-the-add-ons-manager-with-asynchronous-file-IO/</link>
      <pubDate>Wed, 27 Jan 2016 12:35:25 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2016/01/Improving-the-performance-of-the-add-ons-manager-with-asynchronous-file-IO/</guid>
      <description>&lt;p&gt;The add-ons manager has a dirty secret. It uses an awful lot of synchronous file I/O. This is the kind of I/O that blocks the main thread and can cause Firefox to be janky. I’m told that that is a technical term. Asynchronous file I/O is much nicer, it means you can let the rest of the app continue to function while you wait for the I/O operation to complete. I rewrote much of the current code from scratch for Firefox 4.0 and even back then we were trying to switch to asynchronous file I/O wherever possible. But still I used mostly synchronous file I/O.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linting for Mozilla JavaScript code</title>
      <link>https://www.oxymoronical.com/blog/2015/12/Linting-for-Mozilla-JavaScript-code/</link>
      <pubDate>Fri, 18 Dec 2015 11:27:07 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2015/12/Linting-for-Mozilla-JavaScript-code/</guid>
      <description>&lt;p&gt;One of the projects I’ve been really excited about recently is getting ESLint working for a lot of our JavaScript code. If you haven’t come across ESLint or linters in general before they are automated tools that scan your code and warn you about syntax errors. They can usually also be set up with a set of rules to enforce code styles and warn about potential bad practices. The devtools and Hello folks have been using eslint for a while already and Gijs asked why we weren’t doing this more generally. This struck a chord with me and a few others and so we’ve been spending some time over the past few weeks getting our in-tree support for ESLint to work more generally and fixing issues with browser and toolkit JavaScript code in particular to make them lintable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Running ESLint on commit</title>
      <link>https://www.oxymoronical.com/blog/2015/12/Running-ESLint-on-commit/</link>
      <pubDate>Fri, 18 Dec 2015 11:24:23 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2015/12/Running-ESLint-on-commit/</guid>
      <description>&lt;p&gt;ESLint becomes the most useful when you get warnings before even trying to land or get your code reviewed. You can add support to your code editor but not all editors support this so I’ve written a mercurial extension which gives you warnings any time you commit code that fails lint checks. It uses the same rules we run elsewhere. It doesn’t abort the commit, that would be annoying if you’re working on a feature branch but gives you a heads up about what needs to be fixed and where.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making communicating with chrome from in-content pages easy</title>
      <link>https://www.oxymoronical.com/blog/2015/03/Making-communicating-with-chrome-from-in-content-pages-easy/</link>
      <pubDate>Mon, 23 Mar 2015 08:34:24 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2015/03/Making-communicating-with-chrome-from-in-content-pages-easy/</guid>
      <description>&lt;p&gt;As Firefox increasingly switches to support running in multiple processes we’ve been finding common problems. Where we can we are designing nice APIs to make solving them easy. One problem is that we often want to run in-content pages like about:newtab and about:home in the child process without privileges making it safer and less likely to bring down Firefox in the event of a crash. These pages still need to get information from and pass information to the main process though, so we have had to come up with ways to handle that. Often we use custom code in a frame script acting as a middle-man, using things like DOM events to listen for requests from the in-content page and then messaging to the main process.&lt;/p&gt;</description>
    </item>
    <item>
      <title>hgchanges is back up</title>
      <link>https://www.oxymoronical.com/blog/2015/01/hgchanges-is-be-back-up/</link>
      <pubDate>Thu, 29 Jan 2015 10:33:05 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2015/01/hgchanges-is-be-back-up/</guid>
      <description>&lt;p&gt;The offending changeset that broke &lt;a href=&#34;https://www.oxymoronical.com/blog/2015/01/hgchanges-is-down-for-now&#34;&gt;hgchanges yesterday &lt;/a&gt;turns out to be a merge from an ancient branch to current tip. That makes the diff insanely huge which is why things like hgweb were tripping over it. Kwierso point out that just ignoring those changesets would solve the problem. It’s not ideal but since in this case they aren’t useful changesets I’ve gone ahead and done that and so hgchanges is now updating again.&lt;/p&gt;</description>
    </item>
    <item>
      <title>hgchanges is down for now</title>
      <link>https://www.oxymoronical.com/blog/2015/01/hgchanges-is-down-for-now/</link>
      <pubDate>Wed, 28 Jan 2015 21:23:31 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2015/01/hgchanges-is-down-for-now/</guid>
      <description>&lt;p&gt;My &lt;a href=&#34;http://hgchanges.fractalbrew.com/&#34;&gt;handy tool&lt;/a&gt; for tracking changes to directories in the mozilla mercurial repositories is going to be broken for a little while. Unfortunately a &lt;a href=&#34;https://hg.mozilla.org/mozilla-central/rev/8991b10184de994b6ba38edd81a73856c8c3d595&#34;&gt;particular changeset&lt;/a&gt; seems to be breaking things in ways I don’t have the time to fix right now. Specifically trying to download the &lt;a href=&#34;https://hg.mozilla.org/mozilla-central/raw-rev/4f2a8114211d:8991b10184de&#34;&gt;raw patch&lt;/a&gt; for the changeset is causing hgweb to timeout. Short of finding time to debug and fix the problem my only solution is to wait until that patch is old enough that it no longer attempts to index it. That could take a week or so.&lt;/p&gt;</description>
    </item>
    <item>
      <title>An update for hgchanges</title>
      <link>https://www.oxymoronical.com/blog/2014/03/An-update-for-hgchanges/</link>
      <pubDate>Thu, 13 Mar 2014 15:47:18 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2014/03/An-update-for-hgchanges/</guid>
      <description>&lt;p&gt;Nearly a year ago I showed off the first version of my webapp for displaying &lt;a href=&#34;https://www.oxymoronical.com/blog/2013/04/Get-notifications-about-changes-to-any-directory-in-mercurial&#34;&gt;recent changes in mercurial repositories&lt;/a&gt;. I’ve heard directly from a number of people that use it but it’s had a few problems that I’ve spent some of my spare time trying to solve. I’m now pleased to say that a new version is up and running. I’m not sure it’s accurate to call this a rewrite since it was entirely incremental but when I look back over of the code changes there really isn’t much that wasn’t touched in some way or other. So what’s new? For you, a person using the site absolutely nothing! So what on earth have I been doing rewriting the code?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Developer Tools meet-up in Portland</title>
      <link>https://www.oxymoronical.com/blog/2014/03/Developer-Tools-meet-up-in-Portland/</link>
      <pubDate>Wed, 05 Mar 2014 14:33:06 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2014/03/Developer-Tools-meet-up-in-Portland/</guid>
      <description>&lt;p&gt;Two weeks ago the developer tools teams and a few others met in the Portland office for a very successful week of discussions and hacking. The first day was about setting the stage for the week and working out what everyone was going to work on. Dave Camp kicked us off with a review of the last six months in developer tools and talked about what is going to be important for us to focus on in 2014. We then had a little more in-depth information from each of the teams. After lunch a set of lightning talks went over some projects and ideas that people had been working on recently.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Firefox now ships with the add-on SDK</title>
      <link>https://www.oxymoronical.com/blog/2013/05/Firefox-now-ships-with-the-add-on-SDK/</link>
      <pubDate>Wed, 15 May 2013 15:31:59 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2013/05/Firefox-now-ships-with-the-add-on-SDK/</guid>
      <description>&lt;p&gt;It’s been a long ride but we can finally say it. This week Firefox 21 shipped and it includes the add-on SDK modules.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;shipped.jpg&#34;&gt;&lt;img src=&#34;https://www.oxymoronical.com/blog/2013/05/Firefox-now-ships-with-the-add-on-SDK/shipped.jpg&#34; style=&#34;width: 343px&#34; alt=&#34;We took all the Jetpack APIs and we shipped them in Firefox!&#34; title=&#34;We took all the Jetpack APIs and we shipped them in Firefox!&#34;&gt;&#xA;  &lt;/a&gt;What does this mean? Well for users it means two important things:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Smaller add-ons. Since they no longer need to ship the APIs themselves add-ons only have to include the unique code that makes them special. That’s something like a 65% file-size saving for the most popular SDK based add-ons, probably more for simpler add-ons.&lt;/li&gt;&#xA;&lt;li&gt;Add-ons will stay compatible with Firefox for longer. We can evolve the modules in Firefox that add-ons use so that most of the time when changes happen to Firefox the modules seamlessly shift to keep working. There are still some cases where that might be impossible (when a core feature is dropped from Firefox for example) but hopefully those should be rare.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;To take advantage of these benefits add-ons have to be repacked with a recent version of the SDK. We’re &lt;a href=&#34;https://groups.google.com/d/msg/mozilla-labs-jetpack/-nxopO-_gVI/MxZHoOv0ddIJ&#34;&gt;working on a plan&lt;/a&gt; to do that automatically for existing add-ons where possible but developers who want to get the benefits right now can just repack their add-ons themselves using SDK 1.14 and using &lt;code&gt;cfx xpi --strip-sdk&lt;/code&gt;, or using the next release of the SDK, 1.15 which will do that by default.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Get notifications about changes to any directory in mercurial</title>
      <link>https://www.oxymoronical.com/blog/2013/04/Get-notifications-about-changes-to-any-directory-in-mercurial/</link>
      <pubDate>Fri, 05 Apr 2013 14:36:32 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2013/04/Get-notifications-about-changes-to-any-directory-in-mercurial/</guid>
      <description>&lt;p&gt;Back in the old days when we used CVS of all things for our version control we had a wonderful tool called &lt;a href=&#34;http://bonsai.mozilla.org/&#34;&gt;bonsai&lt;/a&gt; to help query the repository for changes. You could list changes on a per directory basis if you needed which was great for keeping an eye on certain chunks of code. I recall there being a way of getting an RSS feed from it and I used it when I was the module owner of the extension manager to see what changes were landed that I hadn’t noticed in bugs.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hacking on Tilt</title>
      <link>https://www.oxymoronical.com/blog/2013/03/hacking-on-tilt/</link>
      <pubDate>Mon, 18 Mar 2013 18:38:42 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2013/03/hacking-on-tilt/</guid>
      <description>&lt;p&gt;Tilt, or 3D view as it is known in Firefox, is an awesome visual tool that really lets you see the structure of a webpage. It shows you just how deep your tag hierarchy goes which might give signs of your page being too complex or even help you spot errors in your markup that you wouldn’t otherwise notice. But what if it could do more? What if there were different ways to visualise the same page? What if even web developers could create their own visualisations?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Let&#39;s just put it in Toolkit!</title>
      <link>https://www.oxymoronical.com/blog/2012/11/Lets-just-put-it-in-Toolkit/</link>
      <pubDate>Fri, 23 Nov 2012 23:41:56 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2012/11/Lets-just-put-it-in-Toolkit/</guid>
      <description>&lt;p&gt;Toolkit is fast turning into the dumping ground of mozilla-central. Once upon a time the idea was simple. Any code that could be usefully shared across multiple applications (and in particular code that wasn’t large enough to deserve a module of its own) would end up in Toolkit. The rules were pretty simple, any code in there should work for any application that wants to use it. This didn’t always work exactly according to plan but we did our best to fix Seamonkey and Thunderbird incompatibilities as they came along.&lt;/p&gt;</description>
    </item>
    <item>
      <title>WebApp Tabs, version control and GitHub</title>
      <link>https://www.oxymoronical.com/blog/2011/11/WebApp-Tabs-version-control-and-GitHub/</link>
      <pubDate>Mon, 07 Nov 2011 00:59:28 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2011/11/WebApp-Tabs-version-control-and-GitHub/</guid>
      <description>&lt;p&gt;The extension I’ve been working on in my spare time for the past couple of weeks is now available as a first (hopefully not too buggy) release. It lets you open WebApps in Thunderbird, properly handling loading new links into Firefox and making all features like spellchecking work in Thunderbird (most other extensions I found didn’t do this). You can read more about the actual extension at its &lt;a href=&#34;http://www.fractalbrew.com/labs/webapp-tabs/&#34; title=&#34;WebApp Tabs for Thunderbird&#34;&gt;homepage&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Overlays without overlays in restartless add-ons</title>
      <link>https://www.oxymoronical.com/blog/2011/10/Overlays-without-overlays-in-restartless-add-ons/</link>
      <pubDate>Mon, 31 Oct 2011 01:43:46 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2011/10/Overlays-without-overlays-in-restartless-add-ons/</guid>
      <description>&lt;p&gt;Perhaps the most common way of making changes to Firefox with an extension has always been using the overlay. For a window’s UI you can make changes to the underlying XUL document, add script elements to be executed in the context of the normal window’s code and add new stylesheets to the window to change how the UI looks.&lt;/p&gt;&#xA;&lt;p&gt;Restartless add-ons change this around completely, the normal overlay and style-overlay mechanisms just aren’t available to restartless add-ons and this is likely to remain true for a while, these methods don’t clean up after themselves when the add-on is uninstalled.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Playing with windows in restartless (bootstrapped) extensions</title>
      <link>https://www.oxymoronical.com/blog/2011/01/Playing-with-windows-in-restartless-bootstrapped-extensions/</link>
      <pubDate>Wed, 19 Jan 2011 20:14:27 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2011/01/Playing-with-windows-in-restartless-bootstrapped-extensions/</guid>
      <description>&lt;p&gt;Lots of people seem to be &lt;a href=&#34;http://starkravingfinkle.org/blog/2011/01/bootstrap-jones-adventures-in-restartless-add-ons/&#34;&gt;playing&lt;/a&gt; with the new support for restartless extensions (also known as bootstrapped extensions) coming in Firefox 4. Nothing could make me happier really. I’m not sure I can remember ever helping implement something which is will hopefully turn out to be a game changer for extension development in the future. The technical details of restartless extensions are &lt;a href=&#34;https://developer.mozilla.org/en/Extensions/Bootstrapped_extensions&#34;&gt;talked about&lt;/a&gt; in a &lt;a href=&#34;https://www.oxymoronical.com/blog/2010/07/How-to-extend-the-new-Add-ons-Manager&#34;&gt;few places&lt;/a&gt; but one thing that is missing is what I think is probably going to be the most common code pattern in these extensions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to extend the new Add-ons Manager (or how I built a simple greasemonkey clone in an evening)</title>
      <link>https://www.oxymoronical.com/blog/2010/07/How-to-extend-the-new-Add-ons-Manager/</link>
      <pubDate>Fri, 09 Jul 2010 22:30:56 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2010/07/How-to-extend-the-new-Add-ons-Manager/</guid>
      <description>&lt;p&gt;One of the goals of the new add-ons manager API was to create something that was itself extensible. A couple of times in the past we’ve had to add new types of add-ons to the UI like Plugins and Personas. In both cases squeezing them into the UI was something of a kludge involving a bunch of custom code for each case. We already have a number of new types of add-ons that we want to add, things like search plugins which are currently managed by their own custom UI.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Simplifying</title>
      <link>https://www.oxymoronical.com/blog/2010/03/Simplifying/</link>
      <pubDate>Sat, 13 Mar 2010 02:29:49 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2010/03/Simplifying/</guid>
      <description>&lt;p&gt;The big project that I have been working on for quite some time now is a complete change to the architecture of the add-ons manager backend. It’s a big scary prospect since (IMHO) the code is pretty crucial to the success of Firefox and many other Mozilla based applications. Without extensions I don’t think we’d be where we are today, in fact it was because of extensions that I got involved in the project in the first place.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Testing the background update checks</title>
      <link>https://www.oxymoronical.com/blog/2009/03/Testing-the-background-update-checks/</link>
      <pubDate>Thu, 19 Mar 2009 13:02:36 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2009/03/Testing-the-background-update-checks/</guid>
      <description>&lt;p&gt;Firefox does a fair number of things in the background to help keep things up to date. This includes checking for updates to Firefox itself, checking for updates to add-ons you have installed and checking for updates to a blocklist that disables known unstable add-ons. Normally it does these things quite happily, but for developers and QA, trying to verify that these background tasks are doing what they are supposed to can be annoying. After all who wants to leave Firefox running for a day just to see if it finds a new update?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making Gallery2 understand ogg and use video tags</title>
      <link>https://www.oxymoronical.com/blog/2008/12/making-gallery2-understand-ogg-and-use-video-tags/</link>
      <pubDate>Mon, 15 Dec 2008 21:13:30 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2008/12/making-gallery2-understand-ogg-and-use-video-tags/</guid>
      <description>&lt;p&gt;One of the nice new features in the fast evolving &lt;a href=&#34;http://www.whatwg.org/specs/web-apps/current-work/&#34;&gt;HTML 5 spec&lt;/a&gt; is support for specific &lt;a href=&#34;https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox&#34;&gt;video and audio tags&lt;/a&gt;, replacing the more generic object and embed tags that have been used in the past. They have many benefits over the object tag such as a well defined JavaScript interface, controls provided by the browser and support for multiple formats for the browser to choose between for display. The current beta version of Firefox 3.1 supports this and includes support for playing the &lt;a href=&#34;http://en.wikipedia.org/wiki/Ogg&#34;&gt;Ogg format&lt;/a&gt; with &lt;a href=&#34;http://en.wikipedia.org/wiki/Theora&#34;&gt;Theora&lt;/a&gt; and &lt;a href=&#34;http://en.wikipedia.org/wiki/Vorbis&#34;&gt;Vorbis&lt;/a&gt; codecs included. Opera has &lt;a href=&#34;http://dev.opera.com/articles/view/a-call-for-video-on-the-web-opera-vid/&#34;&gt;support underway&lt;/a&gt; as well and it looks like the latest Safari releases also have it (though it seems broken in some respects).&lt;/p&gt;</description>
    </item>
    <item>
      <title>On Timezones, Testing and Deals with the Devil</title>
      <link>https://www.oxymoronical.com/blog/2008/03/On-Timezones-Testing-and-Deals-with-the-Devil/</link>
      <pubDate>Mon, 10 Mar 2008 16:04:18 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2008/03/On-Timezones-Testing-and-Deals-with-the-Devil/</guid>
      <description>&lt;p&gt;Timezones make my head hurt. Not the concept, that is easy, but writing code that works correctly in different timezones. Throw daylight savings correction into the mix and you’ll often find me in a corner rocking gently. The problem of course is that I frequently have to deal with data that isn’t just the standard unix timestamp (or various orders of magnitude away from). A number of times a load of information has been thrown away, never to be recovered which makes life interesting. You end up having to decide which is the best path to take when all of them are wrong in various ways.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Trimming the Fat</title>
      <link>https://www.oxymoronical.com/blog/2008/02/Trimming-the-Fat/</link>
      <pubDate>Fri, 08 Feb 2008 17:30:27 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2008/02/Trimming-the-Fat/</guid>
      <description>&lt;p&gt;As I mentioned in my last post and as I know everyone is well aware, tinderbox is starting to feel the strain. You already can’t just glance at it to see what is going on. The Firefox tree is currently showing build and test results from a total of 23 machines. The interesting thing is that not all of these machines are actually doing any compiling. The rest are merely running tests on builds produced by the other machines. That isn’t to say that those test results are less important but I wonder whether it is worth treating these differently.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Visualising our Labours</title>
      <link>https://www.oxymoronical.com/blog/2008/02/Visualising-our-Labours/</link>
      <pubDate>Tue, 05 Feb 2008 17:07:18 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2008/02/Visualising-our-Labours/</guid>
      <description>&lt;p&gt;Well it has been a mad few weeks. Between landing the new &lt;a href=&#34;http://madhava.com/egotism/archive/005011.html&#34;&gt;Get Add-ons pane&lt;/a&gt;, sheriffing the Firefox 3 beta 3 freeze, &lt;a href=&#34;http://bonsai.mozilla.org/cvsquery.cgi?module=PhoenixTinderbox&amp;amp;date=explicit&amp;amp;mindate=1201658283&amp;amp;maxdate=1201658500&#34;&gt;decimating&lt;/a&gt; old parts of the code and working through &lt;a href=&#34;https://bugzilla.mozilla.org/showdependencytree.cgi?id=404024&amp;amp;maxdepth=1&amp;amp;hide_resolved=0&#34;&gt;follow-up issues&lt;/a&gt; from the Get Add-ons pane and not to mention two 10 hour flights it really has been busy. Thankfully I’ve not just been totally buried under code, I’ve had some small spare time to tinker with a few other things (I need to to keep my sanity).&lt;/p&gt;</description>
    </item>
    <item>
      <title>ZipWriter is Here!</title>
      <link>https://www.oxymoronical.com/blog/2007/09/ZipWriter-is-Here/</link>
      <pubDate>Mon, 17 Sep 2007 16:04:11 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2007/09/ZipWriter-is-Here/</guid>
      <description>&lt;p&gt;Yes, finally after months of twiddling my thumbs waiting for approval to land the zipwriter component has gone into trunk, and is enabled for all applications (some apps might need to add the interface to their packages list). If you want to use check out the &lt;a href=&#34;http://mxr.mozilla.org/seamonkey/source/modules/libjar/zipwriter/public/nsIZipWriter.idl&#34;&gt;interface&lt;/a&gt;, it’s fairly well documented I think. That magic contract ID you need is “@mozilla.org/zipwriter;1”.&lt;/p&gt;&#xA;&lt;p&gt;It’s been quite a long process both writing the code, getting reviewed and getting agreement for it to appear in Firefox so I hope all you extension authors and application developers are going to make good use out of it in your projects. Let me know what you come up with.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Let the Testing Commence</title>
      <link>https://www.oxymoronical.com/blog/2007/08/Let-the-Testing-Commence/</link>
      <pubDate>Sun, 12 Aug 2007 06:38:49 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2007/08/Let-the-Testing-Commence/</guid>
      <description>&lt;p&gt;After a fair bit of work (feels like longer than 2 months) I’ve finally managed to get &lt;a href=&#34;https://bugzilla.mozilla.org/show_bug.cgi?id=382752&#34;&gt;bug 382752&lt;/a&gt; landed. What this gives us in simple terms is a set of functions that we can use in order to do unit testing on the extension manager. Alongside I have checked in the first unit test. Now if anything regresses &lt;a href=&#34;https://bugzilla.mozilla.org/show_bug.cgi?id=257155&#34;&gt;bug 257155&lt;/a&gt; we should know about it immediately.&lt;/p&gt;&#xA;&lt;p&gt;Ignoring the regression detection, I’ve always found unit tests to be fantastically useful when developing new code or fixing bugs. Zipwriter is a prime example, with a large number of tests that I can run by typing a single command I can test whether the changes I have made have solved the problem and not introduced any other errors.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Zip Writer Goodness</title>
      <link>https://www.oxymoronical.com/blog/2007/05/Zip-Writer-Goodness/</link>
      <pubDate>Fri, 04 May 2007 22:59:27 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2007/05/Zip-Writer-Goodness/</guid>
      <description>&lt;p&gt;I can’t believe it’s been over a month since I wrote something here. Well I kinda can, lots of hectic stuff going on at my work right now which has been making finding time for Mozilla stuff tricky. Hopefully not for much longer.&lt;/p&gt;&#xA;&lt;p&gt;I’m glad to say that I have managed to make great progress on the zip writer component. I have decided that dealing with multiple platform compiles for &lt;a href=&#34;https://www.oxymoronical.com/web/firefox/nightly&#34;&gt;Nightly Tester Tools&lt;/a&gt; is just a bad idea, so instead I have pushed on with submitting the zip writer to Mozilla for &lt;a href=&#34;https://bugzilla.mozilla.org/show_bug.cgi?id=379633&#34;&gt;review&lt;/a&gt;. Hopefully that will make it into tree where I (and of course anyone else) can just use it. There’s been a bunch of changes between the version I posted earlier and that that’s gone up for review, not least of which is a set of testcases that have made sure I didn’t break the old by making some clean-ups.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Zip Writer Update</title>
      <link>https://www.oxymoronical.com/blog/2007/03/Zip-Writer-Update/</link>
      <pubDate>Sun, 18 Mar 2007 22:06:05 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2007/03/Zip-Writer-Update/</guid>
      <description>&lt;p&gt;I spent some more time this weekend hacking on my Zip Writer component. It’s now pretty capable. It can open existing zip files and remove entries and append to them, happily rewriting the headers and everything exactly as it encountered them. And the other major win is that I have deflate code up and running which makes compression possible.&lt;/p&gt;&#xA;&lt;p&gt;All this has allowed me to reintroduce making extensions compatible during the install process in a far safer way than was the case before. NTT can now watch the EM datasource, spot that an extension has finished being downloaded, then open that extension’s xpi file and if necessary rewrite the metedata to claim compatibility with the current version of whatever app you happen to be running in.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Long Standing Crappiness</title>
      <link>https://www.oxymoronical.com/blog/2007/03/Long-Standing-Crappiness/</link>
      <pubDate>Tue, 06 Mar 2007 23:23:50 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2007/03/Long-Standing-Crappiness/</guid>
      <description>&lt;p&gt;So there’s been this &lt;a href=&#34;https://bugzilla.mozilla.org/show_bug.cgi?id=319196&#34;&gt;bug&lt;/a&gt; in Firefox for … well quite a while where it would suddenly stop remembering your toolbar customisations, window positions and even make your bookmarks appear to not be there, and in Firefox 1.5, make the search bar non-functional.&lt;/p&gt;&#xA;&lt;p&gt;Well I’m quite proud to say that after quite a lot of research, and help from those guys doing Firefox support, particularly stevee, I think I have a fix for at least part of the problem. This bug (or at least the part I’m interested in) is all caused by one corrupt file. For quite some time I was unable to reproduce, and it turns out that that’s because the issue actually resolves itself in Minefield which is what I use day to day. Once I started testing on BonEcho it became pretty obvious what was going on. So the patch I’ve just posted for review basically spots a corrupt file on startup, and deletes it. Short and sweet.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Zip Writer</title>
      <link>https://www.oxymoronical.com/blog/2007/03/Zip-Writer/</link>
      <pubDate>Mon, 05 Mar 2007 00:00:00 +0000</pubDate>
      <guid>https://www.oxymoronical.com/blog/2007/03/Zip-Writer/</guid>
      <description>&lt;p&gt;One of the annoying omissions from the Mozilla platform has always been the inability to create a zip file. It’s been bugging me for some time since it’s the only way for &lt;a href=&#34;https://www.oxymoronical.com/web/firefox/nightly&#34;&gt;Nightly Tester Tools&lt;/a&gt; to properly manage overriding compatibility for an individual extension install, without doing dangerous things like it used to. There’s been a &lt;a href=&#34;https://bugzilla.mozilla.org/show_bug.cgi?id=338987&#34;&gt;Google Summer of Code&lt;/a&gt; project on creating such functionality but it didn’t get all that far.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
