Last week we were talking about the need for private browsing, or something like it, in Firefox Mobile. Even though you might not share your phone with other people, you might share a tablet – especially the “family tablet”, sitting there on the coffee table. Private browsing is an obtrusive system, at least as implemented in Mozilla, and it’s doubtful we could add it for Firefox Mobile in time for the upcoming release. Also, private browsing doesn’t really satisfy the sharing use case for tablets.
Firefox has the concept of profiles, which could be useful for sharing. From the Firefox Support site:
Firefox saves your personal information such as bookmarks, passwords, and user preferences in a set of files called your profile, which is stored in a separate location from the Firefox program files. You can have multiple Firefox profiles, each containing a separate set of user information. The Profile Manager allows you to create, remove, rename, and switch profiles.
The built-in Profile Manager, used in desktop Firefox, isn’t really a good fit for mobile, so I made a simple, restartless add-on for managing profiles in Firefox Mobile, called Mobile Profiles. From the Preferences panel, you can add, remove and switch profiles.
I’m thinking about adding support for password protecting profiles and clearing private data when closing Firefox. Let me know what you think.
Development Details
I found the restartless, bootstrapped system I have been playing with worked well for this add-on. The nsIToolkitProfileService handles most of the heavy lifting. The UI is a little more complicated than my original trivial example, but I still only have two (2) files in my XPI. View the source here.
Without XUL overlays, I had to add the UI using DOM operations (createElement
and setAttribute
). Not a big deal, but it got tedious, so I made a little helper function:
function $x(aDocument, aElement, aAttributes) {
if (typeof(aElement) == "string")
aElement = aDocument.createElement(aElement);
for (attribute in aAttributes)
aElement.setAttribute(attribute, aAttributes[attribute]);
return aElement;
}
Using this helper means adding elements via DOM is a little less syntax:
let itemManage = $x(window.document, "setting", {
"id": "prefs-mobileprofiles-profiles",
"title": "User Profiles",
"desc": "Add, remove or switch profiles",
"class": "setting-group",
"type": "control"
});
I could probably make the helper function be a little more useful by adding some features you’d find in HTML DOM builders, but it’s good enough for now. I’ll probably add a chrome.manifest
so I can support normal localization using properties
files.