Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 9c401d3

Browse files
authored
Revert onrender change (#49333)
This reverts #49214 and #48758. #49214 appears to cause a Flutter Gold diff during the engine roll. See flutter/flutter#140434 for an example. It's unclear to me whether this is an expected diff and should be approved or unexpected and should be reverting, so reverting to the last previous rollable state. ## Pre-launch Checklist - [ ] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [ ] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [ ] I read and followed the [Flutter Style Guide] and the [C++, Objective-C, Java style guides]. - [ ] I listed at least one issue that this PR fixes in the description above. - [ ] I added new tests to check the change I am making or feature I am adding, or the PR is [test-exempt]. See [testing the engine] for instructions on writing and running engine tests. - [ ] I updated/added relevant documentation (doc comments with `///`). - [ ] I signed the [CLA]. - [ ] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/wiki/Tree-hygiene#overview [Tree Hygiene]: https://github.com/flutter/flutter/wiki/Tree-hygiene [test-exempt]: https://github.com/flutter/flutter/wiki/Tree-hygiene#tests [Flutter Style Guide]: https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style [testing the engine]: https://github.com/flutter/flutter/wiki/Testing-the-engine [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/wiki/Tree-hygiene#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/wiki/Chat
1 parent b5ba500 commit 9c401d3

31 files changed

+210
-294
lines changed

lib/web_ui/lib/platform_dispatcher.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ abstract class PlatformDispatcher {
8080

8181
void scheduleFrame();
8282

83-
Future<void> render(Scene scene, [FlutterView view]);
83+
void render(Scene scene, [FlutterView view]);
8484

8585
AccessibilityFeatures get accessibilityFeatures;
8686

lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ class HtmlViewEmbedder {
364364
sceneHost.append(_svgPathDefs!);
365365
}
366366

367-
Future<void> submitFrame() async {
367+
void submitFrame() {
368368
final ViewListDiffResult? diffResult =
369369
(_activeCompositionOrder.isEmpty || _compositionOrder.isEmpty)
370370
? null
@@ -388,7 +388,7 @@ class HtmlViewEmbedder {
388388
_context.pictureRecorders[pictureRecorderIndex].endRecording());
389389
pictureRecorderIndex++;
390390
}
391-
await rasterizer.rasterizeToCanvas(overlay, pictures);
391+
rasterizer.rasterizeToCanvas(overlay, pictures);
392392
}
393393
for (final CkPictureRecorder recorder
394394
in _context.pictureRecordersCreatedDuringPreroll) {
@@ -443,7 +443,8 @@ class HtmlViewEmbedder {
443443
sceneHost.insertBefore(platformViewRoot, elementToInsertBefore);
444444
final RenderCanvas? overlay = _overlays[viewId];
445445
if (overlay != null) {
446-
sceneHost.insertBefore(overlay.htmlElement, elementToInsertBefore);
446+
sceneHost.insertBefore(
447+
overlay.htmlElement, elementToInsertBefore);
447448
}
448449
} else {
449450
final DomElement platformViewRoot = _viewClipChains[viewId]!.root;
@@ -653,8 +654,6 @@ class HtmlViewEmbedder {
653654
}
654655
}
655656
_svgClipDefs.clear();
656-
_svgPathDefs?.remove();
657-
_svgPathDefs = null;
658657
}
659658

660659
static void removeElement(DomElement element) {

lib/web_ui/lib/src/engine/canvaskit/rasterizer.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class Rasterizer {
3030

3131
/// Creates a new frame from this rasterizer's surface, draws the given
3232
/// [LayerTree] into it, and then submits the frame.
33-
Future<void> draw(LayerTree layerTree) async {
33+
void draw(LayerTree layerTree) {
3434
final ui.Size frameSize = view.physicalSize;
3535
if (frameSize.isEmpty) {
3636
// Available drawing area is empty. Skip drawing.
@@ -49,10 +49,10 @@ class Rasterizer {
4949
compositorFrame.raster(layerTree, ignoreRasterCache: true);
5050

5151
sceneHost.prepend(renderCanvasFactory.baseCanvas.htmlElement);
52-
await rasterizeToCanvas(renderCanvasFactory.baseCanvas,
52+
rasterizeToCanvas(renderCanvasFactory.baseCanvas,
5353
<CkPicture>[pictureRecorder.endRecording()]);
5454

55-
await viewEmbedder.submitFrame();
55+
viewEmbedder.submitFrame();
5656
}
5757

5858
/// Disposes of this rasterizer.

lib/web_ui/lib/src/engine/canvaskit/renderer.dart

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ class CanvasKitRenderer implements Renderer {
8585
viewManager.onViewDisposed.listen(_onViewDisposed);
8686
_instance = this;
8787
}();
88-
registerHotRestartListener(dispose);
8988
return _initialized;
9089
}
9190

@@ -403,7 +402,7 @@ class CanvasKitRenderer implements Renderer {
403402
CkParagraphBuilder(style);
404403

405404
@override
406-
Future<void> renderScene(ui.Scene scene, ui.FlutterView view) async {
405+
void renderScene(ui.Scene scene, ui.FlutterView view) {
407406
// "Build finish" and "raster start" happen back-to-back because we
408407
// render on the same thread, so there's no overhead from hopping to
409408
// another thread.
@@ -418,7 +417,7 @@ class CanvasKitRenderer implements Renderer {
418417
"Unable to render to a view which hasn't been registered");
419418
final Rasterizer rasterizer = _rasterizers[view.viewId]!;
420419

421-
await rasterizer.draw((scene as LayerScene).layerTree);
420+
rasterizer.draw((scene as LayerScene).layerTree);
422421
frameTimingsOnRasterFinish();
423422
}
424423

@@ -452,7 +451,6 @@ class CanvasKitRenderer implements Renderer {
452451
rasterizer.dispose();
453452
}
454453
_rasterizers.clear();
455-
clearFragmentProgramCache();
456454
}
457455

458456
@override

lib/web_ui/lib/src/engine/canvaskit/surface.dart

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -115,18 +115,22 @@ class Surface {
115115
_surface!.flush();
116116

117117
if (browserSupportsCreateImageBitmap) {
118-
JSObject bitmapSource;
118+
DomImageBitmap bitmap;
119119
if (Surface.offscreenCanvasSupported) {
120-
bitmapSource = _offscreenCanvas! as JSObject;
120+
bitmap = (await createImageBitmap(_offscreenCanvas! as JSObject, (
121+
x: 0,
122+
y: _pixelHeight - frameSize.height.toInt(),
123+
width: frameSize.width.toInt(),
124+
height: frameSize.height.toInt(),
125+
)).toDart)! as DomImageBitmap;
121126
} else {
122-
bitmapSource = _canvasElement! as JSObject;
127+
bitmap = (await createImageBitmap(_canvasElement! as JSObject, (
128+
x: 0,
129+
y: _pixelHeight - frameSize.height.toInt(),
130+
width: frameSize.width.toInt(),
131+
height: frameSize.height.toInt()
132+
)).toDart)! as DomImageBitmap;
123133
}
124-
final DomImageBitmap bitmap = await createImageBitmap(bitmapSource, (
125-
x: 0,
126-
y: _pixelHeight - frameSize.height.toInt(),
127-
width: frameSize.width.toInt(),
128-
height: frameSize.height.toInt(),
129-
));
130134
canvas.render(bitmap);
131135
} else {
132136
// If the browser doesn't support `createImageBitmap` (e.g. Safari 14)

lib/web_ui/lib/src/engine/dom.dart

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -210,16 +210,14 @@ external JSPromise<JSAny?> _createImageBitmap2(
210210
JSNumber width,
211211
JSNumber height,
212212
);
213-
Future<DomImageBitmap> createImageBitmap(JSAny source,
213+
JSPromise<JSAny?> createImageBitmap(JSAny source,
214214
[({int x, int y, int width, int height})? bounds]) {
215-
JSPromise<JSAny?> jsPromise;
216215
if (bounds != null) {
217-
jsPromise = _createImageBitmap2(source, bounds.x.toJS, bounds.y.toJS,
216+
return _createImageBitmap2(source, bounds.x.toJS, bounds.y.toJS,
218217
bounds.width.toJS, bounds.height.toJS);
219218
} else {
220-
jsPromise = _createImageBitmap1(source);
219+
return _createImageBitmap1(source);
221220
}
222-
return js_util.promiseToFuture<DomImageBitmap>(jsPromise);
223221
}
224222

225223
@JS()

lib/web_ui/lib/src/engine/html/renderer.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ class HtmlRenderer implements Renderer {
3131
// to make the unpacking happen while we are waiting for network requests.
3232
lineLookup;
3333
});
34-
registerHotRestartListener(clearFragmentProgramCache);
3534

3635
_instance = this;
3736
}
@@ -324,7 +323,7 @@ class HtmlRenderer implements Renderer {
324323
CanvasParagraphBuilder(style as EngineParagraphStyle);
325324

326325
@override
327-
Future<void> renderScene(ui.Scene scene, ui.FlutterView view) async {
326+
void renderScene(ui.Scene scene, ui.FlutterView view) {
328327
final EngineFlutterView implicitView = EnginePlatformDispatcher.instance.implicitView!;
329328
implicitView.dom.setScene((scene as SurfaceScene).webOnlyRootElement!);
330329
frameTimingsOnRasterFinish();

lib/web_ui/lib/src/engine/platform_dispatcher.dart

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -213,10 +213,6 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher {
213213
}
214214
}
215215

216-
/// A set of views which have rendered in the current `onBeginFrame` or
217-
/// `onDrawFrame` scope.
218-
Set<ui.FlutterView>? _viewsRenderedInCurrentFrame;
219-
220216
/// A callback invoked when any window begins a frame.
221217
///
222218
/// A callback that is invoked to notify the application that it is an
@@ -239,9 +235,7 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher {
239235
/// Engine code should use this method instead of the callback directly.
240236
/// Otherwise zones won't work properly.
241237
void invokeOnBeginFrame(Duration duration) {
242-
_viewsRenderedInCurrentFrame = <ui.FlutterView>{};
243238
invoke1<Duration>(_onBeginFrame, _onBeginFrameZone, duration);
244-
_viewsRenderedInCurrentFrame = null;
245239
}
246240

247241
/// A callback that is invoked for each frame after [onBeginFrame] has
@@ -262,9 +256,7 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher {
262256
/// Engine code should use this method instead of the callback directly.
263257
/// Otherwise zones won't work properly.
264258
void invokeOnDrawFrame() {
265-
_viewsRenderedInCurrentFrame = <ui.FlutterView>{};
266259
invoke(_onDrawFrame, _onDrawFrameZone);
267-
_viewsRenderedInCurrentFrame = null;
268260
}
269261

270262
/// A callback that is invoked when pointer data is available.
@@ -761,23 +753,14 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher {
761753
/// * [RendererBinding], the Flutter framework class which manages layout and
762754
/// painting.
763755
@override
764-
Future<void> render(ui.Scene scene, [ui.FlutterView? view]) async {
756+
void render(ui.Scene scene, [ui.FlutterView? view]) {
765757
assert(view != null || implicitView != null,
766758
'Calling render without a FlutterView');
767759
if (view == null && implicitView == null) {
768760
// If there is no view to render into, then this is a no-op.
769761
return;
770762
}
771-
final ui.FlutterView viewToRender = view ?? implicitView!;
772-
773-
// Only render in an `onDrawFrame` or `onBeginFrame` scope. This is checked
774-
// by checking if the `_viewsRenderedInCurrentFrame` is non-null and this
775-
// view hasn't been rendered already in this scope.
776-
final bool shouldRender =
777-
_viewsRenderedInCurrentFrame?.add(viewToRender) ?? false;
778-
if (shouldRender) {
779-
await renderer.renderScene(scene, viewToRender);
780-
}
763+
renderer.renderScene(scene, view ?? implicitView!);
781764
}
782765

783766
/// Additional accessibility features that may be enabled by the platform.
@@ -1292,8 +1275,7 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher {
12921275
String get defaultRouteName {
12931276
// TODO(mdebbar): What should we do in multi-view mode?
12941277
// https://github.com/flutter/flutter/issues/139174
1295-
return _defaultRouteName ??=
1296-
implicitView?.browserHistory.currentPath ?? '/';
1278+
return _defaultRouteName ??= implicitView?.browserHistory.currentPath ?? '/';
12971279
}
12981280

12991281
/// Lazily initialized when the `defaultRouteName` getter is invoked.

lib/web_ui/lib/src/engine/renderer.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,5 +222,5 @@ abstract class Renderer {
222222

223223
ui.ParagraphBuilder createParagraphBuilder(ui.ParagraphStyle style);
224224

225-
Future<void> renderScene(ui.Scene scene, ui.FlutterView view);
225+
FutureOr<void> renderScene(ui.Scene scene, ui.FlutterView view);
226226
}

lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,6 @@ class SkwasmRenderer implements Renderer {
349349
FutureOr<void> initialize() {
350350
surface = SkwasmSurface();
351351
sceneView = EngineSceneView(SkwasmPictureRenderer(surface));
352-
registerHotRestartListener(clearFragmentProgramCache);
353352
}
354353

355354
@override

0 commit comments

Comments
 (0)