@@ -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. 
3744CkPictureRecorder ?  _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. 
124140CkCanvas ?  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