What’s new in Chromium 60 and Opera 47
Paint Timing API
While no generalized metric perfectly captures when a page is loaded in all cases, First Paint and First Contentful Paint are invaluable numbers to measure critical user moments during loading. To give developers better insight into their site’s loading performance, the new Paint Timing API exposes metrics that capture First Paint and First Contentful Paint.
Downloadable web fonts are often used to create more visually rich web experiences. Historically, Opera has delayed rendering text until the specified font is available, to ensure visual correctness. However, downloading a font can take as long as several seconds on a poor connection, significantly delaying the time until a user sees content. Opera now supports the CSS
font-display property as part of an
@font-face descriptor, allowing developers to specify how and when Opera displays text content while downloading fonts.
Credential Management API improvements
Starting in Opera 47,
PasswordCredential also contains the user’s password, alleviating the need for a custom
fetch() to access a stored password.
Some changes has also been made to to better align with the work being done in the Web Authentication Working Group. This includes the deprecation of
requireUserMediation, which has been renamed to
Other features in this release
- Object rest & spread properties are now supported, making it simpler to merge and shallow-clone objects and implement various immutable object patterns.
- The new Web Push Encryption format is now supported and
PushManager.supportedContentEncodingscan be used to detect where it can be used.
PushSubscription.expirationTimeis now available, notifying sites when and if a subscription expires.
- To improve performance and predictability,
mousemoveevents are now delivered once per animation frame (analog to
requestAnimationFrame), matching the current functionality of scroll and
:focus-withinCSS pseudo-class is now available, affecting any element the
:focuspseudo-class affects, as well as any element with a descendant affected by
- The CSS
frames()timing function is now available, allowing for proper frame-based animations. (Animations where all frames have exactly the same duration, including its first and last frames.)
- To provide an improved way to capture editing actions,
InputEventnow allows user input to be managed by script, enhancing the details provided to editable elements.
- To increase security, a
beforeunloaddialog triggered when the user leaves a site is now only shown if the frame attempting to display it has ever received a user gesture or user interaction, though the
beforeunloadevent is still dispatched regardless.
- VP9, an open and royalty-free video coding format, can now be used with the MP4 (ISO BMFF) container and requires the new VP9 string format mentioned below.
- A new VP9 string format is now available and accepted by various media-related APIs, enabling developers to describe the encoding properties that are common in video codecs, but are not yet exposed.
Deprecations and interoperability improvements
getElementsByTagName()now accepts qualified names in response to an update to the DOM specification.
/deep/combinator which has been removed from the current specification, now behaves like the descendant combinator, which is effectively a no-op. Previously it would enable selecting descendants in shadow trees.
- To improve the user experience, calls to
Navigator.vibrate()now immediately return
falseif the user hasn’t explicitly tapped on the frame or any embedded frame, matching existing behavior for cross-origin
WEBKIT_KEYFRAMES_RULEhave been removed in favor of the unprefixed standardized APIs,
- Support for non-standard
WebKitTransitionEventhas been removed from
- To better align with spec,
.prototypehas been removed from
RTCPeerConnection.prototype.getStreamById()is being removed, and a polyfill is recommended as a replacement.
SVGPathElement.prototype.getPathSegAtLength()has been deprecated, and will be removed in Opera 49 (Chromium 62), since it has been been removed from the SVGPathElement interface in the SVG2 spec.
Headers.prototype.getAll()has been removed from the Fetch API in line with its removal from the spec.
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.