blob: 4235547e831a9147a97ca763cf27ff03a00e99f2 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "flutter/shell/platform/embedder/embedder.h"
#include "flutter/shell/platform/embedder/tests/embedder_frozen.h"
#include "flutter/testing/testing.h"
namespace flutter {
namespace testing {
// Assert that both types have the same member with the same offset.
// This prevents reordering of "frozen" embedder API struct members.
#define ASSERT_EQ_OFFSET(type1, type2, member) \
ASSERT_EQ(offsetof(type1, member), offsetof(type2, member))
// New members must not be added to `FlutterTransformation`
// as it would break the ABI of `FlutterSemanticsNode`.
// See: https://github.com/flutter/flutter/issues/121176
TEST(EmbedderFrozen, FlutterTransformationIsFrozen) {
ASSERT_EQ_OFFSET(FlutterTransformation, FrozenFlutterTransformation, scaleX);
ASSERT_EQ_OFFSET(FlutterTransformation, FrozenFlutterTransformation, skewX);
ASSERT_EQ_OFFSET(FlutterTransformation, FrozenFlutterTransformation, transX);
ASSERT_EQ_OFFSET(FlutterTransformation, FrozenFlutterTransformation, skewY);
ASSERT_EQ_OFFSET(FlutterTransformation, FrozenFlutterTransformation, scaleY);
ASSERT_EQ_OFFSET(FlutterTransformation, FrozenFlutterTransformation, transY);
ASSERT_EQ_OFFSET(FlutterTransformation, FrozenFlutterTransformation, pers0);
ASSERT_EQ_OFFSET(FlutterTransformation, FrozenFlutterTransformation, pers1);
ASSERT_EQ_OFFSET(FlutterTransformation, FrozenFlutterTransformation, pers2);
}
// New members must not be added to `FlutterRect` as it would
// break the ABI of `FlutterSemanticsNode` and `FlutterDamage`.
// See: https://github.com/flutter/flutter/issues/121176
// See: https://github.com/flutter/flutter/issues/121347
TEST(EmbedderFrozen, FlutterRectIsFrozen) {
ASSERT_EQ_OFFSET(FlutterRect, FrozenFlutterRect, left);
ASSERT_EQ_OFFSET(FlutterRect, FrozenFlutterRect, top);
ASSERT_EQ_OFFSET(FlutterRect, FrozenFlutterRect, right);
ASSERT_EQ_OFFSET(FlutterRect, FrozenFlutterRect, bottom);
}
// New members must not be added to `FlutterPoint` as it would
// break the ABI of `FlutterLayer`.
TEST(EmbedderFrozen, FlutterPointIsFrozen) {
ASSERT_EQ_OFFSET(FlutterPoint, FrozenFlutterPoint, x);
ASSERT_EQ_OFFSET(FlutterPoint, FrozenFlutterPoint, y);
}
// New members must not be added to `FlutterDamage` as it would
// break the ABI of `FlutterPresentInfo`.
TEST(EmbedderFrozen, FlutterDamageIsFrozen) {
ASSERT_EQ_OFFSET(FlutterDamage, FrozenFlutterDamage, struct_size);
ASSERT_EQ_OFFSET(FlutterDamage, FrozenFlutterDamage, num_rects);
ASSERT_EQ_OFFSET(FlutterDamage, FrozenFlutterDamage, damage);
}
// New members must not be added to `FlutterSemanticsNode`
// as it would break the ABI of `FlutterSemanticsUpdate`.
// See: https://github.com/flutter/flutter/issues/121176
TEST(EmbedderFrozen, FlutterSemanticsNodeIsFrozen) {
ASSERT_EQ(sizeof(FlutterSemanticsNode), sizeof(FrozenFlutterSemanticsNode));
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode,
struct_size);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode, id);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode, flags);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode, actions);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode,
text_selection_base);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode,
text_selection_extent);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode,
scroll_child_count);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode,
scroll_index);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode,
scroll_position);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode,
scroll_extent_max);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode,
scroll_extent_min);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode, elevation);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode, thickness);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode, label);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode, hint);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode, value);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode,
increased_value);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode,
decreased_value);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode,
text_direction);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode, rect);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode, transform);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode,
child_count);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode,
children_in_traversal_order);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode,
children_in_hit_test_order);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode,
custom_accessibility_actions_count);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode,
custom_accessibility_actions);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode,
platform_view_id);
ASSERT_EQ_OFFSET(FlutterSemanticsNode, FrozenFlutterSemanticsNode, tooltip);
}
// New members must not be added to `FlutterSemanticsCustomAction`
// as it would break the ABI of `FlutterSemanticsUpdate`.
// See: https://github.com/flutter/flutter/issues/121176
TEST(EmbedderFrozen, FlutterSemanticsCustomActionIsFrozen) {
ASSERT_EQ(sizeof(FlutterSemanticsCustomAction),
sizeof(FrozenFlutterSemanticsCustomAction));
ASSERT_EQ_OFFSET(FlutterSemanticsCustomAction,
FrozenFlutterSemanticsCustomAction, struct_size);
ASSERT_EQ_OFFSET(FlutterSemanticsCustomAction,
FrozenFlutterSemanticsCustomAction, id);
ASSERT_EQ_OFFSET(FlutterSemanticsCustomAction,
FrozenFlutterSemanticsCustomAction, override_action);
ASSERT_EQ_OFFSET(FlutterSemanticsCustomAction,
FrozenFlutterSemanticsCustomAction, label);
ASSERT_EQ_OFFSET(FlutterSemanticsCustomAction,
FrozenFlutterSemanticsCustomAction, hint);
}
} // namespace testing
} // namespace flutter