Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
f2c3cd7
Changes from Michael
dkwingsmt Aug 25, 2023
ca0fc96
Merge remote-tracking branch 'origin/main' into enforce-rendering-rule
dkwingsmt Aug 28, 2023
f783ef3
Remove RunOnPlatformTaskRunner
dkwingsmt Aug 28, 2023
3c3ddbe
Impl
dkwingsmt Aug 28, 2023
4326d57
Merge branch 'remove-RunOnPlatformTaskRunner' into enforce-rendering-…
dkwingsmt Aug 28, 2023
9ac34e2
First running runtime controller
dkwingsmt Aug 30, 2023
5e15f5d
CallingRenderOutOfScopeIsIgnored
dkwingsmt Aug 30, 2023
8c7b5d6
Extract methods
dkwingsmt Aug 30, 2023
0d563e8
DuplicateRenderCallsAreIgnored
dkwingsmt Aug 30, 2023
49a3560
Docs and callback
dkwingsmt Aug 30, 2023
713648e
Move destruction to destructor
dkwingsmt Aug 30, 2023
48135a7
Format
dkwingsmt Aug 30, 2023
d0b1cf7
Extract Shell InferVmInitDataFromSettings
dkwingsmt Aug 30, 2023
21b2787
lint
dkwingsmt Aug 30, 2023
c38c202
Revert contents of #45190
dkwingsmt Aug 30, 2023
c4d273c
Use new mocks
dkwingsmt Aug 30, 2023
1f96e53
Merge remote-tracking branch 'origin/main' into enforce-rendering-rule
dkwingsmt Aug 30, 2023
45f0149
Lint
dkwingsmt Aug 30, 2023
cb9b8e4
Merge remote-tracking branch 'origin/main' into enforce-rendering-rule
dkwingsmt Aug 31, 2023
bc11215
correctly post sync for begin frame
dkwingsmt Aug 31, 2023
151ed77
Extract into methods
dkwingsmt Aug 31, 2023
3370e8c
Address comments
dkwingsmt Sep 1, 2023
d768cc4
Remove exact
dkwingsmt Sep 2, 2023
828b791
Merge remote-tracking branch 'dkwingsmt/enforce-rendering-rule' into …
dkwingsmt Sep 2, 2023
e266da1
Merge branch 'main' into enforce-rendering-rule
dkwingsmt Sep 5, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
DuplicateRenderCallsAreIgnored
  • Loading branch information
dkwingsmt committed Aug 30, 2023
commit 0d563e8c96a5e8e57bda0440a511bbc2627f7935
35 changes: 23 additions & 12 deletions lib/ui/fixtures/ui_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1077,14 +1077,19 @@ external void _callHook(
Object? arg21,
]);

