Narrow retained UI overlay lifetime debt
This commit is contained in:
@@ -210,6 +210,46 @@ void dispatch_uses_stable_connection_snapshot(pp::tests::Harness& h)
|
||||
PP_EXPECT(h, second_count == 1);
|
||||
}
|
||||
|
||||
void destroy_subtree_clears_child_connections(pp::tests::Harness& h)
|
||||
{
|
||||
NodeLifetimeTree tree;
|
||||
const auto root = tree.create_root();
|
||||
PP_EXPECT(h, root);
|
||||
if (!root) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto child = tree.create_child(root.value());
|
||||
PP_EXPECT(h, child);
|
||||
if (!child) {
|
||||
return;
|
||||
}
|
||||
|
||||
int parent_count = 0;
|
||||
int child_count = 0;
|
||||
const auto root_connection = tree.connect(root.value(), [&parent_count](pp::ui::NodeHandle) {
|
||||
++parent_count;
|
||||
});
|
||||
const auto child_connection = tree.connect(child.value(), [&child_count](pp::ui::NodeHandle) {
|
||||
++child_count;
|
||||
});
|
||||
PP_EXPECT(h, root_connection);
|
||||
PP_EXPECT(h, child_connection);
|
||||
if (!root_connection || !child_connection) {
|
||||
return;
|
||||
}
|
||||
|
||||
PP_EXPECT(h, tree.dispatch(child.value()).ok());
|
||||
PP_EXPECT(h, parent_count == 0);
|
||||
PP_EXPECT(h, child_count == 1);
|
||||
|
||||
PP_EXPECT(h, tree.destroy_subtree(root.value()).ok());
|
||||
PP_EXPECT(h, !tree.disconnect(root_connection.value()).ok());
|
||||
PP_EXPECT(h, !tree.disconnect(child_connection.value()).ok());
|
||||
PP_EXPECT(h, !tree.contains(root.value()));
|
||||
PP_EXPECT(h, !tree.contains(child.value()));
|
||||
}
|
||||
|
||||
void captures_and_releases_pointer_and_keyboard_nodes(pp::tests::Harness& h)
|
||||
{
|
||||
NodeLifetimeTree tree;
|
||||
@@ -320,6 +360,7 @@ int main()
|
||||
harness.run("destroying_node_disconnects_callbacks", destroying_node_disconnects_callbacks);
|
||||
harness.run("dispatch_survives_destroy_during_callback", dispatch_survives_destroy_during_callback);
|
||||
harness.run("dispatch_uses_stable_connection_snapshot", dispatch_uses_stable_connection_snapshot);
|
||||
harness.run("destroy_subtree_clears_child_connections", destroy_subtree_clears_child_connections);
|
||||
harness.run("captures_and_releases_pointer_and_keyboard_nodes", captures_and_releases_pointer_and_keyboard_nodes);
|
||||
harness.run("destroying_captured_node_releases_capture", destroying_captured_node_releases_capture);
|
||||
harness.run("clear_models_layout_reload", clear_models_layout_reload);
|
||||
|
||||
@@ -210,6 +210,36 @@ void clear_for_layout_reload_invalidates_overlays(pp::tests::Harness& h)
|
||||
PP_EXPECT(h, !tree.captured_node(UiCaptureKind::keyboard).ok());
|
||||
}
|
||||
|
||||
void double_close_overlay_returns_invalid_argument(pp::tests::Harness& h)
|
||||
{
|
||||
NodeLifetimeTree tree;
|
||||
const auto root = tree.create_root();
|
||||
PP_EXPECT(h, root);
|
||||
if (!root) {
|
||||
return;
|
||||
}
|
||||
|
||||
UiOverlayLifetime overlays(tree, root.value());
|
||||
const auto popup = overlays.open_popup();
|
||||
PP_EXPECT(h, popup);
|
||||
if (!popup) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto child = overlays.open_child_popup(popup.value());
|
||||
PP_EXPECT(h, child);
|
||||
if (!child) {
|
||||
return;
|
||||
}
|
||||
|
||||
PP_EXPECT(h, overlays.close(child.value()).ok());
|
||||
PP_EXPECT(h, !overlays.close(child.value()).ok());
|
||||
PP_EXPECT(h, overlays.close(popup.value()).ok());
|
||||
PP_EXPECT(h, !overlays.close(popup.value()).ok());
|
||||
PP_EXPECT(h, overlays.overlay_count() == 0U);
|
||||
PP_EXPECT(h, !overlays.tracks(child.value()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int main()
|
||||
@@ -222,6 +252,7 @@ int main()
|
||||
harness.run("modal_dialog_captures_pointer_and_keyboard", modal_dialog_captures_pointer_and_keyboard);
|
||||
harness.run("modeless_dialog_does_not_steal_capture", modeless_dialog_does_not_steal_capture);
|
||||
harness.run("rejects_untracked_or_dead_overlay_closes", rejects_untracked_or_dead_overlay_closes);
|
||||
harness.run("double_close_overlay_returns_invalid_argument", double_close_overlay_returns_invalid_argument);
|
||||
harness.run("clear_for_layout_reload_invalidates_overlays", clear_for_layout_reload_invalidates_overlays);
|
||||
return harness.finish();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user