Google today launched Chrome 76 for Windows, Mac, Linux, Android, and iOS. The release includes Adobe Flash blocked by default, Incognito mode detection disabled, multiple PWA improvements, and more developer features. You can update to the latest version now using Chrome’s built-in updater or download it directly from google.com/chrome.

With over 1 billion users, Chrome is both a browser and a major platform that web developers must consider. In fact, with Chrome’s regular additions and changes, developers often have to stay on top of everything available — as well as what has been deprecated or removed. Chrome 76, for example, removes the lazyload feature policy.

Adobe Flash and Incognito mode detection blocked

Google has been taking baby steps to kill off Flash for years. In 2015, Chrome started automatically pausing less important Flash content. In 2016, Chrome blocking “behind the scenes” Flash content and using HTML5 by default.

Google Chrome blocks Adobe Flash by default

In July 2017, however, Adobe said it would kill Flash by 2020. With Chrome 76, Flash is now blocked by default. Users can still turn it on in settings, but next year, Flash will be removed from Chrome entirely.

https://twitter.com/paul_irish/status/1138471166115368960

Separately, Chrome 76 also disables one way that websites can detect if you’re using Incognito mode. Some sites use this to stop users from getting around paywalls. Chrome 76 implements the FileSystem API differently so scripts can no longer use it as an indicator.

Progressive Web Apps

Chrome 76 makes it easier to install Progressive Web Apps (PWAs) on the desktop, via an install button in the omnibox. Instead of the install flow being hidden within the three-dot menu, if a site meets the PWA installability criteria, users can just click the button.

The first time a user visits a site that meets the aforementioned criteria, Chrome also shows a mini-infobar. Developers who want to prevent the mini-infobar from appearing and provide their own install promotion instead can now do so by listening for the beforeinstallprompt event and calling preventDefault(). You can then update your UI to notify the user by adding an install button or other element.

When a PWA is installed on Android, Chrome automatically requests and installs a WebAPK. Being installed via an APK makes it possible for your app to show up in the app launcher, in Android’s app settings, and to register a set of intent filters. Until now, Chrome would check every three days to see if the manifest has changed, and if a new WebAPK is required. Starting in Chrome 76, Chrome will check the manifest every day. If any of the key properties have changed, Chrome will request and install a new WebAPK.

Android and iOS

Chrome 76 for Android is rolling out slowly on Google Play but the changelog isn’t up yet. The aforementioned PWA changes are likely the main highlights.

Chrome 76 for iOS is also slowly rolling out on Apple’s App Store. It includes five improvements:

  • Find In Page now works on iFrames, including AMP (Accelerated Mobile Pages).
  • When you sign up to a new site, you’ll see a suggestion for a strong and unique password on your keyboard.
  • You can control all your Sync and Google services settings in one place, and see what data is used by each feature.
  • Your history is now synced and deleted more reliably.
  • Some users will see a new design for the way Chrome offers to save passwords.

The first change is probably the most useful one.

Security fixes

Chrome 76 implements 43 security fixes. The following were found by external researchers:

  • [$10000][977462] High CVE-2019-5850: Use-after-free in offline page fetcher. Reported by Brendon Tiszka on 2019-06-21
  • [$6000][956947] High CVE-2019-5860: Use-after-free in PDFium. Reported by Anonymous on 2019-04-26
  • [$3000][976627] High CVE-2019-5853: Memory corruption in regexp length check. Reported by yngwei(@yngweijw) of IIE Varas and sakura (@eternalsakura13) of Tecent Xuanwu Lab on 2019-06-19
  • [$3000][977107] High CVE-2019-5851: Use-after-poison in offline audio context. Reported by Zhe Jin(金哲),Luyao Liu(刘路遥) from Chengdu Security Response Center of Qihoo 360 Technology Co. Ltd on 2019-06-20
  • [$TBD][959438] High CVE-2019-5859: res: URIs can load alternative browsers. Reported by James Lee (@Windowsrcer) of Kryptos Logic on 2019-05-03
  • [$5000][964245] Medium CVE-2019-5856: Insufficient checks on filesystem: URI permissions. Reported by Yongke Wang of Tencent’s Xuanwu Lab (xlab.tencent.com) on 2019-05-17
  • [$N/A][943494] Medium CVE-2019-5863: Use-after-free in WebUSB on Windows. Reported by Yuxiang Li (@Xbalien29) of Tencent Security Platform Department on 2019-03-19
  • [$N/A][964872] Medium CVE-2019-5855: Integer overflow in PDFium. Reported by Zhen Zhou of NSFOCUS Security Team on 2019-05-20
  • [$TBD][973103] Medium CVE-2019-5865: Site isolation bypass from compromised renderer. Reported by Ivan Fratric of Google Project Zero on 2019-06-11
  • [$500][960209] Low CVE-2019-5858: Insufficient filtering of Open URL service parameters. Reported by evi1m0 of Bilibili Security Team on 2019-05-07
  • [$500][936900] Low CVE-2019-5864: Insufficient port filtering in CORS for extensions. Reported by Devin Grindle on 2019-02-28
  • [$TBD][946260] Low CVE-2019-5862: AppCache not robust to compromised renderers. Reported by Jun Kokatsu, Microsoft Browser Vulnerability Research on 2019-03-26
  • [$TBD][951525] Low CVE-2019-5861: Click location incorrectly checked. Reported by Robin Linus ( robinlinus.com ) on 2019-04-10
  • [$N/A][961237] Low CVE-2019-5857: Comparison of -0 and null yields crash. Reported by cloudfuzzer on 2019-05-09
  • [$N/A][966263] Low CVE-2019-5854: Integer overflow in PDFium text rendering. Reported by Zhen Zhou of NSFOCUS Security Team on 2019-05-23
  • [$TBD][976713] Low CVE-2019-5852: Object leak of utility functions. Reported by David Erceg on 2019-06-19
  • [988889] Various fixes from internal audits, fuzzing and other initiatives

