blob: de3ce9eb36dd6146b6361db12be2ecbc4fdffd4e [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.
// @dart = 2.6
import 'dart:typed_data';
import 'dart:ui';
import 'package:vector_math/vector_math_64.dart';
import 'channel_util.dart';
import 'scenario.dart';
/// A scenario that sends back messages when touches are received.
class SendTextFocusSemantics extends Scenario {
/// Constructor for `SendTextFocusScemantics`.
SendTextFocusSemantics(PlatformDispatcher dispatcher) : super(dispatcher);
@override
void onBeginFrame(Duration duration) {
// Doesn't matter what we draw. Just paint white.
final SceneBuilder builder = SceneBuilder();
final PictureRecorder recorder = PictureRecorder();
final Canvas canvas = Canvas(recorder);
canvas.drawRect(
Rect.fromLTWH(0, 0, window.physicalSize.width, window.physicalSize.height),
Paint()..color = const Color.fromARGB(255, 255, 255, 255),
);
final Picture picture = recorder.endRecording();
builder.addPicture(
Offset.zero,
picture,
);
final Scene scene = builder.build();
window.render(scene);
scene.dispose();
// On the first frame, also pretend that it drew a text field. Send the
// corresponding semantics tree comprised of 1 node for the text field.
window.updateSemantics((SemanticsUpdateBuilder()
..updateNode(
id: 0,
// SemanticsFlag.isTextField.
flags: 16,
// SemanticsAction.tap.
actions: 1,
rect: const Rect.fromLTRB(0.0, 0.0, 414.0, 48.0),
label: 'flutter textfield',
textDirection: TextDirection.ltr,
textSelectionBase: -1,
textSelectionExtent: -1,
platformViewId: -1,
maxValueLength: -1,
currentValueLength: 0,
scrollChildren: 0,
scrollIndex: 0,
scrollPosition: 0.0,
scrollExtentMax: 0.0,
scrollExtentMin: 0.0,
transform: Matrix4.identity().storage,
elevation: 0.0,
thickness: 0.0,
hint: '',
value: '',
increasedValue: '',
decreasedValue: '',
childrenInTraversalOrder: Int32List(0),
childrenInHitTestOrder: Int32List(0),
additionalActions: Int32List(0),
)).build()
);
}
// We don't really care about the touch itself. It's just a way for the
// XCUITest to communicate timing to the mock framework.
@override
void onPointerDataPacket(PointerDataPacket packet) {
// This mimics the framework which shows the FlutterTextInputView before
// updating the TextInputSemanticsObject.
sendJsonMethodCall(
dispatcher: dispatcher,
channel: 'flutter/textinput',
method: 'TextInput.setClient',
arguments: <dynamic>[
1,
// The arguments are text field configurations. It doesn't really matter
// since we're just testing text field accessibility here.
<String, dynamic>{ 'obscureText': false },
]
);
sendJsonMethodCall(
dispatcher: dispatcher,
channel: 'flutter/textinput',
method: 'TextInput.show',
);
window.updateSemantics((SemanticsUpdateBuilder()
..updateNode(
id: 0,
// SemanticsFlag.isTextField and SemanticsFlag.isFocused.
flags: 48,
actions: 18433,
rect: const Rect.fromLTRB(0.0, 0.0, 414.0, 48.0),
label: 'focused flutter textfield',
textDirection: TextDirection.ltr,
textSelectionBase: 0,
textSelectionExtent: 0,
platformViewId: -1,
maxValueLength: -1,
currentValueLength: 0,
scrollChildren: 0,
scrollIndex: 0,
scrollPosition: 0.0,
scrollExtentMax: 0.0,
scrollExtentMin: 0.0,
transform: Matrix4.identity().storage,
elevation: 0.0,
thickness: 0.0,
hint: '',
value: '',
increasedValue: '',
decreasedValue: '',
childrenInTraversalOrder: Int32List(0),
childrenInHitTestOrder: Int32List(0),
additionalActions: Int32List(0),
)).build()
);
}
}