@@ -95,11 +95,15 @@ const kSupportedEntryTypes = ObjectFreeze([
9595let markEntryBuffer = [ ] ;
9696let measureEntryBuffer = [ ] ;
9797let resourceTimingBuffer = [ ] ;
98- const kMaxPerformanceEntryBuffers = 1e6 ;
98+ const kPerformanceEntryBufferWarnSize = 1e6 ;
99+ // https://www.w3.org/TR/timing-entrytypes-registry/#registry
100+ // Default buffer limit for resource timing entries.
101+ let resourceTimingBufferSizeLimit = 250 ;
102+ let dispatchBufferFull ;
103+
99104const kClearPerformanceEntryBuffers = ObjectFreeze ( {
100105 'mark' : 'performance.clearMarks' ,
101106 'measure' : 'performance.clearMeasures' ,
102- 'resource' : 'performance.clearResourceTimings' ,
103107} ) ;
104108const kWarnedEntryTypes = new SafeMap ( ) ;
105109
@@ -332,30 +336,38 @@ class PerformanceObserver {
332336 }
333337}
334338
339+ /**
340+ * https://www.w3.org/TR/performance-timeline/#dfn-queue-a-performanceentry
341+ *
342+ * Add the performance entry to the interested performance observer's queue.
343+ */
335344function enqueue ( entry ) {
336345 if ( ! isPerformanceEntry ( entry ) )
337346 throw new ERR_INVALID_ARG_TYPE ( 'entry' , 'PerformanceEntry' , entry ) ;
338347
339348 for ( const obs of kObservers ) {
340349 obs [ kMaybeBuffer ] ( entry ) ;
341350 }
351+ }
342352
353+ /**
354+ * Add the user timing entry to the global buffer.
355+ */
356+ function bufferUserTiming ( entry ) {
343357 const entryType = entry . entryType ;
344358 let buffer ;
345359 if ( entryType === 'mark' ) {
346360 buffer = markEntryBuffer ;
347361 } else if ( entryType === 'measure' ) {
348362 buffer = measureEntryBuffer ;
349- } else if ( entryType === 'resource' ) {
350- buffer = resourceTimingBuffer ;
351363 } else {
352364 return ;
353365 }
354366
355367 ArrayPrototypePush ( buffer , entry ) ;
356368 const count = buffer . length ;
357369
358- if ( count > kMaxPerformanceEntryBuffers &&
370+ if ( count > kPerformanceEntryBufferWarnSize &&
359371 ! kWarnedEntryTypes . has ( entryType ) ) {
360372 kWarnedEntryTypes . set ( entryType , true ) ;
361373 // No error code for this since it is a Warning
@@ -372,6 +384,32 @@ function enqueue(entry) {
372384 }
373385}
374386
387+ /**
388+ * Add the resource timing entry to the global buffer if the buffer size is not
389+ * exceeding the buffer limit, or dispatch a buffer full event on the global
390+ * performance object.
391+ */
392+ function bufferResourceTiming ( entry ) {
393+ if ( resourceTimingBuffer . length >= resourceTimingBufferSizeLimit ) {
394+ dispatchBufferFull ( 'resourcetimingbufferfull' ) ;
395+ return ;
396+ }
397+
398+ ArrayPrototypePush ( resourceTimingBuffer , entry ) ;
399+ }
400+
401+ // https://w3c.github.io/resource-timing/#dom-performance-setresourcetimingbuffersize
402+ function setResourceTimingBufferSize ( maxSize ) {
403+ // If the maxSize parameter is less than resource timing buffer current
404+ // size, no PerformanceResourceTiming objects are to be removed from the
405+ // performance entry buffer.
406+ resourceTimingBufferSizeLimit = maxSize ;
407+ }
408+
409+ function setDispatchBufferFull ( fn ) {
410+ dispatchBufferFull = fn ;
411+ }
412+
375413function clearEntriesFromBuffer ( type , name ) {
376414 if ( type !== 'mark' && type !== 'measure' && type !== 'resource' ) {
377415 return ;
@@ -492,4 +530,9 @@ module.exports = {
492530 filterBufferMapByNameAndType,
493531 startPerf,
494532 stopPerf,
533+
534+ bufferUserTiming,
535+ bufferResourceTiming,
536+ setResourceTimingBufferSize,
537+ setDispatchBufferFull,
495538} ;
0 commit comments