private CLS()

in src/performance/index.ts [128:169]


  private CLS() {
    if (!isLayoutShiftSupported()) {
      return this.coreWebMetrics.clsTime = -1;
    }
    let partValue = 0;
    let entryList: LayoutShift[] = [];

    const handleEntries = (entries: LayoutShift[]) => {
      entries.forEach((entry) => {
        // Count layout shifts without recent user input only
        if (!entry.hadRecentInput) {
          const firstEntry = entryList[0];
          const lastEntry = entryList[entryList.length - 1];
          if (
            partValue &&
            entry.startTime - lastEntry.startTime < 1000 &&
            entry.startTime - firstEntry.startTime < 5000
          ) {
            partValue += entry.value;
          } else {
            partValue = entry.value;
          }
          entryList.push(entry);
        }
      });
      if (partValue > 0) {
        setTimeout(() => {
          this.coreWebMetrics.clsTime = partValue;
        }, 3000);
      }
    };

    const obs = observe('layout-shift', handleEntries);

    if (!obs) {
      return;
    }
    onHidden(() => {
      handleEntries(obs.takeRecords() as CLSMetric['entries']);
      obs!.disconnect();
    });
  }