Picture CreateRedBox(Size size) {
Paint paint = Paint()
Scene CreateRedBoxScene(Size size) {
final SceneBuilder builder = SceneBuilder();
builder.pushOffset(0.0, 0.0);
final Paint paint = Paint()
..color = Color.fromARGB(255, 255, 0, 0)
..style = PaintingStyle.fill;
PictureRecorder baseRecorder = PictureRecorder();
Canvas canvas = Canvas(baseRecorder);
final PictureRecorder baseRecorder = PictureRecorder();
final Canvas canvas = Canvas(baseRecorder);
canvas.drawRect(Rect.fromLTRB(0.0, 0.0, size.width, size.height), paint);
return baseRecorder.endRecording();
final Picture picture = baseRecorder.endRecording();
builder.addPicture(Offset(0.0, 0.0), picture);
builder.pop();
return builder.build();
}

@pragma('vm:entry-point')
Expand All @@ -1093,11 +1098,17 @@ external void notifyNative();

@pragma('vm:entry-point')
void incorrectImmediateRender() {
SceneBuilder builder = SceneBuilder();
builder.pushOffset(0.0, 0.0);
builder.addPicture(Offset(0.0, 0.0), CreateRedBox(Size(2.0, 2.0)));
builder.pop();
PlatformDispatcher.instance.views.first.render(builder.build());
PlatformDispatcher.instance.scheduleFrame();
notifyNative();
PlatformDispatcher.instance.views.first.render(CreateRedBoxScene(Size(2, 2)));
}

@pragma('vm:entry-point')
void incorrectDoubleRender() {
PlatformDispatcher.instance.onBeginFrame = (Duration value) {
PlatformDispatcher.instance.views.first.render(CreateRedBoxScene(Size(2, 2)));
PlatformDispatcher.instance.views.first.render(CreateRedBoxScene(Size(3, 3)));
};
PlatformDispatcher.instance.onDrawFrame = () {
PlatformDispatcher.instance.views.first.render(CreateRedBoxScene(Size(4, 4)));
PlatformDispatcher.instance.views.first.render(CreateRedBoxScene(Size(5, 5)));
};
}
42 changes: 37 additions & 5 deletions lib/ui/window/platform_configuration_unittests.cc
Original file line number Diff line number Diff line change
Expand Up @@ -444,7 +444,7 @@ TEST_F(PlatformConfigurationTest, SetDartPerformanceMode) {
DestroyShell(std::move(shell), task_runners);
}

TEST_F(PlatformConfigurationTest, CallingRenderOutOfScopeIsIgnored) {
TEST_F(PlatformConfigurationTest, OutOfScopeRenderCallsAreIgnored) {
Settings settings = CreateSettingsForFixture();
TaskRunners task_runners = GetTaskRunnersForFixture();

Expand All @@ -453,25 +453,57 @@ TEST_F(PlatformConfigurationTest, CallingRenderOutOfScopeIsIgnored) {
std::make_shared<MockPlatformMessageHandler>();
EXPECT_CALL(client, GetPlatformMessageHandler())
.WillOnce(Return(platform_message_handler));
// Render should not be called.
EXPECT_CALL(client, Render(_, _)).Times(Exactly(0));

auto context = std::make_unique<MockRuntimeControllerContext>(
settings, task_runners, client);

auto configuration = RunConfiguration::InferFromSettings(settings);
configuration.SetEntrypoint("incorrectImmediateRender");
ViewportMetrics implicit_view_metrics(
/*device_pixel_ratio=*/1.0, /*width=*/20, /*height=*/20,
/*physical_touch_slop=*/2, /*display_id=*/0);
context->LaunchRootIsolate(configuration, implicit_view_metrics);

// Wait for the Dart main function to end.
fml::AutoResetWaitableEvent latch;
AddNativeCallback("NotifyNative", CREATE_NATIVE_ENTRY([&latch](auto args) {
latch.Signal();
}));
PostSync(task_runners.GetUITaskRunner(), [&]() { latch.Signal(); });
latch.Wait();

PostSync(task_runners.GetUITaskRunner(), [&]() { context.reset(); });
}

TEST_F(PlatformConfigurationTest, DuplicateRenderCallsAreIgnored) {
Settings settings = CreateSettingsForFixture();
TaskRunners task_runners = GetTaskRunnersForFixture();

MockRuntimeDelegate client;
auto platform_message_handler =
std::make_shared<MockPlatformMessageHandler>();
EXPECT_CALL(client, GetPlatformMessageHandler())
.WillOnce(Return(platform_message_handler));
// Render should only be called once, because the second call is ignored.
EXPECT_CALL(client, Render(_, _)).Times(Exactly(1));

auto context = std::make_unique<MockRuntimeControllerContext>(
settings, task_runners, client);

auto configuration = RunConfiguration::InferFromSettings(settings);
configuration.SetEntrypoint("incorrectImmediateRender");
configuration.SetEntrypoint("incorrectDoubleRender");
ViewportMetrics implicit_view_metrics(
/*device_pixel_ratio=*/1.0, /*width=*/20, /*height=*/20,
/*physical_touch_slop=*/2, /*display_id=*/0);
context->LaunchRootIsolate(configuration, implicit_view_metrics);

// Wait for the Dart main function to end, which means the callbacks have been
// registered.
fml::AutoResetWaitableEvent latch;
PostSync(task_runners.GetUITaskRunner(), [&]() { latch.Signal(); });
latch.Wait();

context->GetController().BeginFrame(fml::TimePoint::Now(), 0);

PostSync(task_runners.GetUITaskRunner(), [&]() { context.reset(); });
}

Expand Down