What’s new in Chromium 71 and Opera 58

Opera 58 (based on Chromium 71) for Mac, Windows, Linux is out! To find out what’s new for users, see our Desktop blog post. Here’s what it means for web developers.

Support for COLR/CPAL fonts

Opera now supports COLR/CPAL fonts which are vector based fonts with color information. As fonts become available, we can expect Unicode-based emojis to become more interesting.

Performance > Async touchpad pinch zoom events

By default touchpad events create synchronous synthetic ctrl+wheel events that allow documents to cancel them. This can unfortunately greatly increase the time between a user action and changes on the screen. To improve the situation the browser has changed so that if the first synthetic ctrl+wheel event is let through, then no more synthetic events will be created. If you do want to cancel pinch zoom, you need to cancel all the events. You can read more about this in the design document


JavaScript > Internationalization of relative times

With Intl.RelativeTimeFormat() you can now get relative time descriptions for any supported locale. Two simple examples below:

formatter = new Intl.RelativeTimeFormat("en");
formatter.format(2.5, "hour");  // "in 2.5 hours"

formatter = new Intl.RelativeTimeFormat("sv", {numeric: "auto"});  // Swedish, text or numbers.
formatter.format(-1, "week");  // "förra veckan" (last week)

You can read more about what you can do with Intl.RelativeTimeFormat by reading what the feature developers say about it.

JavaScript Modules: Credentials mode defaults to “same-origin”

The default credentials mode for module script requests is changing from “omit” to “same-origin”, providing credentials to same-origin module script requests and their descendant scripts (static & dynamic imports). The previous behavior can be surprising in that it is misaligned with other high-level features like the Fetch API, and could not be reused for the main request, causing a second server connection which added latency.


Media > Removed SpeechSynthesis.speak without user activation

Unfortunately speechSynthesis.speak() has been abused so it will now only be available once the user has interacted with the page. With this change, everything that makes sounds follows the same autoplay policy.

Media > MediaElement and MediaStream nodes defined only for AudioContext (removed from OfflineAudioContext)

Opera now only allows creation of MediaElementAudioSourceNode, MediaStreamAudioSourceNode, and MediaStreamAudioDestinationNode elements using an AudioContext. Previously these could be created using an OfflineAudioContext, but that does not comply with the specification and made little sense.

Media > URL.createObject() can no longer be used for MediaStreams

The normal way to embed MediaStreams is to assign them to scrObject, but until now URL.createObject() has also worked. It has been deprecated since 2013 though and with this release, that obsolete method has been removed.

ServiceWorkers > Changes to when importScript() can be run

ServiceWorkers can no longer import scripts with importScripts() once the ServiceWorker has been installed.

Storage > Persistent storage permission requests

A site can request to store data persistently, that is, in a way that will not be exposed to automatic deletion just because of lack of storage space. In this version a site can request the user’s permission to do so through the persistent-storage property in the Permission API.

Removed document.origin

The document.origin property was not cross-browser and the supported, cross-browser, way to access ones origin is with self.origin so in this release document.origin was removed.

TextEncoderStream and TextDecoderStream APIs

Text encoding and decoding can now be done with streams to enable you to easily convert streams of binary data to text and vice-versa.

Unprefixed fullscreen API

For many years, the fullscreen API has had a vendor prefix (which all browser vendors have reused), but coming in Opera 58, and other Chromium 71 browser, there is a fully unprefixed fullscreen API.


CSS > Shorter syntax for double stops in color gradients

It is common to repeat color stops in a gradient to create single colored bands like this:

linear-gradient(45deg, black 25%, black 50%, white 50%, white 75%)

With the new CSS4 specification comes support for a more compact syntax where the repeated color name is no longer needed:

linear-gradient(45deg, black 25% 50%, white 50% 75%)

CSS > left and right for text-underline-position

Vertical text has had slightly undefined positioning of underlines. With the newly added values left and right for text-underline-position, it should now be possible to make a cross-browser declaration of where an underline should be positioned.

CSS > Improve :host, :host-context, and ::slotted specificity

Certain Shadow DOM v1 CSS selectors did not match in the correct order. In Opera 58, :host() and :host-context() pseudo classes as well as ::slotted() arguments will be taken into account when calculating a selectors specificity.

WebKitAnimationEvent and WebKitTransitionEvent are removed

AnimationEvent and TransitionEvent, without the WebKit prefix, has been available for some time and in this Opera version the prefixed versions were removed after usage dropped had sufficiently.

What’s next?

If you’re interested in experimenting with features that are in the pipeline for future versions of Opera, we recommend following our Opera Developer stream.

You can also see features that we and other Chromium/Blink contributors are working on by looking at the Chrome Platform Status page.