New in Chrome 77

Chrome 77 is rolling out now!

I'm Pete LePage, let's dive in and see what's new for developers in Chrome 77!

Largest Contentful Paint

Understanding and measuring the real world performance of your site can be hard. Metrics like load, or DOMContentLoaded, don't tell you what the user is seeing on screen. First Paint, and First Contentful Paint, only capture the beginning of the experience. First Meaningful Paint is better, but it's complex, and sometimes wrong.

The Largest Contentful Paint API, available starting in Chrome 77, reports the render time of the largest content element visible in the viewport and makes it possible to measure when the main content of the page is loaded.

To measure the Largest Contentful Paint, you'll need to use a Performance Observer, and look for largest-contentful-paint events.

let lcp;
const po = new PerformanceObserver((eList) => {
  const e = eList.getEntries();
  const last = e[e.length - 1];
  lcp = last.renderTime || last.loadTime;

const poOpts = {
  type: 'largest-contentful-paint',
  buffered: true

Since a page often loads in stages, it's possible that the largest element on a page will change, so you should only report the last largest-contentful-paint event to your analytics service.

addEventListener('visibilitychange', function fn() {
  const visState = document.visibilityState;
  if (lcp && visState === 'hidden') {
    sendToAnalytics({'lcp': lcp});
    removeEventListener('visibilitychange', fn, true);
}, true);

Phil has a great post about the Largest Contentful Paint on

New forms capabilities

Many developers build custom form controls, either to customize the look and feel of existing elements, or to build new controls that aren't built in to the browser. Typically this involves using JavaScript and hidden <input> elements, but it's not a perfect solution.

Two new web features, added in Chrome 77, make it easier to build custom form controls, and remove the many of the existing limitations.

The formdata event

The formdata event is a low-level API that lets any JavaScript code participate in a form submission. To use it, add a formdata event listener to the form you want to interact with.

const form = document.querySelector('form');
form.addEventListener('formdata', ({formData}) => {
  formData.append('my-input', myInputValue);

When the user clicks the submit button, the form fires the formdata event, which includes a FormData object that holds all of the data being submitted. Then, in your formdata event handler, you can update or modify the formdata before it's submitted.

Form-associated custom elements

Form-associated custom elements help to bridge the gap between custom elements and native controls. Adding a static formAssociated property tells the browser to treat the custom element like all other form elements. You should also add common properties found on input elements, like name, value, and validity to ensure consistency with native controls.

class MyCounter extends HTMLElement {
  static formAssociated = true;

  constructor() {
    this._internals = this.attachInternals();
    this._value = 0;

Check out More capable form controls on for all the details!

Native lazy loading

I'm not sure how I missed native lazy loading in my last video! It's pretty amazing, so I'm including it now. Lazy loading is a technique that allows you to defer the loading of non-critical resources, like off-screen <img>'s, or <iframe>'s - until they're needed, increasing the performance of your page.

Starting in Chrome 76, the browser handles lazy loading for you, without the need to write custom lazy loading code, or use a separate JavaScript library.

To tell the browser you want an image, or iframe lazy loaded, use the loading="lazy" attribute. Images and iframes that are "above the fold" load normally. And those that are below, are only fetched when the user scrolls near them.

<img src="image.jpg" loading="lazy" width="400" height="250" alt="...">

Check out Browser level lazy-loading for the web on for details.

Chrome Dev Summit 2019

The Chrome Dev Summit is coming up November 11th and 12th.

It's a great opportunity to learn about the latest tools and updates coming to the web platform, and hear directly from the Chrome engineering team.

It'll be streamed live on our YouTube channel, or if you want to attend in person, you can request your invite at the Chrome Dev Summit 2019 website.

And more!

These are just a few of the changes in Chrome 77 for developers, of course, there's plenty more.

The Contact Picker API, available as an origin trial, is a new, on-demand picker that allows users to select an entry or entries from their contact list and share limited details of the selected contacts with a website.

And there are new measurement units in the intl.NumberFormat API.

Further reading

This covers only some of the key highlights. Check the links below for additional changes in Chrome 77.


Want to stay up to date with our videos, then subscribe to our Chrome Developers YouTube channel, and you'll get an email notification whenever we launch a new video.

I'm Pete LePage, and as soon as Chrome 78 is released, I'll be right here to tell you -- what's new in Chrome!