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_ciconst timingInfo = {
91cb0ef41Sopenharmony_ci  startTime: 0,
101cb0ef41Sopenharmony_ci  endTime: 0,
111cb0ef41Sopenharmony_ci  finalServiceWorkerStartTime: 0,
121cb0ef41Sopenharmony_ci  redirectStartTime: 0,
131cb0ef41Sopenharmony_ci  redirectEndTime: 0,
141cb0ef41Sopenharmony_ci  postRedirectStartTime: 0,
151cb0ef41Sopenharmony_ci  finalConnectionTimingInfo: {
161cb0ef41Sopenharmony_ci    domainLookupStartTime: 0,
171cb0ef41Sopenharmony_ci    domainLookupEndTime: 0,
181cb0ef41Sopenharmony_ci    connectionStartTime: 0,
191cb0ef41Sopenharmony_ci    connectionEndTime: 0,
201cb0ef41Sopenharmony_ci    secureConnectionStartTime: 0,
211cb0ef41Sopenharmony_ci    ALPNNegotiatedProtocol: 0,
221cb0ef41Sopenharmony_ci  },
231cb0ef41Sopenharmony_ci  finalNetworkRequestStartTime: 0,
241cb0ef41Sopenharmony_ci  finalNetworkResponseStartTime: 0,
251cb0ef41Sopenharmony_ci  encodedBodySize: 0,
261cb0ef41Sopenharmony_ci  decodedBodySize: 0,
271cb0ef41Sopenharmony_ci};
281cb0ef41Sopenharmony_ciconst requestedUrl = 'https://nodejs.org';
291cb0ef41Sopenharmony_ciconst initiatorType = '';
301cb0ef41Sopenharmony_ciconst cacheMode = '';
311cb0ef41Sopenharmony_ci
321cb0ef41Sopenharmony_ciasync function main() {
331cb0ef41Sopenharmony_ci  // Invalid buffer size values are converted to 0.
341cb0ef41Sopenharmony_ci  const invalidValues = [ null, undefined, true, false, -1, 0.5, Infinity, NaN, '', 'foo', {}, [], () => {} ];
351cb0ef41Sopenharmony_ci  for (const value of invalidValues) {
361cb0ef41Sopenharmony_ci    performance.setResourceTimingBufferSize(value);
371cb0ef41Sopenharmony_ci    performance.markResourceTiming(timingInfo, requestedUrl, initiatorType, globalThis, cacheMode);
381cb0ef41Sopenharmony_ci    assert.strictEqual(performance.getEntriesByType('resource').length, 0);
391cb0ef41Sopenharmony_ci    performance.clearResourceTimings();
401cb0ef41Sopenharmony_ci  }
411cb0ef41Sopenharmony_ci  // Wait for the buffer full event to be cleared.
421cb0ef41Sopenharmony_ci  await waitBufferFullEvent();
431cb0ef41Sopenharmony_ci
441cb0ef41Sopenharmony_ci  performance.setResourceTimingBufferSize(1);
451cb0ef41Sopenharmony_ci  performance.markResourceTiming(timingInfo, requestedUrl, initiatorType, globalThis, cacheMode);
461cb0ef41Sopenharmony_ci  // Trigger a resourcetimingbufferfull event.
471cb0ef41Sopenharmony_ci  performance.markResourceTiming(timingInfo, requestedUrl, initiatorType, globalThis, cacheMode);
481cb0ef41Sopenharmony_ci  assert.strictEqual(performance.getEntriesByType('resource').length, 1);
491cb0ef41Sopenharmony_ci  await waitBufferFullEvent();
501cb0ef41Sopenharmony_ci
511cb0ef41Sopenharmony_ci  // Apply a new buffer size limit
521cb0ef41Sopenharmony_ci  performance.setResourceTimingBufferSize(0);
531cb0ef41Sopenharmony_ci  // Buffer is not cleared on `performance.setResourceTimingBufferSize`.
541cb0ef41Sopenharmony_ci  assert.strictEqual(performance.getEntriesByType('resource').length, 1);
551cb0ef41Sopenharmony_ci
561cb0ef41Sopenharmony_ci  performance.clearResourceTimings();
571cb0ef41Sopenharmony_ci  assert.strictEqual(performance.getEntriesByType('resource').length, 0);
581cb0ef41Sopenharmony_ci  // Trigger a resourcetimingbufferfull event.
591cb0ef41Sopenharmony_ci  performance.markResourceTiming(timingInfo, requestedUrl, initiatorType, globalThis, cacheMode);
601cb0ef41Sopenharmony_ci  // New entry is not added to the global buffer.
611cb0ef41Sopenharmony_ci  assert.strictEqual(performance.getEntriesByType('resource').length, 0);
621cb0ef41Sopenharmony_ci  await waitBufferFullEvent();
631cb0ef41Sopenharmony_ci
641cb0ef41Sopenharmony_ci  // Apply a new buffer size limit
651cb0ef41Sopenharmony_ci  performance.setResourceTimingBufferSize(1);
661cb0ef41Sopenharmony_ci  performance.markResourceTiming(timingInfo, requestedUrl, initiatorType, globalThis, cacheMode);
671cb0ef41Sopenharmony_ci  assert.strictEqual(performance.getEntriesByType('resource').length, 1);
681cb0ef41Sopenharmony_ci}
691cb0ef41Sopenharmony_ci
701cb0ef41Sopenharmony_cifunction waitBufferFullEvent() {
711cb0ef41Sopenharmony_ci  return new Promise((resolve) => {
721cb0ef41Sopenharmony_ci    const listener = common.mustCall((event) => {
731cb0ef41Sopenharmony_ci      assert.strictEqual(event.type, 'resourcetimingbufferfull');
741cb0ef41Sopenharmony_ci      performance.removeEventListener('resourcetimingbufferfull', listener);
751cb0ef41Sopenharmony_ci      resolve();
761cb0ef41Sopenharmony_ci    });
771cb0ef41Sopenharmony_ci    performance.addEventListener('resourcetimingbufferfull', listener);
781cb0ef41Sopenharmony_ci  });
791cb0ef41Sopenharmony_ci}
801cb0ef41Sopenharmony_ci
811cb0ef41Sopenharmony_cimain();
82