Chris H-C: In Lighter News… |
…Windows XP Firefox users may soon be able to properly render poop.
Here at Mozilla, we take these things seriously.
:chutten
https://chuttenblog.wordpress.com/2016/04/28/in-lighter-news/
|
Ian Bicking: A Product Journal: Data Up and Data Down |
I’m blogging about the development of a new product in Mozilla, look here for my other posts in this series
We’re in the process of reviewing the KPI (Key Performance Indicators) for Firefox Hello (relatedly I joined the Firefox Hello team as engineering manager in October). Mozilla is trying (like everyone else) to make data-driven decisions. Basing decisions on data has some potential to remove or at least reveal bias. It provides a feedback mechanism that can provide continuity even as there are personnel changes. It provides some accountability over time. Data might also provide insight about product opportunities which we might otherwise miss.
Enter the KPI: for Hello (like most products) the key performance indicators are number of users, growth in users over time, user retention, and user sentiment (e.g., we use the Net Promoter Score). But like most projects those are not actually our success criteria: product engagement is necessary but not sufficient for organizational goals. Real goals might be revenue, social or political impact, or improvement in brand sentiment.
The value of KPI is often summarized as “letting us know how we’re doing”. I think the value KPI offers is more select:
I’m skeptical that KPI can provide the inverse of 1: when you think a product is doing poorly, can KPI reveal that it is doing well? Because there’s another set of criteria that defines “success”, KPI is necessary but not sufficient. It requires a carefully objective executive to revise their negative opinion about the potential of a project based on KPI, and they may have reasonably lost faith that a project’s KPI-defined success can translate into success given organizational goals.
The other theoretical value of KPI is that you could correlate KPI with changes to the product, testing whether each change improves your product’s core value. I’m sure people manage to do this, with both very fine grained measurements and fine grained deployments of changes. But it seems more likely to me that for most projects given a change in KPI you’ll simply have to say “yup” and come up with unverified theories about that change.
The metrics that actually support the development of the product are not “key”, they are “incidental”. These are metrics that find bugs in the product design, hint at unexplored opportunities, confirm the small wins. These are metrics that are actionable by the people making the product: how do people interact with the tool? What do they use it for? Where do they get lost? What paths lead to greater engagement?
I’m trying to think more consciously about the difference between managing up and managing down. A softer way of phrasing this is managing in and managing out – but in this case I think the power dynamics are worth highlighting.
KPI is data that goes up. It lets someone outside the project – and above the project – make choices: about investment, redirection, cancellation. KPI data doesn’t go down, it does little to help the people doing the work. Feeling joy or despair about your project based on KPI is not actionable for those people on the inside of a project.
I would also distinguish two kinds of management here: one perspective on management is that the organization should set up the right incentives and consequences so that rewards are aligned with organizational goals. The right incentives might make people adapt their behavior to get alignment; how they adapt is undefined. The right incentives might also exclude those who aren’t in alignment, culling misalignment from the organization. Another perspective is that the organization should work to support people, that misalignment of purpose between a person and the organization is more likely a bug than a misalignment of intention. Are people black boxes that we can nudge via punishment and reward? Are there less mechanical ways to influence change?
Student performance measurement are another kind of KPI. It lets someone on the outside (of the classroom) know if things are going well or poorly for the students. It says little about why, and it doesn’t support improvement. School reform based on measurement presumes that teachers and schools are able to achieve the desired outcomes, but simply not willing. A risk of top-down reform: the people on the top use a perspective from the top. As an authority figure, how do I make decisions? The resulting reform is disempowering, supporting decisions from above, as opposed to using data to support the empowerment of those making the many day-to-day decisions that might effect a positive outcome.
Of course, having data available to inform decisions at all levels – from the executive to the implementor – would be great. But there’s a better criteria for data: it should support decision making processes. What are your most important decisions?
As an example from Mozilla, we have data about how much Firefox is used and its marketshare. How much should we pay attention to this data? We certainly don’t have the granularity to connect changes in this KPI to individual changes we make in the project. The only real way to do that is through controlled experiments (which we are trying). We aren’t really willing to triage the project; no one is asking “should we just give up on Firefox?” The only real choice we can make is: are we investing enough in Firefox, or should we invest more? That’s a question worth asking, but we need to keep our attention on the question and not the data. For instance, if we decide to increase investment in Firefox, the immediate questions are: what kind of investment? Over what timescale? Data can be helpful to answer those questions, but not just any data.
Weeks after I wrote (but didn’t publish) this post I encountered Why Greatness Cannot Be Planned: The Myth of the Objective, a presentation by Kenneth Stanley:
“Setting an objective can block its own achievement. It can be an obstacle to creativity and innovation in general. Without protection of individual autonomy collaboration can become dangerously objective.”
The example he uses is manually searching a space of nonlinear image generation to find interesting images. The positive example is one where people explore, branching from novel examples until something recognizable emerges:
One negative example is one where an algorithm explores with a goal in mind:
Another negative example is selection by voting, instead of personal exploration; a product of convergent consensus instead of divergent treasure hunting:
If you decide what you are looking for, you are unlikely to find it. This generated image search space is deliberately nonlinear, so it’s difficult to understand how actions affect outcomes. Though artificial, I think the example is still valid: in a competitive environment, the thing you are searching for is hard to find, because if it was not hard then someone would have found it. And it’s probably hard because actions affect outcomes in unexpected ways.
You could describe this observation as another way of describing the pitfalls of hill climbing: getting stuck at local maximums. Maybe an easy fix is to add a little randomness, to bounce around, to see what lies past the hill you’ve found. But the hills themselves can be distractions: each hill supposes a measurement. The divergent search doesn’t just reveal novel solutions, but it can reveal a novel rubric for success.
This is also a similar observation to that in Innovator’s Dilemma: specifically that in these cases good management consistently and deliberately keeps a company away from novelty and onto the established track, and it does so by paying attention to the feedback that defines the company’s (current) success. The disruptive innovation, a term somewhat synonymous with the book, is an innovation that requires a change in metrics, and that a large portion of the innovation is finding the metric (and so finding the market), not implementing the maximizing solution.
But I digress from the topic of data. If we’re going to be data driven to entirely new directions, we may need data that doesn’t answer a question, doesn’t support a decision, but just tells us about things we don’t know. To support exploration, not based on a hypothesis which we confirm or reject based on the data, because we are still trying to discover our hypothesis. We use the data to look for the hidden variable, the unsolved need, the desire that has not been articulated.
I think we look for this kind of data more often than we would admit. Why else would we want complex visualizations? The visualizations are our attempt at finding a pattern we don’t expect to find.
I’m lousy at conclusions. All those words up there are like data, and I’m curious what they mean, but I haven’t figured it out yet.
http://www.ianbicking.org/blog/2016/04/product-journal-data-up-and-data-down.html
|
Geoff Lankow: Does Firefox update despite being set to "never check for updates"? This might be why. |
If, like me, you have set Firefox to "never check for updates" for some reason, and yet it does sometimes anyway, this could be your problem: the chrome debugger.
The chrome debugger uses a separate profile, with the preferences copied from your normal profile. But, if your prefs (such as app.update.enabled
) have changed, they remain in the debugger profile as they were when you first opened the debugger.
App update can be started by any profile using the app, so the debugger profile sees the pref as it once was, and goes looking for updates.
Solution? Copy the app update prefs from the main profile to the debugger profile (mine was at ~/.cache/mozilla/firefox/31392shv.default/chrome_debugger_profile
), or just destroy the debugger profile and have a new one created next time you use it.
Just thought you might like to know.
|
Air Mozilla: Privacy Lab - April 2016 - Encryption vs. the FBI |
Riana Pfefferkorn, Cryptography Fellow at the Stanford Center for Internet and Society, will talk about the FBI's dispute with Apple over encrypted iPhones.
https://air.mozilla.org/privacy-lab-april-2016-encryption-vs-the-fbi/
|
Mike Hommey: Announcing git-cinnabar 0.3.2 |
Git-cinnabar is a git remote helper to interact with mercurial repositories. It allows to clone, pull and push from/to mercurial remote repositories, using git.
These release notes are also available on the git-cinnabar wiki.
This is mostly a bug and regression-fixing release.
|
Mozilla Addons Blog: Join the Featured Add-ons Community Board |
Are you a big fan of add-ons? Think you can help help identify the best content to spotlight on AMO? Then let’s talk!
All the add-ons featured on addons.mozilla.org (AMO) are selected by a board of community members. Each board consists of 5-8 members who nominate and select featured add-ons once a month for six months. Featured add-ons help users discover what’s new and useful, and downloads increase dramatically in the months they’re featured, so your participation really makes an impact.
And now the time has come to assemble a new board for the months July – December.
Anyone from the add-ons community is welcome to apply: power users, theme designers, developers, and evangelists. Priority will be given to applicants who have not served on the board before, followed by those from previous boards, and finally from the outgoing board. This page provides more information on the duties of a board member. To be considered, please email us at amo-featured@mozilla.org with your name, and tell us how you’re involved with AMO. The deadline is Friday, May 10, 2016 at 23:59 PDT. The new board will be announced about a week after.
We look forward to hearing from you!
https://blog.mozilla.org/addons/2016/04/27/join-the-featured-add-ons-community-board-3/
|
Michael Kaply: Broken Add-ons in Firefox 46 |
A lot of add-ons are being broken by a subtle change in Firefox 46, in particular the removal of legacy array/generator comprehension.
Most of these add-ons (including mine) did not use array comprehension intentionally, but they copied some code from this page on developer.mozilla.org for doing an md5 hash of a string. It looked like this:
var s = [toHexString(hash.charCodeAt(i)) for (i in hash)].join("");
You should search through your source code for toHexString and make sure you aren’t using this. MDN was updated in January to fix this. Here’s what the new code looks like:
var s = Array.from(hash, (c, i) => toHexString(hash.charCodeAt(i))).join("");
The new code will only work in Firefox 32 and beyond. If for some reason you need an older version, you can go through the history of the page to find the array based version.
Using this old code will cause a syntax error, so it will cause much more breakage than you realize. You’ll want to get it fixed sooner than later because Firefox 46 started rolling out yesterday.
As a side note, Giorgio Maone caught this in January, but unfortunately all that was updated was the MDN page.
https://mike.kaply.com/2016/04/27/broken-add-ons-in-firefox-46/
|
Air Mozilla: April 2016 Speaker Series: When Change is the Only Constant, Org Structure Doesn't Matter - Kirsten Wolberg |
Regardless of whether an organization is decentralized or command & control, large-scale changes are never simple nor straightforward. There's no silver bullets. And yet, when...
|
Air Mozilla: The Joy of Coding - Episode 55 |
mconley livehacks on real Firefox bugs while thinking aloud.
|
Rail Aliiev: Firefox 46.0 and SHA512SUMS |
In my previous post I introduced the new release process we have been adopting in the 46.0 release cycle.
Release build promotion has been in production since Firefox 46.0 Beta 1. We have discovered some minor issues; some of them are already fixed, some still waiting.
One of the visible bugs is Bug 1260892. We generate a big SHA512SUMS file, which should contain all important checksums. With numerous changes to the process the file doesn't represent all required files anymore. Some files are missing, some have different names.
We are working on fixing the bug, but you can use the following work around to verify the files.
For example, if you want to verify http://ftp.mozilla.org/pub/firefox/releases/46.0/win64/ach/Firefox%20Setup%2046.0.exe, you need use the following 2 files:
Example commands:
# download all required files $ wget -q http://ftp.mozilla.org/pub/firefox/releases/46.0/win64/ach/Firefox%20Setup%2046.0.exe $ wget -q http://ftp.mozilla.org/pub/firefox/candidates/46.0-candidates/build5/win64/ach/firefox-46.0.checksums $ wget -q http://ftp.mozilla.org/pub/firefox/candidates/46.0-candidates/build5/win64/ach/firefox-46.0.checksums.asc $ wget -q http://ftp.mozilla.org/pub/firefox/releases/46.0/KEY # Import Mozilla Releng key into a temporary GPG directory $ mkdir .tmp-gpg-home && chmod 700 .tmp-gpg-home $ gpg --homedir .tmp-gpg-home --import KEY # verify the signature of the checksums file $ gpg --homedir .tmp-gpg-home --verify firefox-46.0.checksums.asc && echo "OK" || echo "Not OK" # calculate the SHA512 checksum of the file $ sha512sum "Firefox Setup 46.0.exe" c2ed64298ac2140d8dbdaed28cabc90b38dd9444e9c0d6dd335a2a32cf043a35314945536a5c75124a88bf418a4e2ba77256be223425380e7fcc45a97da8f479 Firefox Setup 46.0.exe # lookup for the checksum in the checksums file $ grep c2ed64298ac2140d8dbdaed28cabc90b38dd9444e9c0d6dd335a2a32cf043a35314945536a5c75124a88bf418a4e2ba77256be223425380e7fcc45a97da8f479 firefox-46.0.checksums c2ed64298ac2140d8dbdaed28cabc90b38dd9444e9c0d6dd335a2a32cf043a35314945536a5c75124a88bf418a4e2ba77256be223425380e7fcc45a97da8f479 sha512 46275456 install/sea/firefox-46.0.ach.win64.installer.exe
This is just a temporary work around and the bug will be fixed ASAP.
https://rail.merail.ca/posts/firefox-460-and-sha512sums.html
|
Air Mozilla: SuMo Community Call 27th April 2016 |
This is the sumo weekly call We meet as a community every Wednesday 17:00 - 17:30 UTC The etherpad is here: https://public.etherpad-mozilla.org/p/sumo-2016-04-27
https://air.mozilla.org/sumo-community-call-27th-april-2016/
|
Air Mozilla: Bay Area Rust Meetup April 2016 |
Rust meetup on the subject of operating systems.
|
Air Mozilla: Connected Devices Weekly Program Review, 26 Apr 2016 |
Weekly project updates from the Mozilla Connected Devices team.
https://air.mozilla.org/connected-devices-weekly-program-review-20160426/
|
Richard Newman: Different kinds of storage |
I’ve been spending most of my time so far on Project Tofino thinking about how a user agent stores data.
A user agent is software that mediates your interaction with the world. A web browser is one particular kind of user agent: one that fetches parts of the web and shows them to you.
(As a sidenote: browsers are incredibly complicated, not just for the obvious reasons of document rendering and navigation, but also because parts of the web need to run code on your machine and parts of it are actively trying to attack and track you. One of a browser’s responsibilities is to keep you safe from the web.)
Chewing on Redux, separation of concerns, and Electron’s process model led to us drawing a distinction between a kind of ‘profile service’ and the front-end browser itself, with ‘profile’ defined as the data stored and used by a traditional browser window. You can see the guts of this distinction in some of our development docs.
The profile service stores full persistent history and data like it. The front-end, by contrast, has a pure Redux data model that’s much closer to what it needs to show UI — e.g., rather than all of the user’s starred pages, just a list of the user’s five most recent.
The front-end is responsible for fetching pages and showing the UI around them. The back-end service is responsible for storing data and answering questions about it from the front-end.
To build that persistent storage we opted for a mostly event-based model: simple, declarative statements about the user’s activity, stored in SQLite. SQLite gives us durability and known performance characteristics in an embedded database.
On top of this we can layer various views (materialized or not). The profile service takes commands as input and pushes out diffs, and the storage itself handles writes by logging events and answering queries through views. This is the CQRS concept applied to an embedded store: we use different representations for readers and writers, so we can think more clearly about the transformations between them.
Where next?
One of the reasons we have a separate service is to acknowledge that it might stick around when there are no browser windows open, and that it might be doing work other than serving the immediate needs of a browser window. Perhaps the service is pre-fetching pages, or synchronizing your data in the background, or trying to figure out what you want to read next. Perhaps you can interact with the service from something other than a browser window!
Some of those things need different kinds of storage. Ad hoc integrations might be best served by a document store; recommendations might warrant some kind of graph database.
When we look through that lens we no longer have just a profile service wrapping profile storage. We have a more general user agent service, and one of the data sources it manages is your profile data.
|
Mozilla Addons Blog: Migrating Popup ALT Attribute from XUL/XPCOM to WebExtensions |
Today’s post comes from Piro, the developer of Popup ALT Attribute, in addition to 40 other add-ons. He shares his thoughts about migrating XUL/XPCOM add-ons to WebExtensions, and shows us how he did it with Popup ALT Attribute. You can see the full text of this post on his personal blog.
***
Hello, add-on developers. My name is YUKI Hiroshi aka Piro, a developer of Firefox add-ons. For many years I developed Firefox and Thunderbird add-ons personally and for business, based on XUL and XPCOM.
I recently started to research the APIs are required to migrate my add-ons to WebExtensions, because Mozilla announced that XUL/XPCOM add-ons will be deprecated at the end of 2017. I realized that only some add-ons can be migrated with currently available APIs, and
Popup ALT Attribute is one such add-on.
Here is the story of how I migrated it.
Popup ALT Attribute is an ancient add-on started in 2002, to show what is written in the alt
attribute of img
HTML elements on web pages. By default, Firefox shows only the title
attribute as a tooltip.
Initially, the add-on was implemented to replace an internal function FillInHTMLTooltip()
of Firefox itself.
In February 2016, I migrated it to be e10s-compatible. It is worth noting that depending on your add-on, if you can migrate it directly to WebExtensions, it will be e10s-compatible by default.
I read the tutorial on how to build a new simple WebExtensions-based add-on from scratch before migration, and I realized that bootstrapped extensions are similar to WebExtensions add-ons:
My add-on was easily re-formatted as a WebExtensions add-on, because I already migrated it to bootstrapped.
This is the initial version of the manifest.json
I wrote. There were no localization and options UI:
{
"manifest_version": 2,
"name": "Popup ALT Attribute",
"version": "4.0a1",
"description": "Popups alternate texts of images or others like NetscapeCommunicator(Navigator) 4.x, and show long descriptions in the multi-row tooltip.",
"icons": { "32": "icons/icon.png" },
"applications": {
"gecko": { "id": "{61FD08D8-A2CB-46c0-B36D-3F531AC53C12}",
"strict_min_version": "48.0a1" }
},
"content_scripts": [
{ "all_frames": true,
"matches": [""],
"js": ["content_scripts/content.js"],
"run_at": "document_start" }
]
}
I had already separated the main script to a frame script and a loader for it. On the other hand, manifest.json
can have some manifest keys to describe how scripts are loaded. It means that I don’t need to put my custom loaders in the package anymore. Actually, a script for any web page can be loaded with the content_scripts
rule in the above sample. See the documentation for content_scripts
for more details.
So finally only 3 files were left.
Before:
+ install.rdf
+ icon.png
+ [components]
+ [modules]
+ [content]
+ content-utils.js
And after:
+ manifest.json (migrated from install.rdf)
+ [icons]
| + icon.png (moved)
+ [content_scripts]
+ content.js (moved and migrated from content-utils.js)
And I still had to isolate my frame script from XPCOM.
nsIPrefBranch
and some XPCOM components via XPConnect, so they were temporarily commented out.Ci.nsIDOMNode.ELEMENT_NODE
, had to be replaced as Node.ELEMENT_NODE
.mousemove
events from web pages was attached to the global namespace for a frame script, but it was re-attached to the document
itself of each web page, because the script was now executed on each web page directly.For the old install.rdf
I had a localized description. In WebExtensions add-ons I had to do it in different way. See how to localize messages for details. In short I did the following:
Added files to define localized descriptions:
+ manifest.json
+ [icons]
+ [content_scripts]
+ [_locales]
+ [en_US]
| + messages.json (added)
+ [ja]
+ messages.json (added)
Note, en_US
is different from en-US
in install.rdf
.
English locale, _locales/en_US/messages.json
was:
{
"name": { "message": "Popup ALT Attribute" },
"description": { "message": "Popups alternate texts of images or others like NetscapeCommunicator(Navigator) 4.x, and show long descriptions in the multi-row tooltip." }
}
Japanese locale, _locales/ja/messages.json
was also included. And, I had to update my manifest.json
to embed localized messages:
{
"manifest_version": 2,
"name": "__MSG_name__",
"version": "4.0a1",
"description": "__MSG_description__",
"default_locale": "en_US",
...
__MSG_****__
in string values are automatically replaced to localized messages. You need to specify the default locale manually via the default_locale
key.
Sadly, Firefox 45 does not support the localization feature, so you need to use Nightly 48.0a1 or newer to try localization.
Currently, WebExtensions does not provide any feature completely compatible to nsIPrefBranch
. Instead, there are simple storage APIs. It can be used like an alternative of nsIPrefBranch
to set/get user preferences. This add-on had no configuration UI but had some secret preferences to control its advanced features, so I did it for future migrations of my other add-ons, as a trial.
Then I encountered a large limitation: the storage API is not available in content scripts. I had to create a background script just to access the storage, and communicate with it via the inter-sandboxes messaging system. [Updated 4/27/16: bug 1197346 has been fixed on Nightly 49.0a1, so now you don’t need any hack to access the storage system from content scripts anymore. Now, my library (Configs.js) just provides easy access for configuration values instead of the native storage API.]
Finally, I created a tiny library to do that. I don’t describe how I did it here, but if you hope to know details, please see the source. There are just 177 lines.
I had to update my manifest.json
to use the library from both the background page and the content script, like:
"background": {
"scripts": [
"common/Configs.js", /* the library itself */
"common/common.js" /* codes to use the library */
]
},
"content_scripts": [
{ "all_frames": true,
"matches": [""],
"js": [
"common/Configs.js", /* the library itself */
"common/common.js", /* codes to use the library */
"content_scripts/content.js"
],
"run_at": "document_start" }
]
Scripts listed in the same section share a namespace for the section. I didn’t have to write any code like require()
to load a script from others. Instead, I had to be careful about the listing order of scripts, and wrote a script requiring a library after the library itself, in each list.
One last problem was: how to do something like the about:config
or the MCD — general methods to control secret preferences across add-ons.
For my business clients, I usually provide add-ons and use MCD to lock their configurations. (There are some common requirements for business use of Firefox, so combinations of add-ons and MCD are more reasonable than creating private builds of Firefox with different configurations for each client.)
I think I still have to research around this point.
WebExtensions provides a feature to create options pages for add-ons. It is also not supported on Firefox 45, so you need to use Nightly 48.0a1 for now. As I previously said, this add-on didn’t have its configuration UI, but I implemented it as a trial.
In XUL/XPCOM add-ons, rich UI elements like
,
,
, and more are available, but these are going away at the end of next year. So I had to implement a custom configuration UI based on pure HTML and JavaScript. (If you need more rich UI elements, some known libraries for web applications will help you.)
On this step I created two libraries:
I’ve successfully migrated my Popup ALT Attribute add-on from XUL/XPCOM to WebExtensions. Now it is just a branch but I’ll release it after Firefox 48 is available.
Here are reasons why I could do it:
However, it is a rare case for me. My other 40+ add-ons require some privilege, and/or they work outside the content area. Most of my cases are such non-typical add-ons.
I have to do triage, plan, and request new APIs not only for me but for other XUL/XPCOM add-on developers also.
Thank you for reading.
|
The Mozilla Blog: Update to Firefox Released Today |
The latest version of Firefox was released today. It features an improved look and feel for Linux users, a minor security improvement and additional updates for all Firefox users.
The update to Firefox for Android features minor changes, including an improvement to user notifications and clearer homescreen shortcut icons.
More information:
https://blog.mozilla.org/blog/2016/04/26/update-to-firefox-released-today/
|
Air Mozilla: Martes mozilleros, 26 Apr 2016 |
Reuni'on bi-semanal para hablar sobre el estado de Mozilla, la comunidad y sus proyectos. Bi-weekly meeting to talk (in Spanish) about Mozilla status, community and...
|
Marcia Knous: Nightly is where I will live |
|
David Lawrence: Happy BMO Push Day! |
the following changes have been pushed to bugzilla.mozilla.org:
discuss these changes on mozilla.tools.bmo.
https://dlawrence.wordpress.com/2016/04/26/happy-bmo-push-day-15/
|
Daniel Glazman: First things first |
Currently implementing many new features into Postbox, I carefully read (several times) Mark Surman's recent article on Thunderbird's future. I also read Simon Phipps's report twice. Then the contract offer for a Thunderbird Architect posted by Mozilla must be read too:
... Thunderbird is facing a number of technical challenges, including but not limited to:
- ...
- The possible future deprecation of XUL, its current user interface technology and XPCOM, its current component technology, by Mozilla
- ...
In practice, the last line above means for Thunderbird:
Well, sorry to say, but that's a bit of a « technical challenge »... So yes, that's indeed a « fork in the road » but let's be serious a second, it's unfortunately this kind of fork; rewriting the app is not a question of if but only a question of when. Unless Thunderbird dies entirely, of course.
Evaluating potential hosts for Thunderbird and a fortiori chosing one seems to me rather difficult without first discussing the XUL/XPCOM-less future of the app, i.e. without having in hands the second milestone delivered by the Thunderbird Architect. First things first. I would also be interested in knowing how many people MoCo will dedicate to the deXULXPCOMification of Firefox, that would allow some extrapolations and some pretty solid requirements (and probably rather insurmountable...) for TB's host.
Last but not least and from a more personal point of view, I feel devastated confronting Mark's article and the Mozilla Manifesto.
http://www.glazman.org/weblog/dotclear/index.php?post/2016/04/26/First-things-first
|