What’s new in Chromium 60 and Opera 47
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 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
andmousemove
events are now delivered once per animation frame (analog torequestAnimationFrame
), matching the current functionality of scroll andTouchEvents
. - 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 thebeforeunload
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 returnfalse
if the user hasn’t explicitly tapped on the frame or any embedded frame, matching existing behavior for cross-originiframes
. WEBKIT_KEYFRAME_RULE
andWEBKIT_KEYFRAMES_RULE
have been removed in favor of the unprefixed standardized APIs,KEYFRAME_RULE
andKEYFRAMES_RULE
.- Support for non-standard
WebKitAnimationEvent
andWebKitTransitionEvent
has been removed fromdocument.createEvent()
. - To better align with spec,
NodeIterator.filter
andTreeWalker.filter
no longer wrap JavaScript objects, and.prototype
has been removed fromwindow.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.