mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Adds support for system text scale factor, including hooks for Android system settings changes. iOS hooks will be added in another PR.
236 lines
6.8 KiB
Dart
236 lines
6.8 KiB
Dart
// Copyright 2017 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import 'dart:async';
|
|
import 'dart:typed_data';
|
|
import 'dart:convert';
|
|
import 'dart:developer' as developer;
|
|
import 'dart:math' as math;
|
|
import 'dart:nativewrappers';
|
|
|
|
import 'package:test/test.dart';
|
|
|
|
// HACK: these parts are to get access to private functions tested here.
|
|
part '../../lib/ui/compositing.dart';
|
|
part '../../lib/ui/geometry.dart';
|
|
part '../../lib/ui/hash_codes.dart';
|
|
part '../../lib/ui/hooks.dart';
|
|
part '../../lib/ui/lerp.dart';
|
|
part '../../lib/ui/natives.dart';
|
|
part '../../lib/ui/painting.dart';
|
|
part '../../lib/ui/pointer.dart';
|
|
part '../../lib/ui/semantics.dart';
|
|
part '../../lib/ui/text.dart';
|
|
part '../../lib/ui/window.dart';
|
|
|
|
void main() {
|
|
group('window callback zones', () {
|
|
VoidCallback originalOnMetricsChanged;
|
|
VoidCallback originalOnLocaleChanged;
|
|
FrameCallback originalOnBeginFrame;
|
|
VoidCallback originalOnDrawFrame;
|
|
PointerDataPacketCallback originalOnPointerDataPacket;
|
|
VoidCallback originalOnSemanticsEnabledChanged;
|
|
SemanticsActionCallback originalOnSemanticsAction;
|
|
PlatformMessageCallback originalOnPlatformMessage;
|
|
VoidCallback originalOnTextScaleFactorChanged;
|
|
|
|
setUp(() {
|
|
originalOnMetricsChanged = window.onMetricsChanged;
|
|
originalOnLocaleChanged = window.onLocaleChanged;
|
|
originalOnBeginFrame = window.onBeginFrame;
|
|
originalOnDrawFrame = window.onDrawFrame;
|
|
originalOnPointerDataPacket = window.onPointerDataPacket;
|
|
originalOnSemanticsEnabledChanged = window.onSemanticsEnabledChanged;
|
|
originalOnSemanticsAction = window.onSemanticsAction;
|
|
originalOnPlatformMessage = window.onPlatformMessage;
|
|
originalOnTextScaleFactorChanged = window.onTextScaleFactorChanged;
|
|
});
|
|
|
|
tearDown(() {
|
|
window.onMetricsChanged = originalOnMetricsChanged;
|
|
window.onLocaleChanged = originalOnLocaleChanged;
|
|
window.onBeginFrame = originalOnBeginFrame;
|
|
window.onDrawFrame = originalOnDrawFrame;
|
|
window.onPointerDataPacket = originalOnPointerDataPacket;
|
|
window.onSemanticsEnabledChanged = originalOnSemanticsEnabledChanged;
|
|
window.onSemanticsAction = originalOnSemanticsAction;
|
|
window.onPlatformMessage = originalOnPlatformMessage;
|
|
window.onTextScaleFactorChanged = originalOnTextScaleFactorChanged;
|
|
});
|
|
|
|
test('onMetricsChanged preserves callback zone', () {
|
|
Zone innerZone;
|
|
Zone runZone;
|
|
double devicePixelRatio;
|
|
|
|
runZoned(() {
|
|
innerZone = Zone.current;
|
|
window.onMetricsChanged = () {
|
|
runZone = Zone.current;
|
|
devicePixelRatio = window.devicePixelRatio;
|
|
};
|
|
});
|
|
|
|
window.onMetricsChanged();
|
|
_updateWindowMetrics(0.1234, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
|
|
expect(runZone, isNotNull);
|
|
expect(runZone, same(innerZone));
|
|
expect(devicePixelRatio, equals(0.1234));
|
|
});
|
|
|
|
test('onLocaleChanged preserves callback zone', () {
|
|
Zone innerZone;
|
|
Zone runZone;
|
|
Locale locale;
|
|
|
|
runZoned(() {
|
|
innerZone = Zone.current;
|
|
window.onLocaleChanged = () {
|
|
runZone = Zone.current;
|
|
locale = window.locale;
|
|
};
|
|
});
|
|
|
|
_updateLocale('en', 'US');
|
|
expect(runZone, isNotNull);
|
|
expect(runZone, same(innerZone));
|
|
expect(locale, equals(const Locale('en', 'US')));
|
|
});
|
|
|
|
test('onBeginFrame preserves callback zone', () {
|
|
Zone innerZone;
|
|
Zone runZone;
|
|
Duration start;
|
|
|
|
runZoned(() {
|
|
innerZone = Zone.current;
|
|
window.onBeginFrame = (Duration value) {
|
|
runZone = Zone.current;
|
|
start = value;
|
|
};
|
|
});
|
|
|
|
_beginFrame(1234);
|
|
expect(runZone, isNotNull);
|
|
expect(runZone, same(innerZone));
|
|
expect(start, equals(const Duration(microseconds: 1234)));
|
|
});
|
|
|
|
test('onDrawFrame preserves callback zone', () {
|
|
Zone innerZone;
|
|
Zone runZone;
|
|
|
|
runZoned(() {
|
|
innerZone = Zone.current;
|
|
window.onDrawFrame = () {
|
|
runZone = Zone.current;
|
|
};
|
|
});
|
|
|
|
_drawFrame();
|
|
expect(runZone, isNotNull);
|
|
expect(runZone, same(innerZone));
|
|
});
|
|
|
|
test('onPointerDataPacket preserves callback zone', () {
|
|
Zone innerZone;
|
|
Zone runZone;
|
|
PointerDataPacket data;
|
|
|
|
runZoned(() {
|
|
innerZone = Zone.current;
|
|
window.onPointerDataPacket = (PointerDataPacket value) {
|
|
runZone = Zone.current;
|
|
data = value;
|
|
};
|
|
});
|
|
|
|
final ByteData testData = new ByteData.view(new Uint8List(0).buffer);
|
|
_dispatchPointerDataPacket(testData);
|
|
expect(runZone, isNotNull);
|
|
expect(runZone, same(innerZone));
|
|
expect(data.data, equals(_unpackPointerDataPacket(testData).data));
|
|
});
|
|
|
|
test('onSemanticsEnabledChanged preserves callback zone', () {
|
|
Zone innerZone;
|
|
Zone runZone;
|
|
bool enabled;
|
|
|
|
runZoned(() {
|
|
innerZone = Zone.current;
|
|
window.onSemanticsEnabledChanged = () {
|
|
runZone = Zone.current;
|
|
enabled = window.semanticsEnabled;
|
|
};
|
|
});
|
|
|
|
_updateSemanticsEnabled(window._semanticsEnabled);
|
|
expect(runZone, isNotNull);
|
|
expect(runZone, same(innerZone));
|
|
expect(enabled, isNotNull);
|
|
expect(enabled, equals(window._semanticsEnabled));
|
|
});
|
|
|
|
test('onSemanticsAction preserves callback zone', () {
|
|
Zone innerZone;
|
|
Zone runZone;
|
|
int action;
|
|
|
|
runZoned(() {
|
|
innerZone = Zone.current;
|
|
window.onSemanticsAction = (int value, _) {
|
|
runZone = Zone.current;
|
|
action = value;
|
|
};
|
|
});
|
|
|
|
_dispatchSemanticsAction(1234, 0);
|
|
expect(runZone, isNotNull);
|
|
expect(runZone, same(innerZone));
|
|
expect(action, equals(1234));
|
|
});
|
|
|
|
test('onPlatformMessage preserves callback zone', () {
|
|
Zone innerZone;
|
|
Zone runZone;
|
|
String name;
|
|
|
|
runZoned(() {
|
|
innerZone = Zone.current;
|
|
window.onPlatformMessage = (String value, _, __) {
|
|
runZone = Zone.current;
|
|
name = value;
|
|
};
|
|
});
|
|
|
|
_dispatchPlatformMessage('testName', null, null);
|
|
expect(runZone, isNotNull);
|
|
expect(runZone, same(innerZone));
|
|
expect(name, equals('testName'));
|
|
});
|
|
|
|
test('onTextScaleFactorChanged preserves callback zone', () {
|
|
Zone innerZone;
|
|
Zone runZone;
|
|
double textScaleFactor;
|
|
|
|
runZoned(() {
|
|
innerZone = Zone.current;
|
|
window.onTextScaleFactorChanged = () {
|
|
runZone = Zone.current;
|
|
textScaleFactor = window.textScaleFactor;
|
|
};
|
|
});
|
|
|
|
window.onTextScaleFactorChanged();
|
|
_updateTextScaleFactor(0.5);
|
|
expect(runZone, isNotNull);
|
|
expect(runZone, same(innerZone));
|
|
expect(textScaleFactor, equals(0.5));
|
|
});
|
|
});
|
|
}
|