What’s new in Chromium 60 and Opera 47

August 15th, 2017

Opera 47 (based on Chromium 60) 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.

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.

CSS font-display

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 better align with the work being done in the Web Authentication Working Group. This includes the deprecation of requireUserMediation, which has been renamed to preventSilentAccess.

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.supportedContentEncodings can be used to detect where it can be used.
  • PushSubscription.expirationTime is now available, notifying sites when and if a subscription expires.
  • To improve performance and predictability, pointermove and mousemove events are now delivered once per animation frame (analog to requestAnimationFrame), matching the current functionality of scroll and TouchEvents.
  • The :focus-within CSS pseudo-class is now available, affecting any element the :focus pseudo-class affects, as well as any element with a descendant affected by :focus.
  • 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, InputEvent now allows user input to be managed by script, enhancing the details provided to editable elements.
  • To increase security, a beforeunload dialog 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 beforeunload event 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.
  • The /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 false if the user hasn’t explicitly tapped on the frame or any embedded frame, matching existing behavior for cross-origin iframes.
  • WEBKIT_KEYFRAME_RULE and WEBKIT_KEYFRAMES_RULE have been removed in favor of the unprefixed standardized APIs, KEYFRAME_RULE and KEYFRAMES_RULE.
  • Support for non-standard WebKitAnimationEvent and WebKitTransitionEvent has been removed from document.createEvent().
  • To better align with spec, NodeIterator.filter and TreeWalker.filter no longer wrap JavaScript objects, and .prototype has been removed from window.NodeFilter.
  • 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.

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.