With the web slowly maturing as a platform the demand for cryptography in the browser has risen, especially in a post-Snowden era. Many of us have heard about the upcoming Web Cryptography API but at the time of writing there seem to be no good introductions available. We will take a look at the proposed W3C spec and its current state of implementation.
September 13, 2014
August 01, 2014
Search is a large part of mobile browser usage, so we (the Firefox for Android team) decided to experiment with ways to improve our search experience for users. As an initial goal, we decided to look into how we can make search faster. To explore this space, we’re about to enable two new features in Nightly: a search activity and a home screen widget.
Android allows apps to register to handle an “assist” intent, which is triggered by the swipe-up gesture on Nexus devices. We decided to hook into this intent to launch a quick, lightweight search experience for Firefox for Android users.
Right now we’re using Yahoo! to power search suggestions and results, but we have patches in the works to let users choose their own search engine. Tapping on results will launch users back into their normal Firefox for Android experience.
We also created a simple home screen widget to help users quickly launch this search activity even if they’re not using a Nexus device. As a bonus, this widget also lets users quickly open a new tab in Firefox for Android.
We are still in the early phases of design and development, so be prepared to see changes as we iterate to improve this search experience. We have a few telemetry probes in place to let us gather data on how people are using these new search features, but we’d also love to hear your feedback!
You can find links to relevant bugs on our project wiki page. As always, discussion about Firefox for Android development happens on the mobile-firefox-dev mailing list and in #mobile on IRC. And we’re always looking for new contributors if you’d like to get involved!
July 24, 2014
The awesomebar in Firefox Desktop has been so far driven by two autocomplete searches implemented by the Places component:
- history: managing switch-to-tab, adaptive and browsing history, bookmarks, keywords and tags
- urlinline: managing autoFill results
Moving on, we plan to improve the awesomebar contents making them even more awesome and personal, but the current architecture complicates things.
Some of the possible improvements suggested include:
- Better identify searches among the results
- Allow the user to easily find favorite search engine
- Always show the action performed by Enter/Go
- Separate searches from history
- Improve the styling to make each part more distinguishable
When working on these changes we don't want to spend time fighting with outdated architecture choices:
- Having concurrent searches makes hard to insert new entries and ensure the order is appropriate
- Having the first popup entry disagree with the autoFill entry makes hard to guess the expected action
- There's quite some duplicate code and logic
- All of this code predates nice stuff like Sqlite.jsm, Task.jsm, Preferences.js
- The existing code is scary to work with and sometimes obscure
Due to these reasons, we decided to merge the existing components into a single new component called UnifiedComplete (toolkit/components/places/UnifiedComplete.js), that will take care of both autoFill and popup results. While the component has been rewritten from scratch, we were able to re-use most of the old logic that was well tested and appreciated. We were also able to retain all of the unit tests, that have been also rewritten, making them use a single harness (you can find them in toolkit/components/places/tests/unifiedcomplete/).
So, the actual question is: which differences should I expect from this change?
- The autoFill result will now always cope with the first popup entry. Though note the behavior didn't change, we will still autoFill up to the first '/'. This means a new popup entry is inserted as the top match.
- All initialization is now asynchronous, so the UI should not lag anymore at the first awesomebar search
- The searches are serialized differently, responsiveness timing may differ, usually improve
- Installed search engines will be suggested along with other matches to improve their discoverability
The component is currently disabled, but I will shortly push a patch to flip the pref that enables it. The preference to control whether to use new or old components is browser.urlbar.unifiedcomplete, you can already set it to true into your current Nightly build to enable it.
This also means old components will shortly be deprecated and won't be maintained anymore. That won't happen until we are completely satisfied with the new component, but you should start looking at the new one if you use autocomplete in your project. Regardless we'll add console warnings at least 2 versions before complete removal.
If you notice anything wrong with the new awesomebar behavior please file a bug in Toolkit/Places and make it block Bug UnifiedComplete so we are notified of it and can improve the handling before we reach the first Release.
May 28, 2014
Part of the performance improvements we planned for Places, the history, bookmarking and tagging subsystem of Firefox, involved changes to the way we generate bookmarks backups.
As you may know, Firefox stores almost everyday a backup of your bookmarks into the profile folder, as a JSON file. The process, so far, had various issues:
- it was completely synchronous, I/O on main-thread is evil
- it was also doing a lot more I/O than needed
- it was using expensive live-updating Places results, instead of a static snapshot
- backups take up quite some space in the profile folder
- We were creating useless duplicate backups
- We were slowing down Firefox shutdown
- the code was old and ugly
The first step was to reorganize the code and APIs, Raymond Lee and Andres Hernandez took care of most of this part. Most of the existing code was converted to use the new async tools (like Task, Promises and Sqlite.jsm) and old synchronous APIs were deprecated with loud console warnings.
The second step was dedicated to some user-facing improvements. We must ensure the user can revert to the best possible status, but it was basically impossibile to distinguish backups created before a corruption from the ones created after it, so we added the size and bookmarks count to each backup. They are now visible in the Library / Restore menu.
Once we had a complete async API exposed and all of the internal consumers were converted to it, we could start rewriting the internals. We replaced the expensive Places result with a direct async SQL query reading the whole bookmarks tree at once. Raymond started working on this, I completed and landed it and, a few days ago, Asaf Romano further improved this new API. It is much faster than before (initial measurements have shown a 10x improvement) and it's also off the main-thread.
Along the process I also removed the backups-on-shutdown code, in favor of an idle-only behavior. Before this change we were trying to backup on an idle of 15 minutes, if we could not find a long enough interval we were enforcing a backup on shutdown. This means, in some cases, we were delaying the browser shutdown by seconds. Currently we look for an 8 minutes idle, if after 3 days we could not find a long enough interval, we cut the idle interval to 4 minutes (note: we started from a larger time and just recently tweaked it based on telemetry data).
At that point we had an async backups system, a little bit more user-friendly and doing less I/O. But we still had some issues to resolve.
First, we added an md5 hash to each backup, representing its contents, so we can avoid replacing a still valid backup, thus providing more meaningful backups to the user and reducing I/O considerably.
Then the only remaining piece of work was to reduce the footprint of backups in the profile folder, both for space and I/O reasons. Luckily we have an awesome community! Althaf Hameez, a community member, volunteered to help us completing this work. Bug 818587 landed recently, providing lz4-like compression to the backups: automatic backups are compressed and have .jsonlz4 extension, while manual backups are still plain-text, to allow sharing them easily with third party software or previous versions.
Finally, I want to note that we are now re-using most of the changed code also for bookmarks.html files. While these are no more our main exporting format, we still support them for default bookmarks import and bookmarks exchange with third party services or other browsers. So we obtained the same nice perf improvements for them.
Apart from some minor regressions, that are currently being worked on by Althaf himself, who kindly accepted to help us further, we are at the end of this long trip. If you want to read some more gory details about the path that brought us here, you can sneak into the dependency tree of bug 818399. If you find any bugs related to bookmark backups, please file a bug in Toolkit / Places.
May 09, 2014
Update — 2014/05/28
I added a slideshow of some of the design iterations we went through from Firefox 4 to Firefox 29.
Warning: It’s image heavy, might take a while to load on a slow connection.
We spent a lot of time on it.
Dedicating yourself to a project can become an intense experience. You think about it all the time: in the morning, at dinner, when you are trying to watch a movie, in the shower, in your sleep, when you should be sleeping…
But then you set it free, because it’s finally mature enough for that. It’s exciting. But it’s also really scary. You are never sure if you made the right decisions along the way. I like to take some time in the post release glow for some reflection.
We launched Firefox 4 in March 2011. It was a big change from Firefox 3. It introduced the Firefox button, revamped the add-ons manager, removed the status bar, combined the stop, go and reload buttons and included a comprehensive visual update—all while still having time to prototype and discard some other features along the way.
And yet it wasn’t perfect. It had a lot of the rough edges that projects accumulate in the process of going from being designed and built to being shipped.
Firefox 4 was our last monolithic release before we moved to a rapid release cycle. Six week cycles seemed like the perfect timeframe to iteratively smooth out the rough edges. So I created a project to do just that.
The project that I had created for iterative refinement however quickly transformed into a significant overhaul.
At the beginning of June the UX team met up for its first post Firefox 4 team offsite. On the agenda was figuring out “What’s next?”. The entire team gathered in a room to pitch ideas and talk about problems unresolved—or that had been introduced—during the development of Firefox 4.
One theme that had been floating around for a while rose to the surface— Firefox is about customization, it should feel like it’s yours.
What would this mean for the interface we had just shipped? A lot of ideas were tossed around. Eventually one guiding principal stuck—make the best core experience we can and allow users to add and change the things that matter the most to them.
Building a fun easy to use Customization Mode—along with a more flexible Firefox Menu—would become the foundation of the new Firefox.
So Curve, Such Aerodynamic
The offsite also sparked a set of other ideas that would make up what became known as Australis. Primarily: unifying the disparate bookmarking elements in the main window, refining the visual design, consolidating related or redundant features and streamlining the tabstrip.
While the redesigned customization mode would be core to the experience—the redesigned tabstrip would change the entire profile of Firefox.
We had explored the idea of adding visual cues to Firefox to make it feel faster and smoother before. Yet some of the ideas were a little over the top.
This sketch from the design session—inspired by a previous mockup from Trond—had a curvy tab shape that immediately resonated with everyone.
It also had one important additional design tweak—only render the tab shape for the active tab. Highlighting the active tab reduces visual noise and makes it easier to keep your place in the tabstrip.
The early curve shape tried on a few looks. At first it was too angular, then it was too curvy, then it was too short, then it was too tall and then (finally) it was just right.
It turns out that designing background tabs without a tab shape is a lot easier if you have a stable background to work with. Windows 7 has translucent windows of variable tints and Windows 8 has flat windows of variable color. This meant we needed to create our own stable background.
We went through several variations to ensure that the background tabs would be legible. First we tried creating a unified background block, but it seemed too heavy. We even thought about keeping background tab shapes and highlighting the active tab in some other way.
Eventually we decided on a background “fog” that would sit behind the tabs and in front of the window. Think of it as an interface sandwich—glass back, curvy-tab front with a delicious foggy center.
We also made sure that adding curves didn’t increase the width of the tabs taking up precious tabstrip real estate. And we removed the blank favicon placeholder for sites without favicons. A small tweak that frees up some extra room for the title.
Wrapping it up
Thank you to everyone who dedicated so much time and effort into making this happen.
If you want to know more about the people and process behind Firefox 29, Madhava has a good post with an overview.
I think the post-release glow is over now. Time to get back to making Firefox better.
May 05, 2014
Apparently Firefox 29 had some major feature or something. I don’t know much about that. What I do know about is a new Firefox feature that will finally cause Firefox to beat Chrome once and for all. Yes ladies and gentlemen, I am talking about a revolutionary feature I’ve dubbed:
Scheme typo fixer-upper™©
Have you ever copy and pasted URLs into the location bar and seen this screen instead of the page you wanted?
Of course you have. So you double check the URL and go “ooooooooh, I missed the h in http when copying and pasting.” Stupid me. Well, at least Firefox gave me an obtuse message to tell me what is going on. How lovely.
So, this happened to me one too many times. And I got pissed. And I had a conversation with my browser. I was probably drinking so it made sense at the time. The conversation went something like this:
WTF Firefox. You KNOW what I meant. Stop being a dick and just do the right thing™.
And then it reminded me of one of the very first “cool” things I experienced at Facebook. Facebook uses Phabricator and Arcanist for their development workflow. Arc (like Mozilla’s Mach) is a local tool to run builds, send up diffs, manage patches, and things of that persuasion. One of the things you do with arc is run `arc build`.
Well guess what happened. My first day at Facebook I typed `arc biuld` instead of `arc build`. I’m such an idiot. They should have fired me. Much to my delight I saw this:
Assuming 'biuld' is the British spelling of 'build'...
And it hit me. Someone was THINKING. They encountered this problem, thought about how many people would do that typo, realized there was really only one possible intended result, and decided to have the computer just do the right thing™. Someone cared about engineer time so much they fixed it for every future engineer to come. The thought and whimsical message made such a large impression on me I insisted we add a similar feature to Buck, Facebook’s super-fast Android build tool:
$ ./bin/buck biuld No sign of buck.jar -- building Buck!
It uses Levenshtein distance to figure out what you really meant to type. Humans: 1, machines: 0. Sweet.
So right about here I am likely supposed to point out Facebook (and specifically my team) is hiring. Cool, I’ve now done my duty as a manager–that should keep the recruiting attack dogs at bay.
Where was I? Oh yeah, man over machine. So I started thinking, which is never a good thing. This sort of thing happens to me every day and slows me down a lot. For example, if I type `git cone` instead of `git clone`:
$ /usr/bin/git cone git: 'cone' is not a git command. See 'git --help'. Did you mean this? clone
You know DAMN WELL what I meant git, and you mock me by echoing it out right in front of me. You spit in my face and just sit there all smug about it. What a dick.
So I went to teach git some manners, and it turns out the feature is already there. If you set help.autocorrect git will do the right thing™. There was a bug about making it default but I lost interest reading it to figure out why they insist on making humans do the work of computers. As an aside, do you know the git developers only take contributions as patches to a mailing list? Coding like we’re in the 90s, whooooooo!
Get. To. The. Point.
What does this have to do with Firefox you might ask? What, you don’t like my stories? Fine! Remember the screenshot at the beginning:
I started thinking how stupid Firefox was being, how many wasted human-hours were spent reading the message and acting on it, and how much goodwill Firefox loses when its users roll their eyes at this screen.
And it made me angry. So I decided to fix it. How hard could it be? Alcohol may have been a factor in my difficulty calculation. But I did it! The proof is a screenshot of Google:
I typed in “ttps://google.com” and was taken to “https://google.com” automatically without seeing an error screen! Firefox will now fix all these typos:
ttp:// → http:// ttps:// → https:// tps:// → https:// ps:// → https:// ile:// → file:// le:// → file://
Humans: 2, machines: 0.
Err, ok, this feature doesn’t screenshot well. Just trust me it works. But you probably don’t trust me. I wouldn’t. Try it yourself in any flavor of Firefox > 29! Go ahead, I’ll wait.
Did it work? Of course it did! Oh damn, you tried “hptts” and it didn’t get fixed? My change only deals with dropped characters and not jumbled character typos. It’s not a bug because I documented it™. To be honest I am lazy and lost interest after I fixed my copy and paste pain but it would be trivial to extend my patch to cover the latter case. Get in touch and I can mentor you! Take a look at the code (part 1, part 2). And there are tests! I mainly wrote those to not be a hypocrite as I preach the unit test gospel to product engineers every day. Oh, and for “quality”.
Turns out this life-changing feature was a lot more involved than expected, for two reasons.
First, I naively assumed there would be one location where everything gets loaded from the location bar input. To me that was a sensible way of organizing things. I could then just do a string match on the URL scheme and replace it with the right stuff…easy peasy, right? Errr, no. Turns out Firefox is…interesting. And on a lot of platforms with different UI code.
I kept digging deeper in the stack and when I got to where I needed (docshell) it wasn’t the right place for the fix at all. I’d potentially break web compatibility. Whoops. Rather than doing a simple fix at a lower-level chokepoint I needed to patch in optional support to that low-level and then hunt down every place Firefox takes in URLs and do the typo fixup. And then of course my first patch didn’t work due to a last-minute change and I had to fix things up in a second patch. See the gory details in the bug.
Second, Mozilla’s current setup is very developer-hostile. And that isn’t just “OMGWTFBBQ why isn’t Firefox on teh GitHubz!” and “lke dis if u cry evry tme u tuch c++”. Seriously, I do not know how Firefox developers get any work done. I would quit if I was forced to work on Firefox code all day. I’m not talking about code quality, I’m talking about supporting stuff–from build times, to no linters, to crufty code-search tools, to horrible code review, to dealing with no CI. I think I’ve been spoiled at Facebook as we invest heavily in speeding up the development workflow (we’re hiring!). I have more thoughts on this I intend to blog later, but to my Mozilla friends it doesn’t need to be like this. Expect more from your tools and development workflow!
Ahem. I’ll get off my soapbox and save my fire and brimstone tools talk for another day.
Please enjoy the best feature Mozilla has shipped since Firefox 1.0 – the Scheme typo fixer-upper™©! If you encounter problems feel free to file bugs on me and I will promptly ignore them.
April 30, 2014
For the past few months, the Firefox for Android team has been working on Firefox Hub, a project to make your home page more customizable and extensible. At its core, this feature is a set of new APIs that allows add-ons to add new content to the Firefox for Android home page.
These APIs are new in Firefox 30, but there are even more features available in Firefox 31, which is moving to Aurora this week. As we’ve been working on these APIs, we’ve been building plenty of demo add-ons ourselves, but we’re at the point where we want more developers to get involved!
Next week (May 5-9), we’re holding a distributed add-on hackathon to encourage more people to start building things with these APIs, and I want to encourage anyone who’s interested to participate!
This hackathon has three main goals:
- Find bugs with the APIs
- Find bugs with the documentation
- Start building a collection of awesome add-ons
To kick off this hackathon, I made an etherpad that links to documentation, example add-ons, and a long list of new add-on ideas. Since our community lives all over the world, we’ll hang out in #mobile on irc.mozilla.org to ask questions, report problems, and share progress on things we’re making. In addition to building add-ons, you can also participate by testing new add-ons as they’re made!
At the end of the week, everyone who participated in the hackathon will receive a special limited-edition open badge, as well as pride in contributing to Firefox for Android. And maybe I’ll try to dig up some special prizes for anyone who makes a really cool add-on :)
April 29, 2014
April 15, 2014
- Open up the screenshot review tool and enter a nickname to log in (there may be a small reward for the most valuable contributions so keep that in mind when choosing)
- A random screenshot will be displayed where you can simply identify any visual issues related to the new user interface that you may see. Simply drag to select the region of the image and add a comment (and optionally a bug number). See an example.
- When you're done reviewing that image, simply click the button to get another and go to step 2. Endless fun ensues!
April 07, 2014
If you ever wondered what contributing to Firefox feels like but you never had the time to read and follow through our instructions to setup a build environment or wanted to avoid screwing around with your precious system then this might be for you.
This article will guide you through a small list of steps that in the end will leave you with a virtual machine ready to modify and build your own development version of Firefox.
I hope this will be valuable to novice programmers that do not have a full C++ development environment at hand as well as to the more experienced folks with little time and lots of curiosity.
Note: The Open Virtualization Format (OVF) is supported by other Virtualization Environments such as VMWare, etc. You can use those if already installed instead of VirtualBox.
Go to the VirtualBox Downloads page and download the latest version available for your operating system. Should you already have VirtualBox installed then please ensure you are running the latest version by checking for updates before continuing.
Download the Firefox Build Environment
Now is the time to download the virtual machine containing our development environment ready to modify and build Firefox. You can get it here:
(sha1 = 2bc7ea3d831163e507129353b0c5306ab30f18aa)
Downloading ~2.8 GB might take a while if you are on a slow connection, sorry.
Set up the virtual machine
Once the image has been downloaded you can double-click the .ova file and import the new virtual machine into VirtualBox. Please give it at least 2048MB of RAM (4096MB if you can) and the same number of processors that your host machine has available. Building Firefox takes up a lot of resources and you want it to build as fast as possible.
Now that your virtual machine is ready, boot it and wait for the Ubuntu desktop to be shown. A terminal will pop up automatically and do some last steps before we can get started. After a successful installation Sublime 2 should start automatically.
Note: Should you ever need root credentials, use “firefox-dev” as the password. If you want to change your Language and Keyboard settings then follow the instructions on How to change the UI Language in Ubuntu.
Tools > Build to start the process. This might take a long time
depending on the features of your host machine, please be patient. You can
watch the build progress in the text editor’s console at the bottom. Once the
build has finished you can use
Tools > Run to start your custom Firefox
build and check that everything works as expected.
Note: if you want to switch from an optimized to a debug build then choose
Tools > Build System > Firefox (Debug)and hit
Tools > Buildagain to start a debug build.
You successfully built Firefox for the first time and wonder what’s next? How about picking a small bug for a start, contribute code and get your changes shipped to half a billion people? If that sounds compelling then take a look at Bugs Ahoy! and find something to work on that sounds interesting to you.
If you are interested in digging deeper into the build system or the version control system, or want to know more about how to create your first patch and post it to our bug tracker then take a look at our Code Firefox Lessons.
I would love to hear your feedback about the Firefox Build Environment! Please tell me what can be improved and what you would like to see in the next version. Do not hesitate to drop me a mail should you have a more detailed opinion.
April 04, 2014
Today marks the beginning of my fourth year at Mozilla. It has been an amazing three years and the best job I could hope for. Since March I am now in the position of an Engineering Manager with a few highly intelligent and great people that I am very grateful to call my team.
I am super excited about all the personal and professional challenges I will be facing this year. It is my core belief that it is all about growth and for that Mozilla is exactly the right place to be.
March 27, 2014
I’m pleased to announce two additions to the list of Firefox reviewers:
- Florian Quèze has recently joined the Firefox team, and we’re very happy to have him. Florian has a long history with Mozilla, including a Google Summer of Code working on Firefox Page Info, an internship working on Firefox 3, experience founding and leading the Instantbird project, and most recently work on Talkilla. He’s now helping Felipe and others with work on building translation feature for Firefox, and his extensive Mozilla knowledge will serve him well in reviewing Firefox patches.
- Mike de Boer joined the Firefox team over a year ago now, and has largely been focused on helping the team ship Australis. He’s been reviewing plenty of patches on the team’s epic journey towards shipping the new look and customization system, and the fact that I’m only adding him to the reviewers list now is a failure on my part!
Please join me in congratulating Mike and Florian!
March 23, 2014
In shortIf you are making a base Firefox profile which will be deployed to other machines, be sure to delete the profile lock files before creating the template/image. The filenames to delete vary by operating system and can be found in the roaming profile directory:
lock(this was used a long time ago on Unix/Linux)
Longer versionIn the past (prior to bug 294260 in Firefox 13), the profile lock files (mentioned above) would be deleted upon successful shutdown of the Mozilla application. Since bug 294260, we now leave the profile lock files in place and simply update the existing file (and thus its modification time). We use the modification time and a preference to detect startup crashes related to the profile. In this case that means a crash from the time of locking the profile to the browser window appearing for 30 seconds. If the timestamp of the profile lock file doesn't match what was stored in the preferences, we assume that there was a crash in the last startup before it got to updating the preference. After three consecutive startup crashes detected within 6 hours, we will ask the user if they want to reset their profile or enter safe mode to resolve the crashes.
Offering to reset unused profilesMore recently, we added a new use of the last time of profile use in order to detect profiles which hadn't been used in a while (60 days) and offer to reset them (bug 498181 in Firefox 25). The idea is that there are people returning to Firefox after having been away for a while using another browser and they'd like to give Firefox another try. If they left Firefox due to technical issues such as slow startup or crashes, we don't want them to return to that problem and so we offer a reset as a way to get a fresher Firefox experience while still preserving key data such as bookmarks, history, passwords, etc. (the list is outlined in the reset dialog). If the profile lock file is part of a base profile or image like DeepFreeze and its timestamp is more than 60 days ago users may get prompted to reset immediately. Some users have already run into this and that's what prompted this email. In summary, the profile lock file must accurately reflect when the profile was last locked. Deleting it from base profiles is the best way to do this. Let me know in the comments if you have any questions.
March 18, 2014
On Friday, Mozilla announced it would not ship its Modern UI Firefox browser due to low adoption.
Is Windows 8.1 modern UI in trouble?
Did Mozilla make the right decision with Metro given the current circumstances?
Modern UI Firefox usage, in Mozilla's measurements, is not necessarily a true reflection of Modern UI usage in general.
Modern UI Firefox Usage != Modern UI usage
I do believe that Microsoft's modern UI is important for touch hardware, and I do believe that touch hardware is something people are adopting and will adopt more.
I believe that the Modern UI Firefox usage was low, at least in part, for 2 specific reasons:
Microsoft doesn't allow your browser to run in Modern UI unless you are the default browser. Several people could have had a Modern UI capable Firefox pre-releases installed, but just never knew it.
Microsoft makes it a lot harder to set your browser as the default in Windows 8. Before Windows 8, each browser could prompt you, and then they could set your default for you. As of Windows 8 you need to ask first, then tell Microsoft to show a prompt that shows a list of browsers (confusing). And that only sets the HTTP default. If you want all defaults, such as HTML and HTTP, then you have to send the user to control panel, make them search for the browser, then make them select your browser and set all defaults.
It would be great if Microsoft could fix these issues around default status. More competition leads to better software, and having good software on your platform is important. Every Windows Modern UI user loses when there's only one Modern UI browser choice.
March 14, 2014
I made one of the hardest decisions of my life, I'll be leaving Mozilla, a company that I thought I'd be at forever. Mozilla has amazing people and culture, and is easily the best job I've ever had.
I plan to remain a contributor, both on the Code Firefox site, and on Firefox Desktop itself.
I'll be joining Khan Academy, a like minded, mission oriented, open and non-profit company.
Khan Academy provides a free, world class education, to anyone, anywhere.
I'm leaving because the Khan Academy mission speaks more to me personally.
Along with that mission comes a lot of thoughts I believe in, such as:
- Sense of agency: Students should be responsible for their own educational goals.
- Mastery based learning: Students should have deep, sound understanding of concepts before progressing to concepts based on those concepts.
- Self paced learning: Students should progress at their own pace, as they've mastered concepts.
- Mentorship: Having peers teach, and having peers learn from each other comes with several amazing benefits.
- Interactive: Human connection and tangible experiences are important.
I'll be joining the Computer Science department at Khan Academy in particular. I'm extremely excited for this new opportunity and I can't wait to do amazing things at Khan Academy.
March 06, 2014
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.
After that everyone got started prototyping new ideas, hacking on features and fixing bugs. The amount of work that happens at these meet-ups is always mind-blowing and this week was no exception, even one of our contributors got in on the action. Here is a list of the things that the team demoed on Friday:
- Joe Walker showed off CSS and JS code coverage tools.
- Rob Campbell showed us status codes and image previews in the network monitor as well as Mihai’s patches for nicer output and cd in the web console.
- Anton Kovalyov demonstrated a sourceeditor add-on that embeds metrics and contextual information into the code you see.
- Alex Poirot showed UI to select which frames in the page or Firefox OS app to monitor in the developer toolbox.
- Brandon Benvie amazed us with autocompletion and type inference using tern.
- Irakli Gozalishvili developed a plugin for Light Table that allowed it to connect to Firefox through the debugging protocol.
- Victor Porof made game developers happy with a demo of a canvas tracer.
- Patrick Brosset made the inspector show badly formed style entries and synced changes between the inspector and style editor.
- I made the box model view in the inspector editable for on the fly layout tinkering.
- Mike Ratcliffe added events and font tooltips to the inspector as well as creating a test log syntax highlighter for Sublime Text.
- Jordan Santell created a tool for viewing, editing and debugging web audio nodes.
- Erik Vold made Itchpad able to live edit add-ons.
- Brian Grinstead improved itchpad with drag and drop file manipulation and file/folder watching.
- Jeff Griffiths showed off a telemetry dashboard.
- One of our contributors, Optimizer, dialled in to show off his storage inspector.
- Panagiotis Astithas played with some widgets for a small live view of Firefox’s performance.
- Will Bamberg created an add-on to add tooltips to CSS rules in the inspector which showed documentation from MDN.
- Jan Keromnes showed more metrics and settings for the developer HUD in Firefox OS.
- Soledad Penades created app templates to help new developers get started quickly.
- Ryan Stinnett wirelessly debugged of Firefox OS with autodiscovery.
- Jan Odvarko showed off Firebug debugging dynamic scripts like eval.
- Eddy Bruel demonstrated some of his work on making workers debuggable.
- Mateo Ferretti showed us a game that you play by using the developer tools.
This only covers the work demoed on Friday, a whole lot more went on during the week as a big reason for doing these meet-ups is so that groups can split off to have important discussions. We had Darrin Henein on hand to help out with UX designs for some of the tools and Kyle Huey joined us for a couple of days to help work out the final kinks in the plan for debugging workers. Lot’s of work went on to iron out some of the kinks in the new add-on SDK widgets for Australis, there were discussions about memory and performance tools as well as some talk about how to simplify child processes for Firefox OS and electrolysis.
Of course there was also ample time in the evenings for the teams to socialise. One of the downsides of being a globally distributed team is that getting to know one another and building close working relationships can be difficult over electronic forms of communication so we find that it’s very important to all come together in one place to meet face to face. We’re all looking forward to doing it again in about six months time.
March 05, 2014
This week the whole devtools group has been sequestered in Mozilla’s Portland office having one of our regular meet-ups. As always it’s been a fantastically productive week with lots of demos to show for it. I’ll be writing a longer write-up later but I wanted to post about what I played with over the week.
My wife does the odd bit of web development on the side. For a long time she was a loyal Firebug user and a while ago I asked her what she thought of Firefox’s built in devtools. She quickly pointed out a couple of features that Firebug had that Firefox did not. As I was leaving for this week I mentioned I’d be with the devtools group and she asked whether her features had been fixed yet. It turns out that colour swatches had been but the box model still wasn’t editable. So I figured I could earn myself some brownie points by hacking on that this week.
The goal here is to be able to inspect an element on the page, pull up the box model and be able to quickly play with the margins, borders and padding to tweak the positioning until it looks right. Then armed with the right values you can go update your stylesheets. It saves a lot of trial and error with positioning.
It turned out to be relatively simple to implement a pretty full version. The feature allows you to click one of the box model values and type whatever value you like, in any CSS unit you prefer. If the size had been set in the stylesheet in some specific unit then that is what appears in the input box for you to change. Better yet as you type numbers the element updates in the page on the fly and you can use the arrow keys to increase/decrease the value until you’re happy. It’s a really natural way to play with the element’s position.
The changes made appear on the element so you can find them in the rule view pretty easily. This patch is based on an updated version of the box model view which is why it looks so different to existing Firefox, all my work does is make the numbers editable.
I actually completed this so quickly that I decided to take this one step further. One thing missing from the box model display is information about border colours. So I added some colour swatches for each border and made them editable with the regular devtools colour picker.
Both of these patches are pretty much complete but they’ll have to wait for the new box model highlighter to be complete before they can be reviewed and land.
Mozilla 2014 Goal
As Deb Cohen (VP, Chief of People) said:
Our goal this year is to find new ways for people to become part of us.
This year we have a very aggressive goal, for all of us to look inside our teams, our work, our organization, and create some of these pathways.
What is Code Firefox?
The Code Firefox site (@codefirefox), is a new video and exercise framework which is highly inspired by Khan Academy. Its purpose is for on-boarding contributors and sharpening the skills of existing community members.
People learn differently. Providing different ways to consume information is crucial to growing Mozilla. For many people, Code Firefox provides an easier, and more consumable approach to learning how to contribute to Mozilla.
One prime example of Code Firefox's usefulness is of a new contributor who joined last month, and actively uses Code Firefox. He has already submitted 18 patches.
In a personal email Anuj Agarwal (Student at Vellore Institute of Technology) writes:
Just for fun, here is the patch I got reviewed today! And it was made possible only because of your tutorials. Thank you!
Code Firefox statistics
The site has not been promoted yet, but it already has:
- ~46,000 unique visits since it was released on October 30, 2013
- ~10,000 full video views across the 53 videos
- Most functionality is available without accounts, but there are still over 110 Code Firefox accounts and 35 YouTube subscribers. Most of these accounts are new Bugzilla users as well and several have patches.
What has Code Firefox accomplished?
51 videos, 3 exercises focused mostly on on-boarding new Firefox developers
Videos are captioned
Ability to track watched videos and completed exercises when logged in
Exercise framework that parses code and gives immediate feedback and experience
Videos and Exercises are accessible and searchable through tags
Where is the Code Firefox site going? (Code Firefox Goals)
Opening up the ability to post videos to other people
Ability to create different "Outline tracks", for example, a QA track.
More video and exercise content being added, initially for Firefox OS and Desktop
Integrate with Mozilla Open Badges
Working more closely with Student Ambassadors
Implement a point system
Interoperability with Mozillians in creative ways
Implementing hints for exercises
Highlights of benefits gained by Mozilla from the site
Brings in new contributors
Retains new and existing contributors
Sharpens skills of existing members of our community
Code Firefox uses and promotes Persona
Code Firefox will use and promotes Open Badges
Will train employees with advanced skills with advanced tracks
Media coverage of Code Firefox so far
Some people have taken the time to write about Code Firefox:
- GigaOM: Mozilla developer creates curriculum to on-board new contributors to Firefox by Lauren Hockenson
- I Programmer: ABCs of Firefox Dev in Easy Videos by Ian Elliot
- Teaching people to think about code instead of acing a test by Christian Heilmann
- Very positive feedback from the software development community
- Hundreds of other tweets about Code Firefox
What our community is saying
Robert O'Callahan (Distinguished Engineer):
In all my years with Mozilla I've never seen such an exciting effort to engage new Firefox contributors. Well done!
Josh Matthews (Community Engagement Lead):
To me, Code Firefox's value lies in the clear, forthright instruction provided, along with the bite-sized nature of the lessons, which provides a counterpoint to the existing long-winded and slightly overwhelming textual documentation. I have interacted with countless potential volunteers over the past several years, and there is a non-trivial segment of the population that immediately looks for instructional videos to aid in understanding. In addition, perhaps counter-intuitively, video explanations are often preferred by non-native English speakers as a visual reference to aid in comprehension, and I'm often asked at events whether these exist for Firefox development.
Chris Peterson (Engineering Program Manager):
Facebook has its infamous bootcamp for new employees. Code Firefox should be required watching, end-to-end, for all new Mozilla engineers. Even non-engineers can benefit from the introductory videos. Given the positive community response and patches to prove it, Brian has shown that this e-learning format works. More than just lessons, Brian has built Code Firefox as a platform. I would love to see other Mozilla teams contribute videos for their feature areas. Even within Mozilla we have some technology silos that could learn from each other.
Lukas Blakk (Senior Release Manager):
Getting into Open Source contribution is not always a clear path. In my experience, it took me 4 different attempts (MDN, Sumo, QA, AMO) before I found my path for a deeper dive and got 'hooked' on contributing to Mozilla. These videos and the technical mentorship they provide is already proving to be a valuable resource for engaging new coders and that is an area that can be hardest for a newcomer to break into alone since we are now such a legacy project. Fortunately Code Firefox is also a budding online community and that ensures no one is ever truly alone as they move up in their learning. Having someone (or several people) getting to focus more time on this particular pathway will ensure more robust community surrounds our software products and makes what we give back a product that is a reflection of that wider community. Win-win.
Jared Wein (Firefox Engineer):
Code Firefox is an amazing site that is full of detailed, finely-crafted videos that guide interested people from being Firefox users to Firefox contributors. It is an invaluable tool and one that I wished was around when I was just getting started contributing to Firefox. Projects the size of Firefox can be very daunting and scary to newcomers. The tutorials on the site bring a level of comfort not found in many other places, and walk people through steps at a pace that they can handle. Before they know it they are knee deep in a great community of people who are working together to make Firefox and the Internet a better place for everyone.
David Boswell (Community Engagement Lead):
Code Firefox and other efforts to help support coding contributors are crucial to growing and empowering new members of the Mozilla community.
Kamil Jozwiak (QA Engineer):
Code Firefox has helped me out tremendously while I was contributing to Mozilla. It helped me complete my first patch and it's an amazing resource to sharpen your skills. I'm a Code Firefox lifer and visit the site on a daily basis to see if anything new has been added. I really believe in this project and I know from first hand experience how powerful this resource can be in helping people interested in the Mozilla mission.
Rodrigo Silveira (Firefox Engineer):
Getting started with contributing to any code base can be daunting. Code Firefox videos are presented in such a friendly way that makes contributing to Firefox a lot more approachable. Being able to learn through video at your own pace is convenient too, you can get from zero to landing patches much faster. I liked it so much I had to help translate it so more people could benefit.
Marco Mucci (Engineering Program Manager):
Part of wanting to make a difference is learning how to make one. Code Firefox is the tool of choice for learning how to contribute to Mozilla.
@codefirefox has grown into a great resource for lifting you over the learning curve involved in making firefox awesomer. Nice work.
If you want to watch video tutorials on how to hack on Firefox, follow @codefirefox.
The Module Owner and Becoming A Reviewer videos on @codefirefox are awesome: http://codefirefox.com/#reviewing-code
This really is fantastic - I wish I'd had something like these videos when I started contributing.
I know I'm late to the party, but @codefirefox is seriously awesome. Great work by @brianbondy!
If you've been considering contributing to Firefox, @codefirefox is definitely a good start. Big thanks @brianbondy! http://buff.ly/18LSSZZ
Mozillian @brianbondy has started publishing video tutorials on Firefox hacking. http://codefirefox.com/videos Follow @codefirefox for updates.
Superb framework to create code tests by @brianbondy https://github.com/bbondy
@codefirefox.com now supports accounts via @MozillaPersona You can track which videos you’ve watched too - pic.twitter.com/I4EizTAzbk
Becoming a Mozilla contributor is now even more easy. http://codefirefox.com/ site aim to outline the process... http://fb.me/1ChAz9qPE
Other open source projects could also benefit from the same sort of idea - are you listening Linus?
Thank you @brianbondy for both http://codefirefox.com and http://goo.gl/bybZKK ! Very helpful for new #Firefox contributors!
Jennie Rose Halperin:
http://codefirefox.com/ wanna get deep with your code? totally digging this @mozilla
codefirefox.com/ these videos are awesome. setting up firefox dev setup is pretty easy
Do the right thing. Some lessons to be learned. http://codefirefox.com/ I thought it was a great initiative. #codefirefox @codefirefox
This is awesome, and I wish more projects would do it.
+1 for whoever's idea this was. We need more guides like this that ask that answer the basic questions on just dev process and work flows. Let's make it easier for people to contribute!
@FremyCompany I agree. I think the http://codefirefox.com/ project is our best bet. Not sure if Chrome could have that (let alone Opera, IE…)
Encouraging open source contributions, done right by Moz at http://CodeFirefox.com
(now a serious tweet) If you're interested in contributing to Firefox, this is a fantastic site: http://codefirefox.com
OMG. This is so awesome. Videos on how the heck to actually contribute to Firefox: http://codefirefox.com cc/ @codefirefox
Decided over my Xmas break I'm going to try and contribute to Firefox somehow http://codefirefox.com
@codefirefox Just wanted to let you know your website is an excellent resource! Please keep up the great work!
This is awesome. I wish this existed when I wrote my first #FireFox patch.
Thank you @codefirefox for such a great collection! Hope it will produce more developer all around the world! :)
@angelinamagnum I like the style of @codefirefox, allows someone to get up to speed in an easy to digest manner. so more of that please :)
That's how I did my first patches! RT @codefirefox: [...]feature from start to finish, without knowing the code
Would you like to create Code Firefox videos?
Please contact me at bbondy[at]gmail.com if you'd like to make a series of videos on Code Firefox for your area of expertise.
March 03, 2014
Dare 2B Digital is an annual South Bay conference that brings 300 young women ages 12-16 together to encourage them to consider STEM fields in college by coming together for a full day of inspiring talks and workshops showcasing women’s work and relevance in technology. For the past four conferences, Lukas has signed Mozilla up as a sponsor and created a workshop that is run 3 times that day and reaches about 80-100 attendees. Last year, Lukas and I created a workshop to teach these girls how to create mobile HTML5 games. This year, Lukas couldn’t make it to the conference because she was busy organizing another great outreach event, so I volunteered to organize our workshop, and I recruited Katie and Heather to help me.
I really love Webmaker, a Mozilla project dedicated to helping people learn how to create amazing things on the web, so I decided to create a workshop to teach the girls how to use some of the Webmaker tools. My goal was to teach the girls how to use these tools to understand the basic building blocks of the web, as well as show them how easy it is to make their own web content. To prepare for the conference, I gathered 20 loaner laptops, ordered some swag, and remixed an existing Webmaker teaching kit to create an outline for the workshop.
We started off each workshop with a brief overview of how the web works (Katie used her teacher skills to create some nice whiteboard diagrams), and then we jumped right into using the Webmaker tools. We started by walking the girls through using the X-Ray Goggles to inspect webpages, and taught them that they can modify what they see in their browsers. We definitely heard lots of “This is so cool!!!” when we showed them how to change text and images on any webpage.
Once they felt comfortable with X-Ray Goggles, we pointed them to a gallery of existing Webmaker projects, and showed them how to use Thimble to remix those projects into their own. At this point, we let them loose to start working on their own remixes, and there was lots of enthusiasm and laughter as they started working on their own projects. We also felt thoroughly out of touch with youth culture when they started filling their projects with images of young male celebrities we had never even heard of.
Unfortunately, we only had an hour and 15 minutes for each workshop, which flew by, but we encouraged the girls to make their own Webmaker accounts to continue working on their remixes at home. They were definitely really excited to learn that all of these resources are available to them at home, and that they only need a web browser to get started!
February 14, 2014
“Soon I will be four, and then I’ll be a teenager.”
I travel a lot these days. Not constantly, probably not even 25% of the time, but enough that I often go a week without giving you a hug. And being the overthinker dad that I am, that makes me wonder what effect it has on you. We video chat when I’m gone, whenever the internet connection is good enough. When it isn’t, I record videos for you and send them to your mom to play. I’ve never missed a weekend with you, though it’s sometimes been quite a trick to make that work. I think I’m a really present dad, I try to be, but I wonder how you feel about it, and how you’ll think about it years from now. I hope you’ll agree.
My dad, your grandpa, tells me that when I was a kid and he had a weekend with me, he felt protective. Like he didn’t want to share. Like he wanted me all to himself. And how that wasn’t very helpful and we had a much better time once he got past it and made room. Boy do I understand that, now. Time with you is the best thing, and sometimes I don’t want to share. But grandpa’s wise, and sharing you with others is great, and watching you venture off and be social and own a room is just wonderful. But I’m still glad that you let me read you stories and tuck you into bed at night.
Today was your birthday and you ran around like an idiot with a birthday cake tiara and a birthday bear and made goofy faces any time I tried to take your picture. You ordered pizza and oreo cake and tried to splash me with bathwater. And you fell asleep while I stroked your hair and you snored a little and it was the best thing ever.
Goodnight, Lil. Sweet dreams. I love you.
February 04, 2014
In Firefox 26, we released a completely revamped version of the Firefox for Android Home screen, creating a centralized place to find all of your stuff. While this is certainly awesome, we’ve been working to make this new home screen customizable and extensible. Our goal is to give users control of what they see on their home screen, including interesting new content provided by add-ons. For the past two months, we’ve been making steady progress laying the ground work for this feature, but last week the team got together in San Francisco to bring all the pieces together for the first time.
- HomeProvider.jsm holds basic data storage APIs, which allow add-ons to save data to specific datasets.
- Home.jsm contains new APIs to add new panels to the home page, including specifying which kinds of views to make in these panels, and which datasets should back those views.
During the first half of our hack week, we agreed on a working first version of these APIs, and we hooked up our native Java UI to HomeProvider data stored from JS. After that, we started to dig into the bugs necessary to flesh out a first version of this feature.
- Chenxia recently landed a new page in settings to allow users to manage their home panels, and she has been working on a patch to allow them to install new panels from this settings page (bug 942878).
- Lucas has been working on a patch series to allow add-ons to auto-install new panels to about:home (bug 964375). He also has patches to add images to dynamic views using the Picasso image loading library (bug 963046).
- Sola (one of our awesome interns), added support for a gallery view layout in dynamic panels (bug 942889).
- Josh (our other awesome intern), is working to support folder views in dynamic panels, similar to our built-in bookmarks panel (bug 942295), and he also added support for handling clicks on these dynamic views (bug 963721).
- Michael has been working on an RSS add-on to demo (and dogfood) these new APIs.
- I’ve also started exploring how add-ons will authenticate users (bug 942281), as well as ways to help them sync data in a battery/storage/network-friendly way (bug 964447).
Many of these patches are still waiting to land, so unfortunately there’s nothing to show in Nightly yet. But stay tuned, exciting things are coming soon!
January 09, 2014
Happy new year everyone! During the holidays I had been thinking about my goals for 2014, and I thought it’d be a good exercise to remember what I’ve done in the past year, the projects I worked on, etc. It’s nice to look back and see what was accomplished last year and think about how to improve it. So here’s my personal list; it doesn’t include everything but it includes the things I found most important:
Related to performance/removing main-thread-IO:
- Rewrote the storage for the AddonRepository module in the work with Irving to make the Addons Manager async.
- Did the Downloads API file/folder/mimetype launcher code and storage migrator for the new JS downloads API project.
- After Drew made the contentprefs API async I help update a number of the API consumers to async.
Related to hotfixes:
- Created a hotfix to decrease the update check interval which brought more users to up-to-date Firefox versions, who were lagging behind by never seeing the update message.
- Worked on a hotfix to deactivate pdf.js if necessary, when we were releasing it to all users for the first time. Fortunately we didn’t have to use it.
- Assisted in the work of another hotfix that was being prepared to change the update fingerprints but also luckily wasn’t needed.
- Wrote down some documentation about all of the hotfix process to streamline the creation of future ones.
Related to electrolysis:
- Worked on the tab crashed page
- Made <select> elements work
- Added support for form autocomplete
- Worked on improving the event handling for events that are handled by both processes
- For mochitests: worked on fixing some of the optional parameters like –repeat which weren’t working for all kinds of mochitests, and added the –run-until-failure option.
- Added the –debug-on-failure option which works together with the –jsdebugger option.
- Helped organize the projects of Desktop Firefox for the Google Summer of Code and guide many students through the proposal phase while they drafted their proposals.
- Mentored one student for GSOC who created an add-on to visualize memory usage information from about:memory.
- FISL – The yearly 7k-people free software forum in Brazil
- The MozSummit Assembly meeting to help plan the summit, and the summit of course
- A Firefox OS campaign in Brazil
- The Firefox Performance week
- Reviewed/feedbacked about 300 patches
That’s it. Looking forward to a great 2014!
December 03, 2013
How to use the Talos library in a Google spreadsheet
- In your Google Spreadsheet, choose Tools > Script Editor
- In the new tab, click Close to skip the tutorials and templates.
- In the menu, choose Resources > Manage Libraries. If you are asked to save your project, do so.
- In the "Included Libraries" window, paste the following in the "Find a Library" textbox and click Select: MCurDezZ1B01NQX34URNDye9_pJh_2yq6
- The "Talos" library should have appeared above. Choose a version of the library (the latest is probably best), and click Save.
- Replace the contents of the default script file ("Code.gs" at the time of writing) with pass-through wrappers for every function you want to use (example). Let me know if there is a better way to do this as it's not ideal.
- Call your wrapper functions from within your spreadsheet. e.g.
=getTalosResult(226, 59, 25, "ca7577238ef4"). You can get test, branch and platform IDs from the compare.py script or from the URLs output on TBPL.
- Google seems to cache return values of functions for given arguments and so you should only only request results when the talos runs are done and have as many re-triggers as desired. Otherwise, you'll need to change one of the arguments to the functions or add a new cache-breaker argument.
- Occasionally you will get an error that the script took too long to execute. I haven't found documentation on what the upper bound is and I'm not sure of the cause but since there is caching in the library as well, recalculating the whole document within the script's cache period (currently 12 minutes) normally allows the scripts to finish since many of the rows and/or columns can use the cached data.
December 02, 2013
To everything there is a season.
I’m driving today. The road races by, cold with the oncoming winter. The trees, skeletal without their leaves, look dead. The fields are frozen, shorn of their fruits long ago. Picturesque. But even from within the heat of the car, the sight of it all makes me shiver.
The seasons make us. They mete out our minutes of sunlight and degrees of warmth and millimeters of rain. Not with a parent’s loving tenderness, or even a teacher’s careful pedagogy, but with a metronome’s mindless repetition. And today they have made the world outside this car cold, and still, and dead.
But you are not bound by their rhythm! You are vibrant, and alive, and your own self. What the seasons decree must be a cold and barren time you can make into growth and flourishing life. Hooray for you, that have this freedom and this power to make your world better than it was before!
To shave is to suppress. So much suppression infuses what we do that, hoodwinked by fashion, we become our own gaolers. We shave ourselves. And as the seasons swirl around us to make us cold, to make us withdraw, in that moment, friends, I say that we should fight back against their mindless cruelty.
One month of the year I will not go gently into my cell. One month of the year I will make, upon my person, rebellion against desolation around me. One month, this month, I will be as beautiful as I am able. I will take no blade against myself, I will not lessen me. And I invite you. I entreat you. From the cold of this frozen highway I beg you to do the very same.
November 18, 2013
I'd like to introduce a new site I'm working on named Code Firefox.
Becoming a Mozilla contributor can be intimidating. There's a lot of information to consume, and that information can be dispersed in a variety of different places. This site aim to outline the process of becoming a Mozilla contributor, from the start, with gentle, short, consumable 2-10 minute videos.
A long time coming
In July 2012 I blogged about my first year at Mozilla, and where I'd like to go in the future.
I'm starting work on a project to bring videos for code contributors. The plan is to have short 5-10 minute videos that each cover a single topic. This would be similar to Khan Academy videos in the 1 video per concept way, but will be more like a tutorial and will be focused on contributing to Mozilla.
It took me a while to actually start on that goal, partly because I kept making excuses for why it wasn't a good time to start yet.
Maybe I was just scared of presenting something in a way that wasn't the best way. But when it comes down to it, I know a lot of people can benefit from the content of the videos I'm creating. And because of that, I'm no longer afraid to be corrected.
A couple month ago, sitting in the airport coming home from the Mozilla 2013 Summit, I registered codefirefox.com. I also created a github project and started coding the site that would be used for those videos.
The future of Code Firefox
Code Firefox aims to focus on Desktop Firefox videos from the ground up. I'd love to also do videos on Firefox for Android, Firefox for Windows 8 style UI, and especially for Firefox OS.
I'd like to eventually get to a place where the videos can be used for onramping new hires, and perhaps also used by some schools as the basis of a class.
Status and focus
Since I began posting videos, I've been posting an average of over 1 video per day, I'm close to 20 videos so far.
These videos are not focused on perfection, partly because I'm far from it, and partly because I have so much content to go out, that there is more of a benefit to do new videos instead of focusing on old ones.
I’m using ScreenFlow on OS X to make the videos in a Windows 8 VMware Fusion VM, and a Blue Yeti microphone.
As each video is posted, I post a message about it on this twitter account.
November 06, 2013
Up until recently, Metro Firefox was designed to use a separate profile from desktop Firefox. We had planned to rely on sync to bring the data from the 2 profiles together.
We've had feedback around this, and we've found that a better experience would be obtained by sharing a single profile.
We're in the process of implementing shared profiles.
What is a profile?
A profile in Firefox stores all of your personal settings, including: bookmarks, preferences, extensions, passwords, history, and more.
We'll be sharing profiles from both applications, but there are some exceptions:
- Since addons are not initially supported in Metro Firefox, they won't be used in Metro Firefox even if they exist in the profile.
- To avoid unexpected problems with changed preferences exposed in one environment but not in the other, we're planning to keep most preferences separate.
What are the upsides of having a shared profile?
Sharing a single profile would allow you to instantly retain bookmarks, login status, cookies, and other profile data between environments.
You would never need to wait for some kind of 'sync service' to complete its work to see your data in the other environment.
Another task highly related to sharing a single profile is adding a "Relaunch in Desktop" option from Metro Firefox and a "Relaunch in Metro" option from Desktop Firefox.
Are there any downsides to having a shared profile?
Yes, but we believe them to be corner case issues that the user can work around, see below.
The main disadvantage is that before you could run both Metro and Desktop browsers at the same time. This will change so that you can only run either one or the other at any given time.
Windows 8 is a clash of 2 environments:
- a Desktop environment which is optimized for mouse and keyboard
- an immersive environment which is optimized for touch
If you're using a keyboard and mouse, and since we will be having a shared profile, there is no reason you'd want to use the Metro browser. If you really want to you can, but surely you don't need to use both Desktop and Metro at the same time.
The opposite argument is also true for touch. Most of the time when using touch you'll want to use the Metro browser, but there are special cases where you'll want to switch, like if you need an addon or plugin to take effect.
For users who really want to run both at the same time, they can force the use of a different profile using the -ProfileManager command line argument from Desktop Firefox.
Will having a shared profile change the release date?
Having a shared profile is not expected to change the release of Metro Firefox. A smooth async panning and zooming experience is being worked on before we want to release, and during that time we're implementing shared profiles.
The switch to Desktop / Metro feature may not retain all opened tabs and filled in form status in v1 if time does not permit. We plan to use session restore to do this, but there's some non trivial work to do there.
Where is this work being tracked?
Shared profile work is being tracked in bug 924860.
Other implementation details
- Browser chrome cache (not HTTP content cache) will be stored separately to avoid unexpected startup problems. Both browsers use the same User-Agent.
- We'll be using session restore to accomplish the Metro -> Desktop and Desktop -> Metro switch should time permit.
- If the Metro browser is already open, and you open a link from either Metro or Desktop, it will open in the already opened Metro browser. You have to switch to Desktop from within Metro to move environments.
- The same is true for the Desktop browser when already opened, and opening links from either environment.
- If the browser is not already open, a link click will open a new browser instance in the environment you are currently in.
- After the initial work is done, we'll want to add options to allow users to make their environment choice either i) act like above, or ii) make the mode switch persistent across launches.
Current progress for profile sharing can be seen in Oak builds (Not recommended for general use). These patches will also move to mozilla-central (Nightly builds) after QA'ing is done to ensure there is no harm to the Desktop profile.
The completed list of tasks related to this feature so far include:
- Shared base app name which implies a shared profile
- Relaunch in Desktop feature (From the Metro browser)
- Relaunch in Metro feature (From the Desktop browser)
- Split preference files within the same profile
- Split startup cache files within the same profile
Constructive feedback is appreciated and wanted. Please feel free to leave a comment here or post in the profile sharing tracking bug: Bug 924860.
October 29, 2013
This past weekend I attended Mozilla Festival in London, and it was incredibly energizing! Everyone at MozFest was so excited about the web, but unlike your average tech conference, there was a much more diverse set of participants, including hackers, makers, journalists, educators, and even lots of kids. The focus of this year’s MozFest was about creating a web-literate world, so I decided to facilitate a session on building your first mobile web app.
Although projects like Webmaker and Appmaker are designed to make content creation more accessible for everyone, I wanted to create some learning materials that could put people on the path towards becoming more serious web developers. This path includes learning the fundamentals of HTML/CSS/JS, as well as how to use the developer tools built into browsers, and popular collaboration tools like Github.
To teach these basics, I made a slide deck that walks you through building a simple stopwatch app that’s hosted using Github pages. At the start of my session, I presented these slides (and of course threw in some Firefox dev tools demos!), but then I let everyone loose to start hacking at their own speeds. There were about 25 participants with a wide range of ability levels, and I think this format worked well to keep everyone engaged (and gave me the opportunity to offer more individual help).
My hope is that other people might find these resources useful, so please use them and share them! Also, because they’re open source, pull requests are welcome :)
October 15, 2013
A lot of the Firefox for Android UI is written in Java, but under the hood there’s still quite a bit of JS that controls core browser logic. We also use HTML to create the content of most of our chrome-privileged pages, such as about:addons. Today I found myself working on a polish bug for about:apps. In the past, tweaking the CSS for these pages has been a pain, since testing changes required pushing a new APK to your device. However, I remembered that the remote inspector recently landed for Firefox 26, so I decided to try it out. Verdict: it was amazing!
Setting up the remote developer tools is as easy as flipping prefs on desktop and mobile (these prefs are now exposed in the UI!), running an adb command to set up port forwarding, and hitting a button. The directions are really well documented on MDN, so you should look there for more detailed instructions.
While playing around with the inspector, I also realized that remote chrome debugging is enabled for Firefox for Android. It wasn’t immediately obvious to me that in order to attach the debugger to the main chrome window, you need to select the “Main Process” link on the desktop “Connect to remote device page”, but once I did that, I had access to all of the browser chrome JS. And since add-ons for Firefox for Android are written in JS, this means that you can easily debug all of your add-on code!
Big thanks to the Firefox Developer Tools Team for doing so much awesome work. And I know they’re always looking for new contributors to help them out!
October 01, 2013
Last week, the 2013 edition of the Google Summer of Code officially finished. The Firefox team had come up with a few project ideas for this year and I mentored Abhishek Choudhary in the project dubbed “about:memory for real people”. The goal was to produce a friendlier and prettier version of about:memory that could be used by users and web developers to investigate the memory usage aspects of their webpages.
Mentoring GSoC was a nice experience again (it was my 4th time as a mentor) and I’m happy to say that the project was completed successfully! On Sep 16th, the “soft pencils down” goal on GSoC timeline, Abhishek tagged the 1.0 version on GitHub and the code was called complete. After a small extra bug fix, 1.0.1 was tagged and then submitted to addons.mozilla.org!
The project itself was very interesting because it was not a straightforward coding exercise: there was also a creative element to it which allowed us to experiment different visualization styles to try and see what worked best. It began with a few different separate visualizations but it evolved over time to one main integrated viz that supports seeing the data consumed by each tab and to watch how it evolves over time. The user can take manual time snapshots or let it take one every 5 seconds, and then use the time slider to go back and forth between the last 5 snapshots. The main hope is that this should be useful for a web developer who wants to see how a particular action on the website might affect its memory usage and if it fits the expectations (does that operation increase memory? does it release it as expected?).
Here’s a screenshot of the main interface:
You can see more details and install it from AMO. There’s a small catch: the add-on currently won’t work with Aurora or Nightly, just Beta and Release. This was an interesting part of the project: on the few last weeks of the project, the API that the add-on had been using changed, and it was not possible to change it to the new API among the other wrap-up tasks for the project. But luckily add-on versioning works well, and as the goal of this add-on is end users, shipping for beta and release is ok for now, and we’ll soon be posting a new version that is compatible with FF25+.
Abhishek also has a very nice blog post that you should be reading instead of mine :), describing the project progression and his experience working on it. I want to take this opportunity to say congrats to him and thanks to all students who participated in the GSoC project this year! I hope everyone had a nice time and hopefully the experience have interested some of you to continue to be part of community! Looking forward to next year’s projects.
September 27, 2013
Have you ever noticed the messages that appear under the search box on desktop Firefox’s home page? We call these messages snippets, and they’re dynamically created from web content hosted by Mozilla. These snippets provide an easy way to communicate with desktop users, but right now there’s no equivalent feature for Firefox for Android.
Since we first released the native version of Firefox for Android, we’ve included a hard-coded promotional banner as part of our home page — you’re probably seen it encourage you to set up Firefox Sync. However, we’ve been working on a complete rewrite of the home page for Firefox 26 (exciting!), and we’re taking the opportunity to replace this with a new customizable banner.
Because this banner is part of our native Java UI, we can’t just load web content the way desktop does. Instead, we decided to build a JS API to let add-ons customize it. We came up with a simple API that lets developers add and remove items from a set of messages that rotates through this banner. Right now, these messages just consist of an icon, some text, and a click handler. We put this banner API in a new Home.jsm module, since we have plans to add more home page customization APIs to this module in the future!
As a demo, I made an add-on that fetches data from a basic snippets server, and turns that data into messages that are added to the home banner. This server currently serves data from the 5 most recent @FennecNightly tweets, which is actually pretty relevant to Nightly users. If you’re using Nightly, I’d encourage you to try it out, and as always, please file any bugs you find!
September 17, 2013
Firefox 24 was released today! Along with a lot of other great features, this release includes a bunch of improvements to Reader Mode. The most noticeable improvements are a polished options menu and a “Night Mode” that automatically changes the background/text colors depending on ambient light levels. However, many other small bugs were fixed in the process, increasing the quality of this feature.
I’m making this post because I want to highlight that over half of the bugs fixed for these Reader Mode improvements were fixed by volunteers! I want to thank the 7 volunteers who fixed these 12 Reader Mode bugs. You all rock!
September 03, 2013
If you don’t live in the San Francisco Bay area, you may not be aware that the culmination of a major infrastructure project is underway this holiday weekend. The Bay Bridge, one of 5 major Bay-area bridges, is in the middle of a 5 1/2 day closure as it’s transitioned over to its replacement. (The other 4 major bridges, in case you’re wondering, are the
Richmond–San Rafael Bridge, the San Mateo Bridge, the Dumbarton Bridge, aaaand… hmmm… oh, right, the Golden Gate bridge)
The Bay Bridge was originally built in the 1930s, and after the Loma Prieta earthquake in 1989 it became clear it needed to be replaced. One of the flashbulb memories many people have of the quake — in addition to it interrupting the ’89 World Series and the collapse of the double-decker Cypress Street Viaduct — is the failure of a span on the Bay Bridge, with cars driving over it. Since then, the western half of the Bay Bridge has been retrofitted to be earthquake-safe, but the eastern span of the bridge has taken longer to completely replace. This weekend’s work is to transition the connection points, so that tomorrow people will be driving over a completely new bridge that’s been 11 years and $6.4 billion in the making!
(I’m getting to the part where Mozilla ties into this.)
Last Friday @BurritoJustice tweeted a link to a slideshow that dove into the engineering history of the Bay Bridge, complete with photos taken during the construction.
— Burrito Justice (@burritojustice) August 30, 2013
Mozilla’s San Francisco office, in the historic Hills Brothers Coffee building at 2 Harrison Street, is literally next-door to where the western span of the Bay Bridge lands in S.F. It makes for some really great views of the bridge from our top-floor patio:
As well as a first-row seat beneath the giant “HILLS BROS COFFEE” sign atop the building.
It’s this sign that made it easy to spot our building in the engineering history slideshow. The building was constructed in 1926, and the Bay Bridge wasn’t built until 1933-1936, so I was curious to see if the sign was visible in other contemporaneous photos. I started digging though some online resources, and got lucky right away by finding a highres version of that picture at the Library Of Congress:
I skimmed through the other 415 photos in this collection and another 1160 from UC Berkeley (So You Don’t Have To™), and found some other nice shots with the Hills Coffee sign peeking out from the background:
So there you have it. Pics of the Mozilla San Francisco office from both ends of an 80 year span of history.
August 21, 2013
It’s been a while since I last blogged about Firefox’s password manager. No big deal, it really hasn’t fundamentally changed since since I rewrote it 6 years ago for Firefox 3.0. Well, ok, the storage backend did switch to SQLite, but that’s mostly invisible to users. There’s a noteworthy change coming soon (see next post!), but I figured that would be easier to explain if I first talked about how things currently work. Which I’ve been meaning to do for a long time, ahem.
So let’s talk about how two of the main functions work — filling in known logins, and saving new logins.
Filling in a known login
The overall process for filling in an existing stored login is simple and brutish.
- Use the chrome docloader service and nsIWebProgress to learn when we start loading a new page.
- Add a DOMContentLoaded event listener to learn when that page has mostly loaded.
- When that event fires…
- Check to see if there are any logins stored for this site. If not, we’re done.
- Loop through each form element on the page…
- Is there an <input type=password> in the form? If not, skip form.
- Check to see if any known logins match the particular conditions of this form. If not, skip form.
- Check to see if various other conditions prevent us from using the login in this form.
- Fill in the username and/or password. Great success!
Phew! But it’s the details of looking at a form where things get complex.
To start with, where do the username and password go? The password is fairly obvious, because we can look for the password-specific input type. (What if there’s more than one? Then we ignore everything after the first.) There’s no unique “username” type, instead we just look for the first regular input field before the password field. At least, that was before HTML5 added more input types. Now we also allow types that could be plausibly be usernames, like <input type=email> (but not types like <input type=color>). Note that this all relies on the order of fields in the DOM — we can’t detect cases where a username is intended to go after the password (thankfully I’ve never seen anyone do this), or cases where other text inputs are inserted between the actual username field and the password (perhaps with a table or CSS to adjust visual ordering).
And then there’s the quirks of the fields themselves. If your username is “alice”, what should happen if the username field already has “bob” filled in? (We don’t change it or fill the password.) Or, more common and depressing, what if the username field already contains “Enter your sign in name here”? In Mongolian? (We treat it like “bob”.) What if the page has <input maxlength=8> but your username is “billvonweiterheimerschmidt”? (We avoid filling anything the user couldn’t have typed.)
And then there’s the quirks of the saved logins. What if the username field already has “ALICE” instead of “alice”? (We ignore case when filling, it’s a little trickier when saving.) Is there a difference between <input name=user> and <input name=login>? (Nope, we stopped using the fieldname in Firefox 3 because it was being used inconsistently, even within a site.) What about a site has both a username+password _and_ a separate password-like PIN? (Surprisingly, we were able to make that work! Depending on the presence of a username field, we prefer one login or the other.)
And then. And then and then and then. Like I said, there’s no spec, and sometimes a site’s usage can break the guesses we make.
Saving a new/changed login
In comparison, the process for saving a login is simpler.
- Watch for any form submissions (via a chrome earlyformsubmit observer)
- Given a form submission, is there a password field in it? If not, we’re done.
- Determine the username and password from the form, and compare with existing logins…
- If username is new, ask if user wants to save this new login
- If username exists but the password is different, ask if user wants to change the saved password
- If username and password are already saved, there’s nothing else to do.
Of course, there are still a number of complicating details!
Oh, and there’s still the same question as before — how to determine which fields are the username and password? We reuse the same algorithm as when filling a page, for consistency. But there are a few wrinkles. The form might be changing a password, so there could be up to 3 relevant password fields (for the cases of: just a new password, old and new passwords, and old + new + confirm.). And the password fields could be in any order! (Surprisingly, again, this works.) The most common problem I’ve seen is an account signup page with other form fields between the username and password, such as “choose a user name, enter your shipping address, set a password”. The password manager will guess wrong and think your zipcode is your username.
Oh, and somewhere in all this I should mention how differences in URLs can prevent filling in a login (or result in saving a seemingly-duplicate login). Clearly google.com and yahoo.com logins should be separate. But we also match on protocol, so that a https://site.com login will not be filled in on http://site.com. And what about www.foo.com and foo.com or accounts.foo.com? (We treat them separately.) What about mail.mozilla.com and people.mozilla.com? (Also separate.) What you might not realize is that we also use the form’s action URL (i.e., where the form is submitted to), ever since bug 360493. While this prevented sending your myspace.com password to evilhacker.com, it also breaks things when a site uses slightly different URLs in various login pages, or later changes where their login forms submit to.
All the gory details
This is one of the benefits of being Open Source. If you want to see alllll the gory details of how the Firefox password manager works, you can look at the source code. See http://mxr.mozilla.org/mozilla-central/source/toolkit/components/passwordmgr/. In particular, LoginManagerContent.jsm contains the code implementing the stuff discussed in this post, with the main entry points being onContentLoaded() and onFormSubmit().
Finally (!), I’ll mention that the Firefox password manager has some built in logging to help with debugging problems. If you find it not working in some particular case, you can enable the logging and it will often make the problem clear — or at least clearer to a developer when you file a bug!
August 13, 2013
I don’t want to box you in, and anyhow it’s more of a continuum than a yes/no, but I see things I recognize. The way you play for an hour by yourself without any outside stimulation. The way you stand at the edge of a group of kids at the park, watching them and trying to figure them out. You come by it honestly, but it still makes my heart hurt a bit. Not because I disapprove; far from it. Introverts are some of my very favourite people, and also pretty in vogue among the techie, cerebral, introspective types I tend to run with. But introversion is tricky. You’ll pick up labels like “shy” and “awkward” and you’ll either take those in as parts of your identity or you’ll rebel against them. Or maybe you won’t. Maybe you’ll be a perfectly well-adjusted human. It is a pretty consistent folly of your dad’s to extrapolate from today to your entire future life. It’s probably silly and I probably shouldn’t, but I do. And sometimes it makes my heart hurt.
Speaking of extrapolation, I’ve been thinking about who, what, and where you’ll be when you read these. I imagine you in your 20s. I don’t know why. I don’t know how I expect to keep them secret from you that long. But I think of you reading them in your 20s, all of them in a sitting, and I wonder what you’ll want to know about being three and a half. You like pears and corn on the cob and sausages with mustard. You love the beach. You’re in circus school on Sunday mornings. You find the word “toots” hilarious. Your youtube favourites are vihart’s math videos, and goats yelling like humans.
That will change. You change quickly now. You went away to California for a few weeks to visit some friends and you came back a different kid. It made me feel protective for a minute. Like I didn’t want you influenced by the outside world. Which is stupid, because those influences are wonderful kids, but also because your life is going to be full of other influences and the last thing I would want to do is stop it. But parenthood is a conservative force – we love you the way you are, and we resist change that we didn’t initiate. Forgive me that, if it happens again when you’re old enough to notice. It’s not a rational response; it’s a reflex. Parental lizard brain.
The world will be different, too. Right now, we — the collective we — worry about some things. We worry about the planet – we think we’re heating it up and we think that’s going to cause big problems. We’re spending a frustrating lot of time debating the evidence and agreeing with each other, but we also have lots of excellent people trying to make it better. We worry about humanity – it’s getting easier for one angry person to hurt a lot of people, and the fear of that is pushing governments into reactions straight out of science fiction: armed drone patrols, global mass surveillance. I don’t talk about this much with the three and a half year old you, but I want the adult you to know that we see these things happening, and we’re not sure how to fix them, but we’ll try. I have hope that we’ll succeed.
Right now, that’s not your biggest concern, though. And that’s fine. Right now your biggest concerns are whether there is ice cream at the beach (there is), and whether tonight is a hair-washing night (it is), and whether I will read you one more story (I will). Thank you for adding so much silly to my life. Thank you for asking “why?” about everything. Thank you for sneaking quietly into the bedroom on Saturday morning, staring at me inches from my face until I startle awake, and then announcing that it’s time for pancakes.
I love you, Lil, and I love the person you’re becoming.
August 07, 2013
Over the past year, the Firefox for Android team has really seen increased volunteer participation. It’s been amazing to see our community grow, and I want to share some of the strategies we’ve been using to engage volunteers.
1. Make it easy to get started. We maintain a "Get Involved" page with links to a bunch of resources to help newcomers get started, including clear and up-to-date build instructions. We also share some guidelines for how exactly to get started, including things like making sure you have a build environment set up before trying to dive into a bug, and how to reach out to us when you need help.
2. Be available to help. Our team is always on IRC, and we’re quick to answer questions. We also make an effort to respond to Bugzilla comments/requests in a timely fashion, especially if we see it’s someone’s first bug. Helping newcomers can require patience, but being responsive is a really important part of keeping volunteers engaged.
3. Create contribution opportunities. We mark bugs as mentor bugs as often as we can. In addition to simple “good first bugs”, we also try to mark more challenging bugs as mentor opportunities. The key with that is to set clear expectations about how challenging we expect the bug to be, and redirect newcomers to easier bugs if they find themselves in one that’s too hard.
4. Recognize contributors. We made a "Friends of the Mobile Team" section of our weekly meeting notes, where we call out volunteer contributions that were made over the past week. We recently created a badge that we award to anyone who appears in this section (people love badges!) and we also try to publicize important contributions with our @FennecNightly Twitter account.
5. Develop a culture of mentorship. This last point is a bit harder to act on, but it’s the most important. A big part of why we have more (and stronger) volunteer contributors is that we’ve taken the time to mentor them. On our team, most developers have mentored at least one bug (if not many), and make an effort to mark bugs as mentor bugs whenever they can. We also make a big effort to remain patient and friendly, and I think that attitude has spread through our community. One of the greatest rewards of developing this culture is seeing new contributors evolve into mentors themselves. It is an amazing feeling to watch some of the volunteers I mentored helping newcomers write their first patches, and do so with so much kindness and patience.
I’ve been having lots of fun bringing new people into our team, and I’d love to help other teams at Mozilla do the same. Please reach out to me if you have any questions, or share any other tips I may have omitted in the comments below!
July 18, 2013
I’ve made a few updates to the list of Firefox reviewers:
- Drew Willcoxon, Matthew Noorenberghe, Gijs Kruitbosch, Paolo Amadini, Mike Conley, and Mark Hammond are new additions. They’ve all been long-time contributors to Firefox, and have plenty of experience reviewing Firefox code – their addition to this list is overdue.
- Mike Shaver and Dietrich Ayala have moved to “reviewers emeritus” status. They’re no longer actively involved in day-to-day Firefox development, so it’s somewhat misleading to new contributors to include them in that list of potential reviewers. Their innumerable contributions to Firefox and to Mozilla won’t be forgotten, though!
Please join me in welcoming the new reviewers – send patch review requests their way!
July 17, 2013
One of the other cool things that came out of the Firefox Desktop work week that I mentioned in my previous post was increased exposure to a handy tool written by taras and bsmedberg: jydoop. Benjamin has a post explaining what it is and how it works, but I wanted to describe one specific use: measuring main-thread responsiveness issues in the wild.
First, a bit of backstory!
One of my team’s overarching goals for a long time has been eliminating all sources of main-thread file I/O. One of the worst main-thread I/O offenders in Firefox code is our SQLite Storage API. A few years ago we went a bit overboard using a version of this API that is synchronous, and does its file I/O work on the main thread. So recently we’ve been focused a lot on eliminating all users of that API.
One consumer of this API that we fixed in Firefox 23 is the Form History code (responsible for remembering information entered into web forms and offering to re-fill it). Neil Deakin, markh and mak worked together to fix the core service (based on earlier work from a previous Mozilla intern, Felix), but after landing that improvement, taras noticed that there were still some remaining issues. We eventually determined that the likely primary culprit for the remaining Form History main-thread I/O was Firefox Sync’s use of the older Form History API. markh and rnewman worked together to fix Sync, but we weren’t entirely sure whether that was sufficient to eliminate all of the main thread I/O we were seeing reported by telemetry.
Now, to the jydoop part
Taras had identified that our initial Form History fix wasn’t complete using the SlowSQL telemetry dashboard. This gives a high-level overview of slow SQL statements occurring in the wild, and he noticed that after we landed the original fix for form history, some formhistory.sqlite statements were still showing up. Unfortunately, the SlowSQL dashboard only offers two time ranges: previous week, and the previous month, and it aggregates data across all builds from a specific channel (e.g. “nightly”), which means that I couldn’t easily use it to confirm whether our Sync fix was effective.
That’s where jydoop came into the picture. It allows much more sophisticated analysis of the SlowSQL data. I wrote a couple of jydoop scripts: one to summarize the slowSQL reports for formhistory.sqlite from builds before the Sync fix (i.e. Nightly builds with a build ID < 20130623) and another to do the same for builds containing the fix. I then ran those scripts against Telemetry reports from the period from 2013-06-21 to 2013-06-24 (inclusive, i.e. roughly two days on either side of the landing of the fix).
The results are pretty conclusive: the reports of slow SQL statements for formhistory.sqlite from builds including the Sync fix were dramatically reduced. The most frequently slow statement from builds before the fix (“COMMIT TRANSACTION”) was responsible for a total of 417 seconds of main-thread unresponsiveness (174993 occurences of slowness at an average of 143ms of “jank” at a time), over that period. The Sync fix prevented that statement (and many other slow statements) from occurring at all, thus removing a significant cause of main-thread responsiveness issues experienced by Firefox users in the wild.
If you look at the results in more detail, they reveal that there are still some slow SQL main-thread operations happening on formhistory.sqlite – they’re less frequent and severe, and are tracked by other bugs. I’m going to be using jydoop to gather more data on the improvements my team’s already made, as well as gauge the potential for improvement in areas we’re still working on. I also want others on the team to learn to use jydoop, so that people can make their own measurements to validate the improvements they’re working on.
 Main-thread file I/O is a term used to describe trying to read from or write to the disk on the same thread (the “main thread”) as you’re trying to respond to user input (e.g. mouse/key events) and do other things like drawing the UI. Reading from or writing to the disk can take a relatively long time, particularly if you have a slow hard drive, so we want to always do it on a background thread so that those other important responsiveness tasks (responding to input and updating the UI) aren’t affected.