Google thus spent at least $28,000 in bug bounties for this release. As always, the security fixes alone should be enough incentive for you to upgrade.

Developer features

Chrome 73 introduced dark mode for Mac users, and Chrome 74 did the same for Windows users. Chrome 76 includes a prefers-color-scheme media query that allows a website or web app to adopt the user’s preferred display mode from the operating system.

The Chrome team continues to improve the payments APIs, with Chrome 76 bringing three changes. A merchant website or web app can now respond when a user changes payment instruments. The PaymentRequestEvent has a new method called changePaymentMethod() and the PaymentRequest object now supports an event handler called paymentmethodchange. Both can notify a merchant when the user changes payment instruments — the former returns a promise that resolves with a new PaymentRequest instance. Chrome now also makes it easier to use the payments APIs for self-signed certificates on the local development environment via the —ignore-certificate-errors flag.

Chrome 76 also updates the V8 JavaScript engine. Version 7.6 includes JSON.parse improvements, frozen/sealed array improvements, unicode string handling, new JavaScript language features, and native stack walking. Check out the full changelog for more information.

Other developer features in this release include:

  • Animation.updatePlaybackRate: Adds Animation.updatePlaybackRate(), which lets you seamlessly transition the playback rate of an animation such that there is no visible jump in the animation. Current time is preserved at the instance the new playback rate takes effect.
  • Async clipboard: read and write images: Implements programmatic copying and pasting of images for the Async Clipboard API. This change also updates navigator.clipboard.read() and navigator.clipboard.write() to comply with the specification. Programmatic copying and pasting of images is Chromium’s top starred bug.
  • The escape key is no longer treated as a user activation. Browsers prevent calls to abusable APIs (like popup, fullscreen, vibrate, etc.) unless the user activates the page through direct interactions. Not all interactions trigger user activation.
  • Introduces a new HTTP request header that sends additional metadata about a request’s provenance (is it cross-site, is it triggered from <img>, etc.) to the server to allow it to make security decisions which might mitigate some kinds of attacks based on timing the server’s response (XSS leaks and others).
  • Adds the form.requestSubmit() function, which requests form submission. It includes interactive constraint validation, dispatches a submit event, and takes a reference to the submitter button.
  • The Image Capture API provides a means to set the focusMode to manual which is not useful if you cannot set the focus distance. This change provides an interface for getting focus range values and setting focus distance value.
  • Adds the pending attribute to the Web Animations API. A pending animation is one that is waiting on an asynchronous operation that affects the play state. Adding support for this attribute does not affect the rendering or timing of animations, but simply exposes the signal.
  • Adds a commit() function to IDBTransaction objects, which explicitly marks a transaction as not accepting further requests. Currently, IndexedDB only commits a transaction after all associated requests have had their completion event handlers executed, and no new requests have been queued by the event handlers. Developers can use the explicit commit() function to shave a few event loop cycles off of the latency of their transactions.
    The primary benefit of explicit commit is that it increases the throughput of read and write requests made on an object store. This is a clear performance benefit in terms of the rate at which operations can be processed. Additionally, the increase in speed is advantageous because it adds stability to IndexedDB by reducing the probability that a disruptive event occurs within the lifetime of a transaction.
  • Adds dateStyle and timeStyle options to functions on Intl.DateTimeFormat, specifically formatToParts() and resolveOptions(). These options provide a compact way to request the appropriate, locale-specific date and time of given length styles.
  • Changes BigInt.prototype.toLocaleString() to locale-sensitive number formatting and changes Intl.NumberFormat.prototype.format() and formatToParts() to accept BigInt as input.
  • Enables the Media Capabilities API in all types of workers to help website and web apps pick the best media to stream from a worker. The information can then be used to create the MediaStream from a worker.
  • Adds Promise.allSettled(), which returns a promise that is fulfilled with an array of promise state snapshots, but only after all the original promises have settled, in other words after it has either resolved or rejected.
  • Adds three new methods to the Blob interface to perform read operations: text(), arrayBuffer(), and stream().
  • Exposes information about the SCTP transport that is used to carry WebRTC data channels such as max-message-size and max channels.
  • Allows changing the association between the track associated with an RTCRtpSender and streams. Stream association causes tracks in the same stream to be synchronized. This is useful, for example, if during a call a user switches from a front-facing camera to a back-facing camera and the application uses RTCRtpSender.replaceTrack(). On the receiving end the new track must be associated with the existing stream and synchronized with its auto track.
  • Adds the setCodecPreferences() method, which overrides the default codec preferences used by the user agent. This allows applications to disable the negotiation of specific codecs. It also allows an application to cause a remote peer to prefer the codec that appears first in the list for sending.
  • The white-space:break-spaces value allows authors to specify that any sequence of preserved white space that would otherwise overflow a line and hang (as per the CSS Text Module specification’s Trimming and Positioning rules) must be broken.

For a full rundown of what’s new, check out the Chrome 76 milestone hotlist.

Google releases a new version of its browser every six weeks or so. Chrome 77 will arrive by early September.