Hi,
Mozilla has been working on a Network API (counter-)proposal [1] and we
believe it's time to get some feedback from the task force.
The major goal of our proposal is to not show the connection type to the
content for various reasons cited below.
First of all, it could be easily used to fingerprint and track users: in
addition of adding new bits of information to fingerprint users, it can
help know where they are and how they behave. For example, mobile
devices are usually connecting to a wifi at home and to a mobile network
outside.
In addition, it could be mis-used to assume that a specific connection
is too slow or fast. With .type, authors would do stuff like:
if (connection.type == '2g' || connection.type == '3g') {
doSlowStuff()
} else {
doFastStuff();
}
But some other connections can be slow (like public wifi) and some 3g
connections can be fast. For information, what is under the "3G"
umbrella includes connections from a few hundred kB/s speed (~400 for
UMTS) to 20Mb/s for HSPA+ or ~50Mb/s for LTE [2].
Unfortunately, Modernizr already has code like above [3]...
Furthermore, .type is not future-proof. Because the web platform is very
different from other platforms, we have to keep in mind future-proofing
our APIs and this one is unfortunately not. For example, the code above
is not future proof because we do not know if another type of slow
connection is going to appear. In addition, code like this isn't future
proof:
if (/^[2-9]g$/.test(connection.type)) {
// We are using a mobile connection so we are not going to put too
// much stuff in localStorage.
}
This also apply for fast connections: someone might try to test for 4G,
wifi or ethernet but we can bet that other kind of fast connections are
going to appear.
The goal of Mozilla's proposal is to have a Network API that doesn't
expose the connection type but still fulfill all valid use cases. We
think this is doable with two attributes:
- .bandwidth that gives an estimation of the current download speed of
the device (in Mb/s), Infinity if unknown and 0 if offline.
- .metered that tells if the current connection is metered. Typically
when the connection is subject to a pay-per-use contract (you pay for
each Mb) or a (monthly) quota restrictive enough to prevent heavy
downloads (for example, a quota of 100G/month isn't restrictive). false
if unknown or offline.
In addition of those two attributes, there is a change event fired on
the connection object when .bandwidth or .metered changes.
For implementors, those two attributes might be a bit more complex than
.type because the bandwidth isn't a simple information to get. For
Gecko, we assume that precision is neither wanted nor recommended (for
privacy reasons) so we are going to use estimations based on the current
connection. This is an implementation detail that should have no impact
for websites.
.metered has a similar issue: we can't know programmaticaly whether the
mobile connection used by the user is subject to quota so Firefox might
ask users and reflect that to websites.
Anyhow, we believe that those two attributes should be able to replace
.type but we might be missing something so please, feel free to give any
feedback.
[1] https://wiki.mozilla.org/WebAPI/NetworkAPI
[2] LTE is advertised as 4G but LTE Advanced is actually 4G. LTE is
"nearly 4G" aka 3.9G.
[3]
https://github.com/Modernizr/Modernizr/blob/master/feature-detects/network-connection.js
Thank you for reading,
--
Mounir