At the end of June the Firefox desktop team held a Performance-themed work week Toronto, which included representatives from the Performance team as well as some other teams (QA, automation/testing, project management, etc.). During the week a bunch of us got together and held a little “intro to Firefox code” session – partially for the benefit of a new hire on our team (Steven MacLeod), but also partially because it can be fun to share different perspectives on how we understand Firefox. This was a group discussion, but a lot of it involved me giving my perspective on how Firefox front-end code works at a high level, and how it all fits together. We also went off on a few tangents discussing Mozilla development in general.
mconley was kind enough to take some notes from the session on an etherpad (UPDATE: Etherpad is having issues, here’s an alternate link). These could serve as a good base for an MDN article, or perhaps something similar to https://wiki.mozilla.org/Gecko:Overview.
July 16, 2013
Two weeks ago, almost the entire Mozilla community in Brazil assembled together in Porto Alegre to attend FISL, the largest free software conference in the country, which brings together about 7000 people every year to talk about every side of open source: communities, business, government, education, etc.
I think the community had its best attendance ever this year. For one thing, it was the largest group: there were about 30 contributors from all over the country who contribute to every area of Mozilla. For another, our participation this year was entirely planned and run by the community, and everyone was working together in sync to make it a success.
Our activities included various talks on the main conference track, an apps hackaton, a Mozilla room, SUMO sprints, and just a lot of engagement with the students and developers at the conference. As expected, interest in Firefox OS was very high, and this brought to us a lot of people who wanted to hear more about the OS, take a look at the devices (we had a few Geeksphones for demonstrations!) and learn how to build apps. With the dedicated Mozilla room we were able to run several “Apps 101″ sessions to get people started on apps and the hackaton (at times back-to-back sessions to keep up with the demand!), and to provide a welcoming place for them to hack on the apps or to get some hands-on help when they needed.
In true free software spirit, most of the talks at FISL are live streamed and also recorded, and you can see the full program here. Below are all the talks we had (I think I’ve included them all but apologies if I forgot any).
- Ricardo Panaggio – Emscripten (in Portuguese)
- Sérgio Oliveira and Armando Neto – Django at Mozilla (in Portuguese)
- Lucas Rocha – Firefox for Android and how to have a Career in Open Source (in Portuguese)
- Fabricio Zuardi – Firefox OS and Ubuntu Phone — two new open platforms (in Portuguese)
- Marcio Galli on exploring B2G/Gaia internals
- François Marier – Persona, or: User logins – can we do better than passwords and avoid centralized services? (in English, slides in Portuguese)
- Mark Surman – The Web is Lego (in English)
(p.s.: if you want to see an entertaining explanation of how Persona works I highly recommend you watch François’ presentation at the 11’30” mark)
The hackaton ran during the conference and finished on Saturday afternoon. We got a total of 7 apps submissions, which are all posted on github, and the winner was announced at the end of Surman’s talk and received a Geeksphone Keon! There were also e-books as prizes for other teams. Big props to Adriano, André Garzia and Morvana for running the hackaton!
With all that, what I have to say is thanks to all the contributors who helped with all our activities. It was great to meet again some of the old-timers and specially nice to meet the newer members of the community to whom I had only known online before. I was very impressed with everyone’s dedication and passion for Mozilla! Attending FISL is always a special experience for me because that’s where I started my true involvement with open source and Mozilla. After meeting Marcio and Fabricio in São Carlos in 2005 and been following things online for a while, I attended my first FISL in 2008 where I gave a presentation about add-ons development and there I met Chofmann, Blizzard, Taras, Mitchell, Mary, and that was a big push for me to start contributing. I’ve been attending the event ever since, and nowadays I often get people asking my story and how they too can get involved and I hope that I can too serve as support and inspiration for the new people joining who wants to participate and grow in the community. Last but not least, a special thanks to Sérgio for being the lead organizer and volunteering an incredible amount of his time in the past N months to make FISL happen this year!
Until FISL 15!
July 02, 2013
Last week, the Firefox front-end team got together in Toronto to discuss various of our ongoing projects, with a special focus on performance-related goals. The performance team also joined us as there are various joint projects between our teams. After the week is over it’s interesting to look back and see what was accomplished during the week and what it opened as guidance for our future work. Here is my personal recap, some of the highlights of what I did and what I saw during the week. In no particular order:
- Finally met with Irving, with whom I’ve been working in the past few months in our project to move the Add-ons Manager storage from SQLite to JSON and making it off-main-thread (bug 853389, bug 853388)
- We did a triage of performance-related bugs to classify them into high impact and low impact and figure out where to focus
- Got to see some of the great progress that Tim Taubert and Avi has done on the tabstrip animations and got Tim to help me use the reflow observers to do some experiments of my own in the UI. I didn’t find any obvious low hanging fruits, which is expected since he has fixed various offenders since introducing these reflows observers, but the attempt was worthwhile
- Using the profiler I noticed some long stacks for text reflowing during tab animations, but these didn’t translate into any measurable slowness. In any case, I started some hacking to see if it was possible to improve it anyway. The issue is that the title in a tab has to be constantly remeasured for cropping while a tab opening animation is happening. I wrote a patch to only display the tab title and favicon after the animation has completed, and then got together with Avi to run his tab animation FPS tests and see what changes. The answer was: not much, there were no visible gains. In hindsight, there’s an obvious reason: even though we can hide the text in the tab that is opening, we can’t do it for the other open tabs, which will all be potentially shrinking and re-cropping at the same time. However, the investigation was very useful nonetheless, because we discovered two issues with the APIs used to measure the FPS on Mac: a telemetry measurement have been inactive since OMTC has been activated; and the framerate was always stuck on vsynced even with different values for layout.frame_rate (which is useful to tweak when doing animation stress tests)
- Got together with Paolo to discuss the plans and current state of the Downloads API off-main-thread project, which I’ll be joining to help (starting with bug 852482)
- Watched Vladan present his findings about running Firefox on an SD card. I had already seem the video through his blog post but watching it again and going into more details was very interesting, as the extreme slow disk IO is not only an artificial case produced on SD cards, but also something that many users have to face daily on machines with older hard drives and anti-virus software than can significantly worsen the problems.
- Vladan’s talk was also of particular interest to me as it serves as motivation and validation for the work I’ve been involved with in the last significant number of months: the Add-ons Manager work and now the Downloads API.
- And various converstations about Electrolysis, including a good talk with Yoric to understand how the ongoing work on session restore and e10s will interact
And beyond that there were also various other topics that benefited from having the team all together in one place, specially Social API and Australis. To me personally the week was immensely helpful as a motivator and as a way to get consensus and clarity into our upcoming projects, not to mention the fine chance of directly interacting with the entire team which not often happens as we’re all spread around the around!
As a side note, this blog post was an exercise in itself as one of the outcomes for me from the Summit Assembly meeeting we had at the week before. There’s more on it that needs a separate blog post to explain, but a personal action that I’ve taken from that event is to increase the transparency and involvement with the community about the work I do.
May 21, 2013
Two years ago I blogged about how it had been six years since I wrote my first patch for Firefox. Today I get to say that it’s been six years since I started getting paid to do what I love, working for Mozilla. In that time I’ve moved to a new continent, found a wife (through Mozilla no less!), progressed from coder to module owner to manager, seen good friends leave for other opportunities and others join and watched (dare I say helped?) Mozilla, and the Firefox team in particular, grow from the small group that I joined in 2007 to the large company that will soon surpass 1000 employees.
One of the things I’ve always appreciated about Mozilla is how flexible they can be about where you work. Recently my wife and I decided to move away from the bay area to be closer to family. It was a hard choice to make as it meant leaving a lot of friends behind but one thing that made it easier was knowing that I wouldn’t have to factor work into that choice. Unlike many other companies I know there is no strict requirement that everyone work from the office. True it is encouraged and it sometimes makes sense to require it for some employees, particularly when starting out, but I knew that when it came time to talk to my manager about it he wouldn’t have a problem with me switching to working remote. Of course six years ago when I started I was living in the UK and remained so for my first two years at Mozilla so he had a pretty good idea that I could handle it, and at least this time I’m only separated from the main office by a short distance and no time-zones.
The web has changed a lot in the last six years. Back then we were working on Firefox 3, the first release to contain the awesomebar and a built-in way to download extensions from AMO. Twitter and Facebook had only been generally available for about a year. The ideas for CSS3 and HTML5 were barely written, let alone implemented. If you had told me back then that you’d be able to play a 3D game in your browser with no additional plugins, or watch videos without flash I’d have probably thought they were crazy pipe-dreams. We weren’t even Jitting our JS code back then. Mozilla, along with other browser makers, are continuing to prove that HTML, CSS and JS are winning combinations that we can build on to make the future of the web open, performant and powerful. I can’t wait to see what things will be like in another six years.
May 15, 2013
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.
What does this mean? Well for users it means two important things:
- 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.
- 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.
To take advantage of these benefits add-ons have to be repacked with a recent version of the SDK. We’re working on a plan 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
cfx xpi --strip-sdk, or using the next release of the SDK, 1.15 which will do that by default.
As part of the Grow Mozilla effort, the coding stewards have been working to grow our coding community. Our main focus has been to increase the number of contributions to the core mozilla-central codebase, which includes making it easier for newcomers to get started, as well as keeping existing contributors engaged. Recent work has been focused on things like mentored bugs and recognizing contributors.
We hold open weekly meetings every Wednesday to discuss progress on these goals, but we want to give more developers the opportunity to get involved with this effort, so we created the email@example.com mailing list for broader discussion. If you’re interested in growing our coding community, but you might not be interested in another weekly meeting, please join the list!
May 14, 2013
I got to spend Wednesday through Friday in Edinburgh last week to attend Scotland.JS. Edinburgh is a lovely city and I will definitely return to get to know it better. It has great people, beers, food and even a castle - what could one want more?
I arrived on Wednesday, just in time for the TechMeetup. It took place in the Appleton Tower and had about 70-80 attendees with quite diverse technical backgrounds. I had a very interesting talk to a freelance patent attorney and also met a couple of people I knew from recent conferences and meetups in Berlin. After we were out of free pizza and beers we met most of the Scotland.JS attendees in a pub right next to the Appleton Tower. Cue more beers and tech conversations.
Thursday was the first day of Scotland.JS that started with a great keynote from Jan Lehnardt. The most memorable talk of the day was about Functional Reactive Programming using Bacon.js by Philip Roberts. There of course were a lot more great talks but the possibilities of creating and combining event streams kept my head spinning the most. At the end of the day we again went to a neat pub near the venue and I headed to bed rather early, still a little tired from travel and the day before.
Friday started with a short 20-minute walk through Edinburgh’s old town that I needed to pass on my way to the venue. My favorite talk of the second and last day was held by Dominic Tarr that tought us about the internals of leveldb. I also really enjoyed Mark Boas talking about making audio a first-class citizen of the web - a very entertaining and impressive mix of technologies. A GitHub drinkup in the venue’s own pub was a great way to end the conference - lots of good conversations with Scotland.JS attendees and speakers as well as people from the local tech community and visitors of the Scottish Ruby Conf.
May 08, 2013
Almost two years, I experimented with using the dominant color of a favicon to give a small icon a colorful background. And over the past week, I wrote some patches to incorporate this design into Firefox for Android!
The simple algorithm I wrote long ago was done in JS with canvas, but to use this in our native Android UI, it’s simplest to just do it in Java. Luckily, we already had a dominant color utility method in the tree, but creating a background and border with different saturation levels was trickier than I thought it would be. To solve this problem, I gave the ImageView a background drawable with a solid white interior and a gray border, then applied a transparent version of the dominant color as a color filter. This worked pretty well once I figured out which PorterDuff mode to use, but it made me appreciate the simplicity of CSS.
When testing with various icons, I found that our dominant color algorithm could use some improvement. Our Java algorithm is different than the one I experimented with in JS mainly because it uses the HSV color model as opposed to RGB. Instead of counting every distinct color, we split the range of hues into different bins and find the bin that holds the most colors. For the winning bin, we compute the average H, S, and V values within that bin, and return that as the dominant color. To make sure we only return colorful colors, we ignore transparent pixels, as well as pixels that are close enough to black or white. This simple algorithm may not be perfect, but it works pretty well for us, especially for small favicons.
As an interesting bit of history, after I blogged about my dominant color experiment, Mardak wrote an add-on that used an improved version of my JS snippet. At the time, Wes saw this add-on and incorporated the code into XUL Fennec to create icons for homescreen shortcuts. During the Fennec Native rewrite, Wes reimplemented this feature in Java, and that’s the code I found myself in last week. And for those interested in a more robust solution implemented in JS, there’s actually a toolkit service that does this now.
May 06, 2013
These tools however are not a good fit for infinite sequences as they always consume the whole sequence at once to return a new one. Implementing infinite sequences by yourself means you would have to come up with your own API that clients need to adhere to. You often would keep state variables whose values need to be maintained for the duration of the computation process.
Generators to the rescue
Using ES6 generators implementing the infinite sequence of all natural numbers turns out to be a trivial task. We even have language support to iterate over them.
Now that we have a first infinite set we need a couple of functions that help us working with, combining, and building new sequences.
Let us start with map() - a function at the very heart of functional programming. It builds a new sequence by applying a function to all elements of a given sequence.
Using the generator implementation of map() we can now easily write a function called squares() that represents the set of squares of all natural numbers (1², 2², 3², …, n²).
As we are using for…of we can also pass an Array to map() to retrieve a new generator with a finite source. The given function is applied to value after value instead of to all values at once when using Array.prototype.map.
Another common task is filtering specific values from a sequence. Our custom implementation of filter() takes an iterator and a predicate - the returned sequence will consist of all items of the original one for which the predicate holds.
We can now use filter() to create the set of all even natural numbers.
A common derivation from filter() is filterNot() that simply negates the given predicate. We can use that to implement even() as well.
Suppose we were to implement a sequence that represents all Mersenne prime numbers. Mersenne primes are defined as prime numbers of the form Mn = 2n - 1, that is the set of all numbers of the given form that have no positive divisors other than 1 and themselves. The set of Mersenne primes is assumed to be infinite though this remains unproven, yet.
Let us first define some helper functions. range(from, to) and forall() are common helpers in functional programming languages. range() returns the set of natural numbers in a given range. forall() returns whether the given predicate holds for all items in the sequence and should therefore only be used for finite sequences.
mersenneNumbers() is the set of all numbers of the form Mn = 2n - 1. isPrime() is a very simple and naive (and slow) primality checker that returns whether the given candidate is divisible by any of the numbers in the range of [2, candidate - 1]. We will use isPrime() as a filter to remove all non-prime numbers from mersenneNumbers().
As a last example we will implement a function that flattens nested sequences.
Note that using for…of comes in handy again as we can use it to iterate over Arrays and generators. Using flatten() we can now do:
Combining flatten() and map() to flatMap() we can implement another very common function that flattens the result of applying a given function to all items of a sequence. Let us use it to re-build the set of all natural numbers from the set of all even natural numbers.
Generators are powerful
May 03, 2013
You have probably already heard of generators and iterators coming to a browser near you. They have been available in Firefox for a long time and are used extensively all over the Mozilla code base. The V8 team will implement iterators and generators once ES6 has been finalized.
This post describes the current implementation in SpiderMonkey and tries to include the current state of the ES6 draft and discussions.
A simple generator
Let us take a look at a simple example of a generator function that represents an infinite sequence containing all the numbers from 0 to Number.MAX_VALUE. Once it reaches MAX_VALUE it will not increase any further but always return the same number.
Any object of the following shape is an iterator:
The next() method simply returns the item next in the sequence.
As you surely noticed the generator of the first example produces iterators that will never run out of items. The next example shows an iterator representing a finite sequence:
The given code implements a custom iterator without writing a generator function. Note that it throws StopIteration as soon as it reaches the maximum value to signal that the sequence is exhausted. It is a lot more elegant to implement the same sequence using a generator function:
Generator functions will automatically throw StopIteration when terminating. So how should one consume iterators with finite sequences?
StopIteration is special
StopIteration actually is a standard variable that is bound to an object of class StopIteration. It is an ordinary object with no properties of its own and it is not a constructor function.
As StopIteration is a singleton of type StopIteration you can also catch it by checking for equality:
StopIteration is mutable
You should be aware that StopIteration is a mutable global. Just like undefined it can be modified to hold any other value. If you write a library and want to shield against modifications from outside you can use this neat little trick I found on Dave Herman’s blog:
The inner function is a generator that terminates immediately and therefore will throw a StopIteration. The outer function simply catches and returns it.
StopIteration may become a constructor
The current iterator strawman states that StopIteration will become a constructor to maintain compatibility with generator functions returning values.
The equality check from above would not work anymore so it might be better to just use instanceof.
StopIteration may not be part of ES6
The Python way of throwing to denote the end of a sequence is backwards compatible with old ECMAScript versions but there seem to be people not happy with the current proposal. While I can’t tell whether StopIteration is really to be removed a couple of alternative suggestions have been made:
Introduce a keyword to end a frame
To not misuse exceptions for normal control flow ES6 could introduce a stopiteration or endframe keyword that would end the current frame with an optional return value. The obvious downside is that it is probably not backwards compatible.
Add an iterator.hasNext() method
Just like Java the iterator API could consist of the two methods next() and hasNext(). The client would then need to check hasNext() every time before calling next().
Let next() always return an object
Custom iterators would be required to implement a single method but would not need to throw. Instead they would return an object with the property done set to true to indicate that the sequence has ended. The value property would be used to store values passed to yield or return in a generator function.
Food for thought
This is in no way a complete list of possibilities or proposals that were brought up on es-discuss so please make up your own mind about the current iterators implementation and the suggested improvements.
The future is bright
Whether or not StopIteration will end up in ES6, generators and iterators are great and you should make sure to be prepared when they become available in modern browsers as well as on Node.js.
I concentrated particularly on StopIteration but there are lots of great posts out there that go way more into depth about generators and their usage. Make sure to also take a look at libraries like Task.js that combines generators with promises to cooperative tasks.
May 02, 2013
1 year ago, I started a spreadsheet. For 9 months we’d been rewriting Firefox for Android from the ground up, and on May 16, 2012 we released the first beta version to the Android market. I started a spreadsheet to track our star rating. I was nervous.
9 months of rewrite. In web time— in mobile web time— that’s years. Rewrites are almost always the wrong call. You get to throw away bad code, but you throw away good code, too. Hard won, battle-hardened fixes are expensive to throw away, and the code is never cleanly labelled “baby” and “bathwater.” The decision to rewrite Firefox was one of the loudest weeks I’ve had. Even once we’d decided, my hand hovered over the send key for a long time.
3.5 stars. We didn’t pull the old version from the market during the rewrite. We wanted to keep those users safe with regular security updates; that meant keeping the product online. It meant taking black eyes every day from users who tried us, who loved us for our desktop product, and who were disappointed. And because the Android rating system rounds, our already painful 3.7-star rating rounded down to 3.5. We were dead last.
7:1. If you want to maintain a 4.5 star rating, it takes seven 5-star reviews to counteract each 1-star review. Star ratings are deeply flawed for all kinds of reasons: selection bias, survivorship bias, false dilemmas, unidimensionality, reporting bias, et cetera. I know this. And still I watched them. When you try to reach people through an app store, your star rating is the first assessment of your product they’ll see. And when you try to make something great, reviews are real pieces of feedback from real human beings and they are painful and they are frustrating and they are golden.
1181 reviews in the first week. 588 of them were 5-stars. 105 of them were 1-star. I argued with my screen over 1-star comments about bugs we had already fixed. I swooned at 5-star reviews that said they were reversing earlier 1-star reviews.
6 weeks after beta, we pushed to release. By this point beta had climbed to 3.8, which rounds to 4 stars. Fists were pumped. Release sat at 3.6.
200,000 reviews and 6 releases later, this week, today, Firefox and Beta both show 4.5 (rounded) stars in the market and the team is still going strong. I’m immensely proud of the work they’ve done. It’s made me reflective and maybe a bit wordy. I want to have some profound and pithy lesson to separate then and now. Something that I can package up and hand to you. We certainly learned lessons, profound lessons, but in repeating them they sound trite:
Listen. Care about what people think. Be hungry for feedback. Don’t work forward from the tech you have to the product you can build; work backward from the product your users deserve to the tech you’ll need to get there. Ask for help, and accept it even when it hurts to admit that you need it. Don’t throw things away lightly, but be able to throw them away in those rare cases where it’s necessary. Surround yourself with the most excellent people you can find. That one helps a lot.
The haters will say I over-focus on star ratings. There are certainly lots of other good things to measure, and lots of bad things to say about stars. But the stars abide. They are inescapable. They sit front and center in your primary distribution channel. Those five little stars. And I believe they do say something about what we’ve built.
Building good things is hard and my hat is off to anyone who earnestly tries. If the good thing you build reaches people through an app store, I want you to know that I know how you feel. And I’m rooting for you.
[I posted a version of this post on Medium, because it's fun to try new things.]
May 01, 2013
While the rapid release trains provide a very good userbase for testing a feature, it's only at the release time that the "real world" feedback allows to prioritize improvements.
Unfortunately, at that time, there's the concrete risk of a disconnection:
- the user sends valuable feedback
- the development team is already busy on something else
Thanks to the open and transparent nature of the Mozilla project, the feedback is never lost, very often it naturally converts to bugs and discussions. On the other side this disconnection may cause a delay before actionable items are created.
Thus I decided, after the release, to collect the most common feedback about the new download experience and setup a meeting with people involved in its development, to work toghether towards a plan.
I went through bugs, input.mozilla.org, comments to IT articles, Mozilla newsgroups, and forum discussions, extracted the most common topics and put them on the discussion table.
I'd like to point out this is not an exotic behavior at all, persons involved in development do read feedback and are active part of the community, there is also a User Research dedicated team. Though, it is worth writing this tale to clarify that what is sometimes confused with "indifference", is instead the unavoidable challenge of satisfying a large, heterogenous and passionate community.
What came out of that is a very concrete list of things we can do. Please forgive me if I don't go too much into details for each item, I'm still in the process of adding required information to bugs. Also notice many more suggestions were evaluated, this is a filtered list.
- Notify ongoing downloads when closing the browser (bug 851774) [code]
- Increase number of downloads in the panel (bug 780837) [ux]
- Reintroduce speed for each download (bug 812894) [ux]
- Make multi-selection commands work properly (bug 844606) [code]
- Properly handle removed files in the UI (bug 726451) [code]
- Add back referrer support (bug 829201) [plan]
- Undetermined progress indicator when only unknown size downloads are in-progress [code]
- improve .part files management [plan]
- Firefox thinks failed downloads are instead complete (bug 237623) [plan]
- Remove download compelte toast notification (bug 588314) [code]
- Drag download URI, not target URI, as text (bug 832994) [code]
- Avoid animations when the progress is visible (bug 857801, bug 856935) [code]
- Ensure subpixel antialiasing on text (bug 857471) [code]
- Allow multi-selection open (bug 845861) [code]
- Fix wrong icons (bug 857584) [code]
- Improve tooltip of the download button with a summary [code]
- Evaluate adding more command buttons to the Library view (bug 862528) [ux]
Now, to the bad news: we are low on resources. Clearly everyone has many projects to follow, we'll try to dedicate available time to these changes, but we'd like having some help from the community.
April 23, 2013
The Google Summer of Code 2013 project is about to get started: today the application submission period officially starts (and is open until May 3). Mozilla is again a participating org, and students can find a list of project ideas and application advice in our Summer of Code wiki page. It’s important to remember that the list on the wiki is for possible ideas, but students are not limited to those on the list: project proposals with your own ideas are also welcome. With this disclaimer in mind, I’d like to describe in a bit more details some of the projects that we from the Firefox team have included on the list, and to answer some of the more frequent questions that we have received through e-mail and IRC about them. If you’re a student interested in one of those, read on. I wrote a blog post for each of them:
To make a good proposal, it’s important to keep in mind the goals and non-goals of the project, to demonstrate that you’ve understood how to approach the implementation of the project, and that you’re capable of doing so. It’s also important to create a solid schedule of deliverables that are used both to guide the steps of the project and to validate the pace and the progress up until that point. I’ve already written enough about the specifics and there’s a lot of content out there explaining what makes a good candidate and a good proposal, so i’ll keep this post brief.
Just as a last note, if you’ve sent us e-mail or pinged us on IRC, please be patient because we’re not online all the time or available to immediately reply, and so far we have seen a lot of interest in GSoC, so it takes us a while to reply to everyone’s emails. We hope that these blog posts will help more students to clarify some common questions about our proposals. Good luck to everyone, and remember that you’re always welcome to contribute to Mozilla, during the Summer of Code and every other season too