@@ -27,11 +27,18 @@ class HtmlViewEmbedder {
2727 HtmlViewEmbedder ._();
2828
2929 /// The maximum number of overlay surfaces that can be live at once.
30- static const int maximumOverlaySurfaces = int .fromEnvironment (
31- 'FLUTTER_WEB_MAXIMUM_OVERLAYS ' ,
30+ static const int maximumSurfaces = int .fromEnvironment (
31+ 'FLUTTER_WEB_MAXIMUM_SURFACES ' ,
3232 defaultValue: 8 ,
3333 );
3434
35+ /// If `true` , overlay canvases are disabled.
36+ ///
37+ /// This causes all drawing to go to a single canvas, with all of the platform
38+ /// views rendered over top. This may result in incorrect rendering with
39+ /// platform views.
40+ static const bool disableOverlays = maximumSurfaces <= 1 ;
41+
3542 /// The picture recorder shared by all platform views which paint to the
3643 /// backup surface.
3744 CkPictureRecorder ? _backupPictureRecorder;
@@ -86,6 +93,9 @@ class HtmlViewEmbedder {
8693 }
8794
8895 List <CkCanvas > getCurrentCanvases () {
96+ if (disableOverlays) {
97+ return const < CkCanvas > [];
98+ }
8999 final Set <CkCanvas > canvases = < CkCanvas > {};
90100 for (int i = 0 ; i < _compositionOrder.length; i++ ) {
91101 final int viewId = _compositionOrder[i];
@@ -95,21 +105,23 @@ class HtmlViewEmbedder {
95105 }
96106
97107 void prerollCompositeEmbeddedView (int viewId, EmbeddedViewParams params) {
98- _ensureOverlayInitialized (viewId);
99- if (_viewsUsingBackupSurface.contains (viewId)) {
100- if (_backupPictureRecorder == null ) {
101- // Only initialize the picture recorder for the backup surface once.
108+ if (! disableOverlays) {
109+ _ensureOverlayInitialized (viewId);
110+ if (_viewsUsingBackupSurface.contains (viewId)) {
111+ if (_backupPictureRecorder == null ) {
112+ // Only initialize the picture recorder for the backup surface once.
113+ final CkPictureRecorder pictureRecorder = CkPictureRecorder ();
114+ pictureRecorder.beginRecording (ui.Offset .zero & _frameSize);
115+ pictureRecorder.recordingCanvas! .clear (const ui.Color (0x00000000 ));
116+ _backupPictureRecorder = pictureRecorder;
117+ }
118+ _pictureRecorders[viewId] = _backupPictureRecorder! ;
119+ } else {
102120 final CkPictureRecorder pictureRecorder = CkPictureRecorder ();
103121 pictureRecorder.beginRecording (ui.Offset .zero & _frameSize);
104122 pictureRecorder.recordingCanvas! .clear (const ui.Color (0x00000000 ));
105- _backupPictureRecorder = pictureRecorder;
123+ _pictureRecorders[viewId] = pictureRecorder;
106124 }
107- _pictureRecorders[viewId] = _backupPictureRecorder! ;
108- } else {
109- final CkPictureRecorder pictureRecorder = CkPictureRecorder ();
110- pictureRecorder.beginRecording (ui.Offset .zero & _frameSize);
111- pictureRecorder.recordingCanvas! .clear (const ui.Color (0x00000000 ));
112- _pictureRecorders[viewId] = pictureRecorder;
113125 }
114126 _compositionOrder.add (viewId);
115127
@@ -121,14 +133,26 @@ class HtmlViewEmbedder {
121133 _viewsToRecomposite.add (viewId);
122134 }
123135
136+ /// Prepares to composite [viewId] .
137+ ///
138+ /// If this returns a [CkCanvas] , then that canvas should be the new leaf
139+ /// node. Otherwise, keep the same leaf node.
124140 CkCanvas ? compositeEmbeddedView (int viewId) {
125141 // Do nothing if this view doesn't need to be composited.
126142 if (! _viewsToRecomposite.contains (viewId)) {
127- return _pictureRecorders[viewId]! .recordingCanvas;
143+ if (! disableOverlays) {
144+ return _pictureRecorders[viewId]! .recordingCanvas;
145+ } else {
146+ return null ;
147+ }
128148 }
129149 _compositeWithParams (viewId, _currentCompositionParams[viewId]! );
130150 _viewsToRecomposite.remove (viewId);
131- return _pictureRecorders[viewId]! .recordingCanvas;
151+ if (! disableOverlays) {
152+ return _pictureRecorders[viewId]! .recordingCanvas;
153+ } else {
154+ return null ;
155+ }
132156 }
133157
134158 void _compositeWithParams (int viewId, EmbeddedViewParams params) {
@@ -351,26 +375,29 @@ class HtmlViewEmbedder {
351375
352376 void submitFrame () {
353377 bool _didPaintBackupSurface = false ;
354- for (int i = 0 ; i < _compositionOrder.length; i++ ) {
355- final int viewId = _compositionOrder[i];
356- if (_viewsUsingBackupSurface.contains (viewId)) {
357- // Only draw the picture to the backup surface once.
358- if (! _didPaintBackupSurface) {
359- final SurfaceFrame backupFrame =
360- SurfaceFactory .instance.backupSurface.acquireFrame (_frameSize);
361- backupFrame.skiaCanvas
362- .drawPicture (_backupPictureRecorder! .endRecording ());
363- _backupPictureRecorder = null ;
364- backupFrame.submit ();
365- _didPaintBackupSurface = true ;
378+ if (! disableOverlays) {
379+ for (int i = 0 ; i < _compositionOrder.length; i++ ) {
380+ final int viewId = _compositionOrder[i];
381+ if (_viewsUsingBackupSurface.contains (viewId)) {
382+ // Only draw the picture to the backup surface once.
383+ if (! _didPaintBackupSurface) {
384+ final SurfaceFrame backupFrame =
385+ SurfaceFactory .instance.backupSurface.acquireFrame (_frameSize);
386+ backupFrame.skiaCanvas
387+ .drawPicture (_backupPictureRecorder! .endRecording ());
388+ _backupPictureRecorder = null ;
389+ backupFrame.submit ();
390+ _didPaintBackupSurface = true ;
391+ }
392+ } else {
393+ final SurfaceFrame frame =
394+ _overlays[viewId]! .acquireFrame (_frameSize);
395+ final CkCanvas canvas = frame.skiaCanvas;
396+ canvas.drawPicture (
397+ _pictureRecorders[viewId]! .endRecording (),
398+ );
399+ frame.submit ();
366400 }
367- } else {
368- final SurfaceFrame frame = _overlays[viewId]! .acquireFrame (_frameSize);
369- final CkCanvas canvas = frame.skiaCanvas;
370- canvas.drawPicture (
371- _pictureRecorders[viewId]! .endRecording (),
372- );
373- frame.submit ();
374401 }
375402 }
376403 if (listEquals (_compositionOrder, _activeCompositionOrder)) {
@@ -396,11 +423,13 @@ class HtmlViewEmbedder {
396423
397424 unusedViews.remove (viewId);
398425 final html.Element platformViewRoot = _viewClipChains[viewId]! .root;
399- final html.Element overlay = _overlays[viewId]! .htmlElement;
400426 platformViewRoot.remove ();
401427 skiaSceneHost! .append (platformViewRoot);
402- overlay.remove ();
403- skiaSceneHost! .append (overlay);
428+ if (! disableOverlays) {
429+ final html.Element overlay = _overlays[viewId]! .htmlElement;
430+ overlay.remove ();
431+ skiaSceneHost! .append (overlay);
432+ }
404433 _activeCompositionOrder.add (viewId);
405434 }
406435 if (_didPaintBackupSurface) {
0 commit comments