2727 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2828 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2929 */
30+ /* eslint-disable rulesdir/no-imperative-dom-api */
3031
3132import * as Common from '../../core/common/common.js' ;
3233import * as i18n from '../../core/i18n/i18n.js' ;
@@ -106,8 +107,8 @@ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
106107
107108export class TimelineFlameChartDataProvider extends Common . ObjectWrapper . ObjectWrapper < EventTypes > implements
108109 PerfUI . FlameChart . FlameChartDataProvider {
109- private droppedFramePatternCanvas : HTMLCanvasElement ;
110- private partialFramePatternCanvas : HTMLCanvasElement ;
110+ private droppedFramePattern : CanvasPattern | null ;
111+ private partialFramePattern : CanvasPattern | null ;
111112 private timelineDataInternal : PerfUI . FlameChart . FlameChartTimelineData | null = null ;
112113 private currentLevel = 0 ;
113114
@@ -150,9 +151,7 @@ export class TimelineFlameChartDataProvider extends Common.ObjectWrapper.ObjectW
150151 super ( ) ;
151152 this . reset ( ) ;
152153
153- this . droppedFramePatternCanvas = document . createElement ( 'canvas' ) ;
154- this . partialFramePatternCanvas = document . createElement ( 'canvas' ) ;
155- this . preparePatternCanvas ( ) ;
154+ [ this . droppedFramePattern , this . partialFramePattern ] = this . preparePatternCanvas ( ) ;
156155
157156 this . framesGroupStyle = this . buildGroupStyle ( { useFirstLineForOverview : true } ) ;
158157 this . screenshotsGroupStyle =
@@ -900,40 +899,38 @@ export class TimelineFlameChartDataProvider extends Common.ObjectWrapper.ObjectW
900899 return '' ;
901900 }
902901
903- private preparePatternCanvas ( ) : void {
902+ private preparePatternCanvas ( ) : Array < CanvasPattern | null > {
904903 // Set the candy stripe pattern to 17px so it repeats well.
905904 const size = 17 ;
906- this . droppedFramePatternCanvas . width = size ;
907- this . droppedFramePatternCanvas . height = size ;
908-
909- this . partialFramePatternCanvas . width = size ;
910- this . partialFramePatternCanvas . height = size ;
911-
912- const ctx = this . droppedFramePatternCanvas . getContext ( '2d' ) ;
913- if ( ctx ) {
914- // Make a dense solid-line pattern.
915- ctx . translate ( size * 0.5 , size * 0.5 ) ;
916- ctx . rotate ( Math . PI * 0.25 ) ;
917- ctx . translate ( - size * 0.5 , - size * 0.5 ) ;
918-
919- ctx . fillStyle = 'rgb(255, 255, 255)' ;
920- for ( let x = - size ; x < size * 2 ; x += 3 ) {
921- ctx . fillRect ( x , - size , 1 , size * 3 ) ;
922- }
923- }
924-
925- const ctx2 = this . partialFramePatternCanvas . getContext ( '2d' ) ;
926- if ( ctx2 ) {
927- // Make a sparse dashed-line pattern.
928- ctx2 . strokeStyle = 'rgb(255, 255, 255)' ;
929- ctx2 . lineWidth = 2 ;
930- ctx2 . beginPath ( ) ;
931- ctx2 . moveTo ( 17 , 0 ) ;
932- ctx2 . lineTo ( 10 , 7 ) ;
933- ctx2 . moveTo ( 8 , 9 ) ;
934- ctx2 . lineTo ( 2 , 15 ) ;
935- ctx2 . stroke ( ) ;
936- }
905+ const droppedFrameCanvas = document . createElement ( 'canvas' ) ;
906+ const partialFrameCanvas = document . createElement ( 'canvas' ) ;
907+ droppedFrameCanvas . width = droppedFrameCanvas . height = size ;
908+ partialFrameCanvas . width = partialFrameCanvas . height = size ;
909+
910+ const ctx = droppedFrameCanvas . getContext ( '2d' , { willReadFrequently : true } ) as CanvasRenderingContext2D ;
911+ // Make a dense solid-line pattern.
912+ ctx . translate ( size * 0.5 , size * 0.5 ) ;
913+ ctx . rotate ( Math . PI * 0.25 ) ;
914+ ctx . translate ( - size * 0.5 , - size * 0.5 ) ;
915+
916+ ctx . fillStyle = 'rgb(255, 255, 255)' ;
917+ for ( let x = - size ; x < size * 2 ; x += 3 ) {
918+ ctx . fillRect ( x , - size , 1 , size * 3 ) ;
919+ }
920+ const droppedFramePattern = ctx . createPattern ( droppedFrameCanvas , 'repeat' ) ;
921+
922+ const ctx2 = partialFrameCanvas . getContext ( '2d' , { willReadFrequently : true } ) as CanvasRenderingContext2D ;
923+ // Make a sparse dashed-line pattern.
924+ ctx2 . strokeStyle = 'rgb(255, 255, 255)' ;
925+ ctx2 . lineWidth = 2 ;
926+ ctx2 . beginPath ( ) ;
927+ ctx2 . moveTo ( 17 , 0 ) ;
928+ ctx2 . lineTo ( 10 , 7 ) ;
929+ ctx2 . moveTo ( 8 , 9 ) ;
930+ ctx2 . lineTo ( 2 , 15 ) ;
931+ ctx2 . stroke ( ) ;
932+ const partialFramePattern = ctx . createPattern ( partialFrameCanvas , 'repeat' ) ;
933+ return [ droppedFramePattern , partialFramePattern ] ;
937934 }
938935
939936 private drawFrame (
@@ -946,20 +943,15 @@ export class TimelineFlameChartDataProvider extends Common.ObjectWrapper.ObjectW
946943 context . fillStyle = transformColor ( this . entryColor ( entryIndex ) ) ;
947944
948945 if ( frame . dropped ) {
946+ context . fillRect ( barX , barY , barWidth , barHeight ) ;
949947 if ( frame . isPartial ) {
950948 // For partially presented frame boxes, paint a yellow background with
951949 // a sparse white dashed-line pattern overlay.
952- context . fillRect ( barX , barY , barWidth , barHeight ) ;
953-
954- const overlay = context . createPattern ( this . partialFramePatternCanvas , 'repeat' ) ;
955- context . fillStyle = overlay || context . fillStyle ;
950+ context . fillStyle = this . partialFramePattern || context . fillStyle ;
956951 } else {
957952 // For dropped frame boxes, paint a red background with a dense white
958953 // solid-line pattern overlay.
959- context . fillRect ( barX , barY , barWidth , barHeight ) ;
960-
961- const overlay = context . createPattern ( this . droppedFramePatternCanvas , 'repeat' ) ;
962- context . fillStyle = overlay || context . fillStyle ;
954+ context . fillStyle = this . droppedFramePattern || context . fillStyle ;
963955 }
964956 }
965957 context . fillRect ( barX , barY , barWidth , barHeight ) ;
0 commit comments