- From: Kris Maglione <kmaglione@mozilla.com>
- Date: Wed, 5 Oct 2016 12:45:26 -0700
- To: Sebastian Noack <sebastian@adblockplus.org>
- Cc: public-browserext@w3.org
On Tue, Oct 04, 2016 at 04:05:08PM +0200, Sebastian Noack wrote:
>Since I wasn't there, I'd like to follow up here. We (Adblock Plus) would
>love to see a browser extension API that natively supports promises, though
>as long as some supported browsers still expect callbacks it wouldn't make
>anything easier for us. But it seems that the Chromium team is also
>considering using promises:
>https://bugs.chromium.org/p/chromium/issues/detail?id=328932
My understanding is that promise support is a very low priority
for the Chrome team, and they don't intend to implement it any
time soon. However, I'm currently working on a lightweight
polyfill library that should allow extensions written to work
with promises in the `browser` namespace to work consistently in
Chrome and browsers that target our spec.
>As for compatibility with the existing Chrome extension API, I think that
>won't be an issue. We could just have methods take an optional callback and
>return also promise. IMO this would make more sense than a separate
>namespace or a new manifest option/version.
That's the approach that Firefox currently takes for the
`browser` namespace, but we're likely to move to only supporting
promises in that namespace if that's what winds up in the spec.
I think that for the sake of simplicity and consistency, that's
the approach that makes the most sense.
>However, the only problem I see, is that some methods, currently do some
>internal optimizations if the callback is omitted, e.g. if you send a
>message and there is no callback for the response, Chrome immediately
>closes the internal port. Those kind of optimizations would be impossible
>if a promise is returned, which might or might not be used later. Though
>I'm not sure how significant those optimizations are, and if necessary, I
>guess, we could still keep using callbacks for the few APIs where it makes
>sense for performance reasons, while using promises for most methods.
Firefox implements the callback-based versions of these APIs as
thing wrappers around the promise-based implementation, so our
internals don't behave any differently when optional callbacks
are omitted. This hasn't caused any noticeable performance
impact for us, so far.
>Also, I'd like to point out, that in addition to have async methods return
>a promise, it would be great if message responders could deal with
>promises, so that instead of:
>
> browser.runtime.onMessage.addListener(function(message, sendResponse)
> {
> if (message == "get-foo")
> {
> browser.storage.local.get("foo", function(items)
> {
> sendResponse(items.foo);
> });
> return true;
> }
> return false;
> });
>
>One could write:
>
> browser.runtime.onMessage.addListener(function(message)
> {
> if (message == "get-foo")
> {
> return browser.storage.local.get("foo").then(items => items.foo);
> }
> });
As it happens, this is exactly how it currently works in Firefox
:)
--
Kris Maglione
Firefox Add-ons Engineer
Mozilla Corporation
Received on Wednesday, 5 October 2016 19:46:58 UTC