Revert "Add deprecations to PlatformMessage stuff" (flutter/engine#42921)
Reverts flutter/engine#42580
This commit is contained in:
@@ -6,18 +6,13 @@
|
||||
// KEEP THIS SYNCHRONIZED WITH ../web_ui/lib/channel_buffers.dart
|
||||
part of dart.ui;
|
||||
|
||||
/// Deprecated. Migrate to [ChannelCallback] instead.
|
||||
///
|
||||
/// Signature for [ChannelBuffers.drain]'s `callback` argument.
|
||||
///
|
||||
/// The first argument is the data sent by the plugin.
|
||||
///
|
||||
/// The second argument is a closure that, when called, will send messages
|
||||
/// back to the plugin.
|
||||
@Deprecated(
|
||||
'Migrate to ChannelCallback instead. '
|
||||
'This feature was deprecated after v3.11.0-20.0.pre.',
|
||||
)
|
||||
// TODO(ianh): deprecate this once the framework is migrated to [ChannelCallback].
|
||||
typedef DrainChannelCallback = Future<void> Function(ByteData? data, PlatformMessageResponseCallback callback);
|
||||
|
||||
/// Signature for [ChannelBuffers.setListener]'s `callback` argument.
|
||||
@@ -382,8 +377,6 @@ class ChannelBuffers {
|
||||
}
|
||||
}
|
||||
|
||||
/// Deprecated. Migrate to [setListener] instead.
|
||||
///
|
||||
/// Remove and process all stored messages for a given channel.
|
||||
///
|
||||
/// This should be called once a channel is prepared to handle messages
|
||||
@@ -391,10 +384,7 @@ class ChannelBuffers {
|
||||
///
|
||||
/// The messages are processed by calling the given `callback`. Each message
|
||||
/// is processed in its own microtask.
|
||||
@Deprecated(
|
||||
'Migrate to setListener instead. '
|
||||
'This feature was deprecated after v3.11.0-20.0.pre.',
|
||||
)
|
||||
// TODO(ianh): deprecate once framework uses [setListener].
|
||||
Future<void> drain(String name, DrainChannelCallback callback) async {
|
||||
final _Channel? channel = _channels[name];
|
||||
while (channel != null && !channel._queue.isEmpty) {
|
||||
|
||||
@@ -41,13 +41,8 @@ typedef SemanticsActionEventCallback = void Function(SemanticsActionEvent action
|
||||
/// [PlatformDispatcher.onPlatformMessage].
|
||||
typedef PlatformMessageResponseCallback = void Function(ByteData? data);
|
||||
|
||||
/// Deprecated. Migrate to [ChannelBuffers.setListener] instead.
|
||||
///
|
||||
/// Signature for [PlatformDispatcher.onPlatformMessage].
|
||||
@Deprecated(
|
||||
'Migrate to ChannelBuffers.setListener instead. '
|
||||
'This feature was deprecated after v3.11.0-20.0.pre.',
|
||||
)
|
||||
// TODO(ianh): deprecate once framework uses [ChannelBuffers.setListener].
|
||||
typedef PlatformMessageCallback = void Function(String name, ByteData? data, PlatformMessageResponseCallback? callback);
|
||||
|
||||
// Signature for _setNeedsReportTimings.
|
||||
@@ -656,8 +651,6 @@ class PlatformDispatcher {
|
||||
@Native<Void Function(Int64)>(symbol: 'PlatformConfigurationNativeApi::RegisterBackgroundIsolate')
|
||||
external static void __registerBackgroundIsolate(int rootIsolateId);
|
||||
|
||||
/// Deprecated. Migrate to [ChannelBuffers.setListener] instead.
|
||||
///
|
||||
/// Called whenever this platform dispatcher receives a message from a
|
||||
/// platform-specific plugin.
|
||||
///
|
||||
@@ -671,17 +664,11 @@ class PlatformDispatcher {
|
||||
///
|
||||
/// The framework invokes this callback in the same zone in which the callback
|
||||
/// was set.
|
||||
@Deprecated(
|
||||
'Migrate to ChannelBuffers.setListener instead. '
|
||||
'This feature was deprecated after v3.11.0-20.0.pre.',
|
||||
)
|
||||
// TODO(ianh): Deprecate onPlatformMessage once the framework is moved over
|
||||
// to using channel buffers exclusively.
|
||||
PlatformMessageCallback? get onPlatformMessage => _onPlatformMessage;
|
||||
PlatformMessageCallback? _onPlatformMessage;
|
||||
Zone _onPlatformMessageZone = Zone.root;
|
||||
@Deprecated(
|
||||
'Migrate to ChannelBuffers.setListener instead. '
|
||||
'This feature was deprecated after v3.11.0-20.0.pre.',
|
||||
)
|
||||
set onPlatformMessage(PlatformMessageCallback? callback) {
|
||||
_onPlatformMessage = callback;
|
||||
_onPlatformMessageZone = Zone.current;
|
||||
|
||||
@@ -787,8 +787,6 @@ class SingletonFlutterWindow extends FlutterView {
|
||||
platformDispatcher.sendPlatformMessage(name, data, callback);
|
||||
}
|
||||
|
||||
/// Deprecated. Migrate to [ChannelBuffers.setListener] instead.
|
||||
///
|
||||
/// Called whenever this window receives a message from a platform-specific
|
||||
/// plugin.
|
||||
///
|
||||
@@ -804,15 +802,8 @@ class SingletonFlutterWindow extends FlutterView {
|
||||
///
|
||||
/// The framework invokes this callback in the same zone in which the
|
||||
/// callback was set.
|
||||
@Deprecated(
|
||||
'Migrate to ChannelBuffers.setListener instead. '
|
||||
'This feature was deprecated after v3.11.0-20.0.pre.',
|
||||
)
|
||||
// TODO(ianh): deprecate once framework uses [ChannelBuffers.setListener].
|
||||
PlatformMessageCallback? get onPlatformMessage => platformDispatcher.onPlatformMessage;
|
||||
@Deprecated(
|
||||
'Migrate to ChannelBuffers.setListener instead. '
|
||||
'This feature was deprecated after v3.11.0-20.0.pre.',
|
||||
)
|
||||
set onPlatformMessage(PlatformMessageCallback? callback) {
|
||||
platformDispatcher.onPlatformMessage = callback;
|
||||
}
|
||||
|
||||
@@ -31,9 +31,6 @@ void main() {
|
||||
called = true;
|
||||
}
|
||||
buffers.push(channel, data, callback);
|
||||
// Ignoring the deprecated member use because we're specifically testing
|
||||
// deprecated API.
|
||||
// ignore: deprecated_member_use
|
||||
await buffers.drain(channel, (ByteData? drainedData, ui.PlatformMessageResponseCallback drainedCallback) async {
|
||||
expect(drainedData, equals(data));
|
||||
assert(!called);
|
||||
@@ -55,9 +52,6 @@ void main() {
|
||||
|
||||
// Ignoring the returned future because the completion of the drain is
|
||||
// communicated using the `completer`.
|
||||
// Ignoring the deprecated member use because we're specifically testing
|
||||
// deprecated API.
|
||||
// ignore: deprecated_member_use
|
||||
buffers.drain(channel, (ByteData? drainedData, ui.PlatformMessageResponseCallback drainedCallback) async {
|
||||
log.add('callback');
|
||||
completer.complete();
|
||||
@@ -83,9 +77,6 @@ void main() {
|
||||
_resize(buffers, channel, 0);
|
||||
buffers.push(channel, data, callback);
|
||||
bool didCall = false;
|
||||
// Ignoring the deprecated member use because we're specifically testing
|
||||
// deprecated API.
|
||||
// ignore: deprecated_member_use
|
||||
await buffers.drain(channel, (ByteData? drainedData, ui.PlatformMessageResponseCallback drainedCallback) async {
|
||||
didCall = true;
|
||||
});
|
||||
@@ -96,9 +87,6 @@ void main() {
|
||||
const String channel = 'foo';
|
||||
final ui.ChannelBuffers buffers = ui.ChannelBuffers();
|
||||
bool didCall = false;
|
||||
// Ignoring the deprecated member use because we're specifically testing
|
||||
// deprecated API.
|
||||
// ignore: deprecated_member_use
|
||||
await buffers.drain(channel, (ByteData? drainedData, ui.PlatformMessageResponseCallback drainedCallback) async {
|
||||
didCall = true;
|
||||
});
|
||||
@@ -119,9 +107,6 @@ void main() {
|
||||
buffers.push(channel, three, callback);
|
||||
buffers.push(channel, four, callback);
|
||||
int counter = 0;
|
||||
// Ignoring the deprecated member use because we're specifically testing
|
||||
// deprecated API.
|
||||
// ignore: deprecated_member_use
|
||||
await buffers.drain(channel, (ByteData? drainedData, ui.PlatformMessageResponseCallback drainedCallback) async {
|
||||
switch (counter) {
|
||||
case 0:
|
||||
@@ -147,9 +132,6 @@ void main() {
|
||||
buffers.push(channel, two, callback);
|
||||
_resize(buffers, channel, 1);
|
||||
int counter = 0;
|
||||
// Ignoring the deprecated member use because we're specifically testing
|
||||
// deprecated API.
|
||||
// ignore: deprecated_member_use
|
||||
await buffers.drain(channel, (ByteData? drainedData, ui.PlatformMessageResponseCallback drainedCallback) async {
|
||||
switch (counter) {
|
||||
case 0:
|
||||
|
||||
@@ -74,15 +74,12 @@ void main() {
|
||||
fail('This test must not be run with --disable-vm-service.');
|
||||
}
|
||||
|
||||
final Completer<String> completer = Completer<String>();
|
||||
ui.channelBuffers.setListener(
|
||||
'flutter/system',
|
||||
(ByteData? data, ui.PlatformMessageResponseCallback callback) {
|
||||
final ByteBuffer buffer = data!.buffer;
|
||||
final Uint8List list = buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
|
||||
completer.complete(utf8.decode(list));
|
||||
},
|
||||
);
|
||||
final Completer<PlatformResponse> completer = Completer<PlatformResponse>();
|
||||
ui.PlatformDispatcher.instance.onPlatformMessage = (String name, ByteData? data, ui.PlatformMessageResponseCallback? callback) {
|
||||
final ByteBuffer buffer = data!.buffer;
|
||||
final Uint8List list = buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
|
||||
completer.complete(PlatformResponse(name: name, contents: utf8.decode(list)));
|
||||
};
|
||||
|
||||
vmService = await vmServiceConnectUri(
|
||||
'ws://localhost:${info.serverUri!.port}${info.serverUri!.path}ws',
|
||||
@@ -97,11 +94,13 @@ void main() {
|
||||
expect(fontChangeResponse.type, 'Success');
|
||||
expect(
|
||||
await completer.future,
|
||||
'{"type":"fontsChange"}',
|
||||
const PlatformResponse(
|
||||
name: 'flutter/system',
|
||||
contents: '{"type":"fontsChange"}',
|
||||
),
|
||||
);
|
||||
} finally {
|
||||
await vmService?.dispose();
|
||||
ui.channelBuffers.clearListener('flutter/system');
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -122,3 +121,22 @@ Future<String?> getIsolateId(vms.VmService vmService) async {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
class PlatformResponse {
|
||||
const PlatformResponse({
|
||||
required this.name,
|
||||
required this.contents,
|
||||
});
|
||||
|
||||
final String name;
|
||||
final String contents;
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) =>
|
||||
other is PlatformResponse &&
|
||||
other.name == name &&
|
||||
other.contents == contents;
|
||||
|
||||
@override
|
||||
int get hashCode => Object.hash(name, contents);
|
||||
}
|
||||
|
||||
@@ -195,19 +195,20 @@ void testTextRange() {
|
||||
|
||||
void testLoadFontFromList() {
|
||||
test('loadFontFromList will send platform message after font is loaded', () async {
|
||||
final PlatformMessageCallback? oldHandler = PlatformDispatcher.instance.onPlatformMessage;
|
||||
late String actualName;
|
||||
late String message;
|
||||
channelBuffers.setListener(
|
||||
'flutter/system',
|
||||
(ByteData? data, PlatformMessageResponseCallback? callback) {
|
||||
assert(data != null);
|
||||
final Uint8List list = data!.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
|
||||
message = utf8.decode(list);
|
||||
},
|
||||
);
|
||||
PlatformDispatcher.instance.onPlatformMessage = (String name, ByteData? data, PlatformMessageResponseCallback? callback) {
|
||||
assert(data != null);
|
||||
actualName = name;
|
||||
final Uint8List list = data!.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
|
||||
message = utf8.decode(list);
|
||||
};
|
||||
final Uint8List fontData = Uint8List(0);
|
||||
await loadFontFromList(fontData, fontFamily: 'fake');
|
||||
PlatformDispatcher.instance.onPlatformMessage = oldHandler;
|
||||
expect(actualName, 'flutter/system');
|
||||
expect(message, '{"type":"fontsChange"}');
|
||||
channelBuffers.clearListener('flutter/system');
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -17,13 +17,12 @@ void main() {
|
||||
// FlutterView to the _view property.
|
||||
assert(PlatformDispatcher.instance.implicitView != null);
|
||||
PlatformDispatcher.instance
|
||||
..onPlatformMessage = _handlePlatformMessage
|
||||
..onBeginFrame = _onBeginFrame
|
||||
..onDrawFrame = _onDrawFrame
|
||||
..onMetricsChanged = _onMetricsChanged
|
||||
..onPointerDataPacket = _onPointerDataPacket
|
||||
..scheduleFrame();
|
||||
channelBuffers.setListener('driver', _handleDriverMessage);
|
||||
channelBuffers.setListener('write_timeline', _handleWriteTimelineMessage);
|
||||
|
||||
final FlutterView view = PlatformDispatcher.instance.implicitView!;
|
||||
// Asserting that this is greater than zero since this app runs on different
|
||||
@@ -42,8 +41,7 @@ void main() {
|
||||
/// The FlutterView into which the [Scenario]s will be rendered.
|
||||
FlutterView get _view => PlatformDispatcher.instance.implicitView!;
|
||||
|
||||
void _handleDriverMessage(ByteData? data, PlatformMessageResponseCallback? callback) {
|
||||
final Map<String, dynamic> call = json.decode(utf8.decode(data!.buffer.asUint8List())) as Map<String, dynamic>;
|
||||
void _handleDriverMessage(Map<String, dynamic> call) {
|
||||
final String? methodName = call['method'] as String?;
|
||||
switch (methodName) {
|
||||
case 'set_scenario':
|
||||
@@ -54,9 +52,23 @@ void _handleDriverMessage(ByteData? data, PlatformMessageResponseCallback? callb
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _handleWriteTimelineMessage(ByteData? data, PlatformMessageResponseCallback? callback) async {
|
||||
final String timelineData = await _getTimelineData();
|
||||
callback!(Uint8List.fromList(utf8.encode(timelineData)).buffer.asByteData());
|
||||
Future<void> _handlePlatformMessage(
|
||||
String name, ByteData? data, PlatformMessageResponseCallback? callback) async {
|
||||
if (data != null) {
|
||||
print('$name = ${utf8.decode(data.buffer.asUint8List())}');
|
||||
} else {
|
||||
print(name);
|
||||
}
|
||||
|
||||
switch (name) {
|
||||
case 'driver':
|
||||
_handleDriverMessage(json.decode(utf8.decode(data!.buffer.asUint8List())) as Map<String, dynamic>);
|
||||
case 'write_timeline':
|
||||
final String timelineData = await _getTimelineData();
|
||||
callback!(Uint8List.fromList(utf8.encode(timelineData)).buffer.asByteData());
|
||||
default:
|
||||
currentScenario?.onPlatformMessage(name, data, callback);
|
||||
}
|
||||
}
|
||||
|
||||
Future<String> _getTimelineData() async {
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
// 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.
|
||||
|
||||
import 'dart:typed_data';
|
||||
import 'dart:ui';
|
||||
|
||||
import 'scenario.dart';
|
||||
|
||||
/// Echo platform messages back to the sender.
|
||||
mixin PlatformEchoMixin on Scenario {
|
||||
/// Handle a platform message.
|
||||
@override
|
||||
void onPlatformMessage(
|
||||
String name,
|
||||
ByteData? data,
|
||||
PlatformMessageResponseCallback? callback,
|
||||
) {
|
||||
view.platformDispatcher.sendPlatformMessage(name, data, null);
|
||||
}
|
||||
}
|
||||
@@ -422,7 +422,6 @@ class MultiPlatformViewBackgroundForegroundScenario extends Scenario
|
||||
required this.secondId,
|
||||
}) {
|
||||
_nextFrame = _firstFrame;
|
||||
channelBuffers.setListener('flutter/lifecycle', _onPlatformMessage);
|
||||
}
|
||||
|
||||
/// The platform view identifier to use for the first platform view.
|
||||
@@ -505,10 +504,15 @@ class MultiPlatformViewBackgroundForegroundScenario extends Scenario
|
||||
|
||||
String _lastLifecycleState = '';
|
||||
|
||||
void _onPlatformMessage(
|
||||
@override
|
||||
void onPlatformMessage(
|
||||
String name,
|
||||
ByteData? data,
|
||||
PlatformMessageResponseCallback? callback,
|
||||
) {
|
||||
if (name != 'flutter/lifecycle') {
|
||||
return;
|
||||
}
|
||||
final String message = utf8.decode(data!.buffer.asUint8List());
|
||||
if (_lastLifecycleState == 'AppLifecycleState.inactive' &&
|
||||
message == 'AppLifecycleState.resumed') {
|
||||
@@ -518,12 +522,6 @@ class MultiPlatformViewBackgroundForegroundScenario extends Scenario
|
||||
|
||||
_lastLifecycleState = message;
|
||||
}
|
||||
|
||||
@override
|
||||
void unmount() {
|
||||
channelBuffers.clearListener('flutter/lifecycle');
|
||||
super.unmount();
|
||||
}
|
||||
}
|
||||
|
||||
/// Platform view with clip rect.
|
||||
|
||||
@@ -2,19 +2,17 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'dart:typed_data';
|
||||
import 'dart:ui';
|
||||
|
||||
import 'channel_util.dart';
|
||||
|
||||
import 'platform_echo_mixin.dart';
|
||||
import 'scenario.dart';
|
||||
|
||||
/// A blank page with a button that pops the page when tapped.
|
||||
class PoppableScreenScenario extends Scenario {
|
||||
class PoppableScreenScenario extends Scenario with PlatformEchoMixin {
|
||||
/// Creates the PoppableScreenScenario.
|
||||
PoppableScreenScenario(super.view) {
|
||||
channelBuffers.setListener('flutter/platform', _onHandlePlatformMessage);
|
||||
}
|
||||
PoppableScreenScenario(super.view);
|
||||
|
||||
// Rect for the pop button. Only defined once onMetricsChanged is called.
|
||||
Rect? _buttonRect;
|
||||
@@ -81,14 +79,4 @@ class PoppableScreenScenario extends Scenario {
|
||||
// will fail.
|
||||
);
|
||||
}
|
||||
|
||||
void _onHandlePlatformMessage(ByteData? data, PlatformMessageResponseCallback callback) {
|
||||
view.platformDispatcher.sendPlatformMessage('flutter/platform', data, null);
|
||||
}
|
||||
|
||||
@override
|
||||
void unmount() {
|
||||
channelBuffers.clearListener('flutter/platform');
|
||||
super.unmount();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'dart:typed_data';
|
||||
import 'dart:ui';
|
||||
|
||||
/// A scenario to run for testing.
|
||||
@@ -50,4 +51,14 @@ abstract class Scenario {
|
||||
///
|
||||
/// See [PlatformDispatcher.onPointerDataPacket].
|
||||
void onPointerDataPacket(PointerDataPacket packet) {}
|
||||
|
||||
/// Called by the program when an engine side platform channel message is
|
||||
/// received.
|
||||
///
|
||||
/// See [PlatformDispatcher.onPlatformMessage].
|
||||
void onPlatformMessage(
|
||||
String name,
|
||||
ByteData? data,
|
||||
PlatformMessageResponseCallback? callback,
|
||||
) {}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user