11cb0ef41Sopenharmony_ci'use strict';
21cb0ef41Sopenharmony_ci
31cb0ef41Sopenharmony_ciconst common = require('../common');
41cb0ef41Sopenharmony_ciconst assert = require('assert');
51cb0ef41Sopenharmony_ci
61cb0ef41Sopenharmony_ciconst { performance } = require('perf_hooks');
71cb0ef41Sopenharmony_ci
81cb0ef41Sopenharmony_cifunction createTimingInfo(startTime) {
91cb0ef41Sopenharmony_ci  const timingInfo = {
101cb0ef41Sopenharmony_ci    startTime: startTime,
111cb0ef41Sopenharmony_ci    endTime: startTime,
121cb0ef41Sopenharmony_ci    finalServiceWorkerStartTime: 0,
131cb0ef41Sopenharmony_ci    redirectStartTime: 0,
141cb0ef41Sopenharmony_ci    redirectEndTime: 0,
151cb0ef41Sopenharmony_ci    postRedirectStartTime: 0,
161cb0ef41Sopenharmony_ci    finalConnectionTimingInfo: {
171cb0ef41Sopenharmony_ci      domainLookupStartTime: 0,
181cb0ef41Sopenharmony_ci      domainLookupEndTime: 0,
191cb0ef41Sopenharmony_ci      connectionStartTime: 0,
201cb0ef41Sopenharmony_ci      connectionEndTime: 0,
211cb0ef41Sopenharmony_ci      secureConnectionStartTime: 0,
221cb0ef41Sopenharmony_ci      ALPNNegotiatedProtocol: 0,
231cb0ef41Sopenharmony_ci    },
241cb0ef41Sopenharmony_ci    finalNetworkRequestStartTime: 0,
251cb0ef41Sopenharmony_ci    finalNetworkResponseStartTime: 0,
261cb0ef41Sopenharmony_ci    encodedBodySize: 0,
271cb0ef41Sopenharmony_ci    decodedBodySize: 0,
281cb0ef41Sopenharmony_ci  };
291cb0ef41Sopenharmony_ci  return timingInfo;
301cb0ef41Sopenharmony_ci}
311cb0ef41Sopenharmony_ciconst requestedUrl = 'https://nodejs.org';
321cb0ef41Sopenharmony_ciconst initiatorType = '';
331cb0ef41Sopenharmony_ciconst cacheMode = '';
341cb0ef41Sopenharmony_ci
351cb0ef41Sopenharmony_ciasync function main() {
361cb0ef41Sopenharmony_ci  performance.setResourceTimingBufferSize(1);
371cb0ef41Sopenharmony_ci  performance.markResourceTiming(createTimingInfo(1), requestedUrl, initiatorType, globalThis, cacheMode);
381cb0ef41Sopenharmony_ci  // Trigger a resourcetimingbufferfull event.
391cb0ef41Sopenharmony_ci  performance.markResourceTiming(createTimingInfo(2), requestedUrl, initiatorType, globalThis, cacheMode);
401cb0ef41Sopenharmony_ci  performance.markResourceTiming(createTimingInfo(3), requestedUrl, initiatorType, globalThis, cacheMode);
411cb0ef41Sopenharmony_ci  assert.strictEqual(performance.getEntriesByType('resource').length, 1);
421cb0ef41Sopenharmony_ci
431cb0ef41Sopenharmony_ci  // Clear resource timings on resourcetimingbufferfull event.
441cb0ef41Sopenharmony_ci  await new Promise((resolve) => {
451cb0ef41Sopenharmony_ci    const listener = common.mustCall((event) => {
461cb0ef41Sopenharmony_ci      assert.strictEqual(event.type, 'resourcetimingbufferfull');
471cb0ef41Sopenharmony_ci      performance.removeEventListener('resourcetimingbufferfull', listener);
481cb0ef41Sopenharmony_ci
491cb0ef41Sopenharmony_ci      performance.clearResourceTimings();
501cb0ef41Sopenharmony_ci      assert.strictEqual(performance.getEntriesByType('resource').length, 0);
511cb0ef41Sopenharmony_ci
521cb0ef41Sopenharmony_ci      resolve();
531cb0ef41Sopenharmony_ci    });
541cb0ef41Sopenharmony_ci    performance.addEventListener('resourcetimingbufferfull', listener);
551cb0ef41Sopenharmony_ci  });
561cb0ef41Sopenharmony_ci
571cb0ef41Sopenharmony_ci  // Secondary buffer has been added to the global buffer.
581cb0ef41Sopenharmony_ci  {
591cb0ef41Sopenharmony_ci    const entries = performance.getEntriesByType('resource');
601cb0ef41Sopenharmony_ci    assert.strictEqual(entries.length, 1);
611cb0ef41Sopenharmony_ci    assert.strictEqual(entries[0].startTime, 2);
621cb0ef41Sopenharmony_ci    // The last item is discarded.
631cb0ef41Sopenharmony_ci  }
641cb0ef41Sopenharmony_ci
651cb0ef41Sopenharmony_ci
661cb0ef41Sopenharmony_ci  performance.clearResourceTimings();
671cb0ef41Sopenharmony_ci  performance.setResourceTimingBufferSize(1);
681cb0ef41Sopenharmony_ci  performance.markResourceTiming(createTimingInfo(4), requestedUrl, initiatorType, globalThis, cacheMode);
691cb0ef41Sopenharmony_ci  // Trigger a resourcetimingbufferfull event.
701cb0ef41Sopenharmony_ci  performance.markResourceTiming(createTimingInfo(5), requestedUrl, initiatorType, globalThis, cacheMode);
711cb0ef41Sopenharmony_ci  performance.markResourceTiming(createTimingInfo(6), requestedUrl, initiatorType, globalThis, cacheMode);
721cb0ef41Sopenharmony_ci
731cb0ef41Sopenharmony_ci  // Increase the buffer size on resourcetimingbufferfull event.
741cb0ef41Sopenharmony_ci  await new Promise((resolve) => {
751cb0ef41Sopenharmony_ci    const listener = common.mustCall((event) => {
761cb0ef41Sopenharmony_ci      assert.strictEqual(event.type, 'resourcetimingbufferfull');
771cb0ef41Sopenharmony_ci      performance.removeEventListener('resourcetimingbufferfull', listener);
781cb0ef41Sopenharmony_ci
791cb0ef41Sopenharmony_ci      performance.setResourceTimingBufferSize(2);
801cb0ef41Sopenharmony_ci      assert.strictEqual(performance.getEntriesByType('resource').length, 1);
811cb0ef41Sopenharmony_ci
821cb0ef41Sopenharmony_ci      resolve();
831cb0ef41Sopenharmony_ci    });
841cb0ef41Sopenharmony_ci    performance.addEventListener('resourcetimingbufferfull', listener);
851cb0ef41Sopenharmony_ci  });
861cb0ef41Sopenharmony_ci
871cb0ef41Sopenharmony_ci  // Secondary buffer has been added to the global buffer.
881cb0ef41Sopenharmony_ci  {
891cb0ef41Sopenharmony_ci    const entries = performance.getEntriesByType('resource');
901cb0ef41Sopenharmony_ci    assert.strictEqual(entries.length, 2);
911cb0ef41Sopenharmony_ci    assert.strictEqual(entries[0].startTime, 4);
921cb0ef41Sopenharmony_ci    assert.strictEqual(entries[1].startTime, 5);
931cb0ef41Sopenharmony_ci    // The last item is discarded.
941cb0ef41Sopenharmony_ci  }
951cb0ef41Sopenharmony_ci
961cb0ef41Sopenharmony_ci
971cb0ef41Sopenharmony_ci  performance.clearResourceTimings();
981cb0ef41Sopenharmony_ci  performance.setResourceTimingBufferSize(2);
991cb0ef41Sopenharmony_ci  performance.markResourceTiming(createTimingInfo(7), requestedUrl, initiatorType, globalThis, cacheMode);
1001cb0ef41Sopenharmony_ci  performance.markResourceTiming(createTimingInfo(8), requestedUrl, initiatorType, globalThis, cacheMode);
1011cb0ef41Sopenharmony_ci  // Trigger a resourcetimingbufferfull event.
1021cb0ef41Sopenharmony_ci  performance.markResourceTiming(createTimingInfo(9), requestedUrl, initiatorType, globalThis, cacheMode);
1031cb0ef41Sopenharmony_ci
1041cb0ef41Sopenharmony_ci  // Decrease the buffer size on resourcetimingbufferfull event.
1051cb0ef41Sopenharmony_ci  await new Promise((resolve) => {
1061cb0ef41Sopenharmony_ci    const listener = common.mustCall((event) => {
1071cb0ef41Sopenharmony_ci      assert.strictEqual(event.type, 'resourcetimingbufferfull');
1081cb0ef41Sopenharmony_ci      performance.removeEventListener('resourcetimingbufferfull', listener);
1091cb0ef41Sopenharmony_ci
1101cb0ef41Sopenharmony_ci      performance.setResourceTimingBufferSize(1);
1111cb0ef41Sopenharmony_ci      assert.strictEqual(performance.getEntriesByType('resource').length, 2);
1121cb0ef41Sopenharmony_ci
1131cb0ef41Sopenharmony_ci      resolve();
1141cb0ef41Sopenharmony_ci    });
1151cb0ef41Sopenharmony_ci    performance.addEventListener('resourcetimingbufferfull', listener);
1161cb0ef41Sopenharmony_ci  });
1171cb0ef41Sopenharmony_ci
1181cb0ef41Sopenharmony_ci  // Secondary buffer has been added to the global buffer.
1191cb0ef41Sopenharmony_ci  {
1201cb0ef41Sopenharmony_ci    const entries = performance.getEntriesByType('resource');
1211cb0ef41Sopenharmony_ci    assert.strictEqual(entries.length, 2);
1221cb0ef41Sopenharmony_ci    assert.strictEqual(entries[0].startTime, 7);
1231cb0ef41Sopenharmony_ci    assert.strictEqual(entries[1].startTime, 8);
1241cb0ef41Sopenharmony_ci    // The last item is discarded.
1251cb0ef41Sopenharmony_ci  }
1261cb0ef41Sopenharmony_ci}
1271cb0ef41Sopenharmony_ci
1281cb0ef41Sopenharmony_cimain();
129