From d451a75ed49651c39de829c76112ea034a85f264 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Fri, 20 Sep 2019 14:50:20 -0700 Subject: [PATCH 01/11] Made it so you can resize channel buffers by sending messages to them. --- lib/ui/channel_buffers.dart | 27 ++++++++++++++++- lib/ui/hooks.dart | 10 ++++++- .../framework/Headers/FlutterChannels.h | 8 +++++ .../framework/Source/FlutterChannels.mm | 9 ++++++ testing/dart/channel_buffers_test.dart | 30 ++++++++++++++----- 5 files changed, 75 insertions(+), 9 deletions(-) diff --git a/lib/ui/channel_buffers.dart b/lib/ui/channel_buffers.dart index 26ba96d1ebb6d..4496f38268030 100644 --- a/lib/ui/channel_buffers.dart +++ b/lib/ui/channel_buffers.dart @@ -112,6 +112,8 @@ class ChannelBuffers { /// buffer size that will avoid any overflows. static const int kDefaultBufferSize = 1; + static const String kControlChannelName = "com.google.flutter/channel-buffers"; + /// A mapping between a channel name and its associated [_RingBuffer]. final Map> _messages = >{}; @@ -162,7 +164,7 @@ class ChannelBuffers { /// /// This could result in the dropping of messages if newSize is less /// than the current length of the queue. - void resize(String channel, int newSize) { + void _resize(String channel, int newSize) { _RingBuffer<_StoredMessage> queue = _messages[channel]; if (queue == null) { queue = _makeRingBuffer(newSize); @@ -185,6 +187,29 @@ class ChannelBuffers { await callback(message.data, message.callback); } } + + String _getString(ByteData data) { + final ByteBuffer buffer = data.buffer; + var list = buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); + return utf8.decode(list); + } + + /// Send a control message. + /// + /// This is intended to be called by the platform messages dispatcher. + /// + /// Available messages: + /// * resize - Allows you to set the size of a channel's buffer, command is in the format of + /// `resize//` + void handleMessage(String name, ByteData data) { + assert(name == kControlChannelName); + final List command = _getString(data).split("\r"); + if (command.length == 3 && command[0] == "resize") { + _resize(command[1], int.parse(command[2])); + } else { + throw Exception('Unrecognized command $command sent to $kControlChannelName.'); + } + } } /// [ChannelBuffer]s that allow the storage of messages between the diff --git a/lib/ui/hooks.dart b/lib/ui/hooks.dart index 6fb6b3a1556e1..5488475064d46 100644 --- a/lib/ui/hooks.dart +++ b/lib/ui/hooks.dart @@ -150,7 +150,15 @@ void _updateAccessibilityFeatures(int values) { @pragma('vm:entry-point') void _dispatchPlatformMessage(String name, ByteData data, int responseId) { - if (window.onPlatformMessage != null) { + if (name == ChannelBuffers.kControlChannelName) { + try { + channelBuffers.handleMessage(name, data); + } catch (ex) { + _printDebug('Message "$name" caused exception $ex'); + } finally { + window._respondToPlatformMessage(responseId, null); + } + } else if (window.onPlatformMessage != null) { _invoke3( window.onPlatformMessage, window._onPlatformMessageZone, diff --git a/shell/platform/darwin/common/framework/Headers/FlutterChannels.h b/shell/platform/darwin/common/framework/Headers/FlutterChannels.h index b0a81e9e7de25..c47db1749b236 100644 --- a/shell/platform/darwin/common/framework/Headers/FlutterChannels.h +++ b/shell/platform/darwin/common/framework/Headers/FlutterChannels.h @@ -114,6 +114,14 @@ FLUTTER_EXPORT * @param handler The message handler. */ - (void)setMessageHandler:(FlutterMessageHandler _Nullable)handler; + +/** + * Adjusts the number of messages that will get buffered when sending messages to + * channels that aren't fully setup yet. For example, the engine isn't running + * yet or the channel's message handler isn't setup on the Dart side yet. + */ +- (void)resizeChannelBuffer:(NSInteger)newSize; + @end /** diff --git a/shell/platform/darwin/common/framework/Source/FlutterChannels.mm b/shell/platform/darwin/common/framework/Source/FlutterChannels.mm index 33ff2da28dcc7..a55a214534dfc 100644 --- a/shell/platform/darwin/common/framework/Source/FlutterChannels.mm +++ b/shell/platform/darwin/common/framework/Source/FlutterChannels.mm @@ -6,6 +6,8 @@ #pragma mark - Basic message channel +static NSString* const FlutterChannelBuffersChannel = @"com.google.flutter/channel-buffers"; + @implementation FlutterBasicMessageChannel { NSObject* _messenger; NSString* _name; @@ -70,6 +72,13 @@ - (void)setMessageHandler:(FlutterMessageHandler)handler { }; [_messenger setMessageHandlerOnChannel:_name binaryMessageHandler:messageHandler]; } + +- (void)resizeChannelBuffer:(NSInteger)newSize { + NSString* channelName = + [NSString stringWithFormat:@"%@\r%@\r%@", FlutterChannelBuffersChannel, _name, @(newSize)]; + [_messenger sendOnChannel:channelName message:nil]; +} + @end #pragma mark - Method channel diff --git a/testing/dart/channel_buffers_test.dart b/testing/dart/channel_buffers_test.dart index ee5312484ee12..2a631c59cbf75 100644 --- a/testing/dart/channel_buffers_test.dart +++ b/testing/dart/channel_buffers_test.dart @@ -18,6 +18,10 @@ void main() { return utf8.decode(list); } + void _resize(ui.ChannelBuffers buffers, String name, int newSize) { + buffers.handleMessage(ui.ChannelBuffers.kControlChannelName, _makeByteData("resize\r$name\r$newSize")); + } + test('push drain', () async { String channel = "foo"; ByteData data = _makeByteData('bar'); @@ -35,7 +39,7 @@ void main() { ByteData data = _makeByteData('bar'); ui.ChannelBuffers buffers = ui.ChannelBuffers(); ui.PlatformMessageResponseCallback callback = (ByteData responseData) {}; - buffers.resize(channel, 0); + _resize(buffers, channel, 0); buffers.push(channel, data, callback); bool didCall = false; await buffers.drain(channel, (ByteData drainedData, ui.PlatformMessageResponseCallback drainedCallback) { @@ -64,7 +68,7 @@ void main() { ByteData four = _makeByteData('four'); ui.ChannelBuffers buffers = ui.ChannelBuffers(); ui.PlatformMessageResponseCallback callback = (ByteData responseData) {}; - buffers.resize(channel, 3); + _resize(buffers, channel, 3); expect(buffers.push(channel, one, callback), equals(false)); expect(buffers.push(channel, two, callback), equals(false)); expect(buffers.push(channel, three, callback), equals(false)); @@ -84,11 +88,11 @@ void main() { ByteData one = _makeByteData('one'); ByteData two = _makeByteData('two'); ui.ChannelBuffers buffers = ui.ChannelBuffers(); - buffers.resize(channel, 100); + _resize(buffers, channel, 100); ui.PlatformMessageResponseCallback callback = (ByteData responseData) {}; expect(buffers.push(channel, one, callback), equals(false)); expect(buffers.push(channel, two, callback), equals(false)); - buffers.resize(channel, 1); + _resize(buffers, channel, 1); int counter = 0; await buffers.drain(channel, (ByteData drainedData, ui.PlatformMessageResponseCallback drainedCallback) { if (counter++ == 0) { @@ -109,10 +113,10 @@ void main() { didCallCallback = true; }; ui.PlatformMessageResponseCallback twoCallback = (ByteData responseData) {}; - buffers.resize(channel, 100); + _resize(buffers, channel, 100); expect(buffers.push(channel, one, oneCallback), equals(false)); expect(buffers.push(channel, two, twoCallback), equals(false)); - buffers.resize(channel, 1); + _resize(buffers, channel, 1); expect(didCallCallback, equals(true)); }); @@ -126,9 +130,21 @@ void main() { didCallCallback = true; }; ui.PlatformMessageResponseCallback twoCallback = (ByteData responseData) {}; - buffers.resize(channel, 1); + _resize(buffers, channel, 1); expect(buffers.push(channel, one, oneCallback), equals(false)); expect(buffers.push(channel, two, twoCallback), equals(true)); expect(didCallCallback, equals(true)); }); + + test('handle garbage', () async { + ui.ChannelBuffers buffers = ui.ChannelBuffers(); + expect(() => buffers.handleMessage(ui.ChannelBuffers.kControlChannelName, _makeByteData("asdfasdf")), + throwsException); + }); + + test('handle resize garbage', () async { + ui.ChannelBuffers buffers = ui.ChannelBuffers(); + expect(() => buffers.handleMessage(ui.ChannelBuffers.kControlChannelName, _makeByteData("resize\rfoo\rbar")), + throwsException); + }); } From fb947809321a662c634549a3d4e9eac158d1463c Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Mon, 23 Sep 2019 10:24:31 -0700 Subject: [PATCH 02/11] added test for ios --- .../framework/Source/FlutterChannels.mm | 7 ++++--- .../framework/Source/FlutterChannelsTest.m | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/shell/platform/darwin/common/framework/Source/FlutterChannels.mm b/shell/platform/darwin/common/framework/Source/FlutterChannels.mm index a55a214534dfc..a5e05a991cf8d 100644 --- a/shell/platform/darwin/common/framework/Source/FlutterChannels.mm +++ b/shell/platform/darwin/common/framework/Source/FlutterChannels.mm @@ -74,9 +74,10 @@ - (void)setMessageHandler:(FlutterMessageHandler)handler { } - (void)resizeChannelBuffer:(NSInteger)newSize { - NSString* channelName = - [NSString stringWithFormat:@"%@\r%@\r%@", FlutterChannelBuffersChannel, _name, @(newSize)]; - [_messenger sendOnChannel:channelName message:nil]; + NSString* messageString = + [NSString stringWithFormat:@"resize\r%@\r%@", _name, @(newSize)]; + NSData* message = [messageString dataUsingEncoding:NSUTF8StringEncoding]; + [_messenger sendOnChannel:FlutterChannelBuffersChannel message:message]; } @end diff --git a/shell/platform/darwin/common/framework/Source/FlutterChannelsTest.m b/shell/platform/darwin/common/framework/Source/FlutterChannelsTest.m index ed99e125f126e..179740ea5f7bb 100644 --- a/shell/platform/darwin/common/framework/Source/FlutterChannelsTest.m +++ b/shell/platform/darwin/common/framework/Source/FlutterChannelsTest.m @@ -139,4 +139,23 @@ - (void)testCallMethodHandler { [self waitForExpectationsWithTimeout:1.0 handler:nil]; } +- (void)testResize { + NSString* channelName = @"foo"; + id binaryMessenger = OCMStrictProtocolMock(@protocol(FlutterBinaryMessenger)); + id codec = OCMProtocolMock(@protocol(FlutterMethodCodec)); + FlutterBasicMessageChannel* channel = + [[FlutterBasicMessageChannel alloc] initWithName:channelName + binaryMessenger:binaryMessenger + codec:codec]; + XCTAssertNotNil(channel); + + NSString* expectedMessageString = + [NSString stringWithFormat:@"resize\r%@\r%@", channelName, @100]; + NSData* expectedMessage = [expectedMessageString dataUsingEncoding:NSUTF8StringEncoding]; + OCMExpect([binaryMessenger sendOnChannel:@"com.google.flutter/channel-buffers" + message:expectedMessage]); + [channel resizeChannelBuffer:100]; + OCMVerifyAll(binaryMessenger); +} + @end From 71eae84da2050ab4ae52a413c6ee945a8392a821 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Mon, 23 Sep 2019 10:44:38 -0700 Subject: [PATCH 03/11] Added android implementation --- .../io/flutter/plugin/common/BasicMessageChannel.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java b/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java index 23a45430c67c1..7622a3a318a2d 100644 --- a/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java +++ b/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java @@ -9,6 +9,7 @@ import android.support.annotation.UiThread; import android.util.Log; import java.nio.ByteBuffer; +import java.nio.charset.Charset; import io.flutter.BuildConfig; import io.flutter.plugin.common.BinaryMessenger.BinaryReply; @@ -29,6 +30,8 @@ */ public final class BasicMessageChannel { private static final String TAG = "BasicMessageChannel#"; + public static final String CHANNEL_BUFFERS_CHANNEL = + "com.google.flutter/channel-buffers"; @NonNull private final BinaryMessenger messenger; @@ -102,6 +105,13 @@ public void setMessageHandler(@Nullable final MessageHandler handler) { handler == null ? null : new IncomingMessageHandler(handler)); } + public void resizeChannelBuffer(int newSize) { + Charset charset = Charset.forName("UTF-8"); + String messageString = String.format("resize\r%s\r%d", name, newSize); + ByteBuffer message = ByteBuffer.wrap(messageString.getBytes(charset)); + messenger.send(CHANNEL_BUFFERS_CHANNEL, message); + } + /** * A handler of incoming messages. */ From 07eb39898790b1071ff2ea0bf9a9fd8c88575b78 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Mon, 23 Sep 2019 10:50:24 -0700 Subject: [PATCH 04/11] updated docstring, removed channel name from handleMessage call --- lib/ui/channel_buffers.dart | 3 +-- lib/ui/hooks.dart | 2 +- .../io/flutter/plugin/common/BasicMessageChannel.java | 5 +++++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/ui/channel_buffers.dart b/lib/ui/channel_buffers.dart index 4496f38268030..f058fe40a6246 100644 --- a/lib/ui/channel_buffers.dart +++ b/lib/ui/channel_buffers.dart @@ -201,8 +201,7 @@ class ChannelBuffers { /// Available messages: /// * resize - Allows you to set the size of a channel's buffer, command is in the format of /// `resize//` - void handleMessage(String name, ByteData data) { - assert(name == kControlChannelName); + void handleMessage(ByteData data) { final List command = _getString(data).split("\r"); if (command.length == 3 && command[0] == "resize") { _resize(command[1], int.parse(command[2])); diff --git a/lib/ui/hooks.dart b/lib/ui/hooks.dart index 5488475064d46..dff82a5e2f5f1 100644 --- a/lib/ui/hooks.dart +++ b/lib/ui/hooks.dart @@ -152,7 +152,7 @@ void _updateAccessibilityFeatures(int values) { void _dispatchPlatformMessage(String name, ByteData data, int responseId) { if (name == ChannelBuffers.kControlChannelName) { try { - channelBuffers.handleMessage(name, data); + channelBuffers.handleMessage(data); } catch (ex) { _printDebug('Message "$name" caused exception $ex'); } finally { diff --git a/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java b/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java index 7622a3a318a2d..36d6deac3d1fe 100644 --- a/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java +++ b/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java @@ -105,6 +105,11 @@ public void setMessageHandler(@Nullable final MessageHandler handler) { handler == null ? null : new IncomingMessageHandler(handler)); } + /** + * Adjusts the number of messages that will get buffered when sending messages to + * channels that aren't fully setup yet. For example, the engine isn't running + * yet or the channel's message handler isn't setup on the Dart side yet. + */ public void resizeChannelBuffer(int newSize) { Charset charset = Charset.forName("UTF-8"); String messageString = String.format("resize\r%s\r%d", name, newSize); From a055d930b7c939790fda49ad0ad154d80c2981ff Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Mon, 23 Sep 2019 11:44:20 -0700 Subject: [PATCH 05/11] updated tests for new calls --- testing/dart/channel_buffers_test.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/testing/dart/channel_buffers_test.dart b/testing/dart/channel_buffers_test.dart index 2a631c59cbf75..98a1a53b9f51d 100644 --- a/testing/dart/channel_buffers_test.dart +++ b/testing/dart/channel_buffers_test.dart @@ -19,7 +19,7 @@ void main() { } void _resize(ui.ChannelBuffers buffers, String name, int newSize) { - buffers.handleMessage(ui.ChannelBuffers.kControlChannelName, _makeByteData("resize\r$name\r$newSize")); + buffers.handleMessage(_makeByteData("resize\r$name\r$newSize")); } test('push drain', () async { @@ -138,13 +138,13 @@ void main() { test('handle garbage', () async { ui.ChannelBuffers buffers = ui.ChannelBuffers(); - expect(() => buffers.handleMessage(ui.ChannelBuffers.kControlChannelName, _makeByteData("asdfasdf")), + expect(() => buffers.handleMessage(_makeByteData("asdfasdf")), throwsException); }); test('handle resize garbage', () async { ui.ChannelBuffers buffers = ui.ChannelBuffers(); - expect(() => buffers.handleMessage(ui.ChannelBuffers.kControlChannelName, _makeByteData("resize\rfoo\rbar")), + expect(() => buffers.handleMessage(_makeByteData("resize\rfoo\rbar")), throwsException); }); } From 88e3ad80d34f184e5f39ff7ae14fa4ebb5d284b9 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Mon, 23 Sep 2019 13:49:02 -0700 Subject: [PATCH 06/11] Changed domain from "com.google.flutter" to "dev.flutter" --- lib/ui/channel_buffers.dart | 2 +- .../android/io/flutter/plugin/common/BasicMessageChannel.java | 2 +- .../platform/darwin/common/framework/Source/FlutterChannels.mm | 2 +- .../darwin/common/framework/Source/FlutterChannelsTest.m | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/ui/channel_buffers.dart b/lib/ui/channel_buffers.dart index f058fe40a6246..05e9d7d4a77a1 100644 --- a/lib/ui/channel_buffers.dart +++ b/lib/ui/channel_buffers.dart @@ -112,7 +112,7 @@ class ChannelBuffers { /// buffer size that will avoid any overflows. static const int kDefaultBufferSize = 1; - static const String kControlChannelName = "com.google.flutter/channel-buffers"; + static const String kControlChannelName = "dev.flutter/channel-buffers"; /// A mapping between a channel name and its associated [_RingBuffer]. final Map> _messages = diff --git a/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java b/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java index 36d6deac3d1fe..81df37a931eb6 100644 --- a/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java +++ b/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java @@ -31,7 +31,7 @@ public final class BasicMessageChannel { private static final String TAG = "BasicMessageChannel#"; public static final String CHANNEL_BUFFERS_CHANNEL = - "com.google.flutter/channel-buffers"; + "dev.flutter/channel-buffers"; @NonNull private final BinaryMessenger messenger; diff --git a/shell/platform/darwin/common/framework/Source/FlutterChannels.mm b/shell/platform/darwin/common/framework/Source/FlutterChannels.mm index a5e05a991cf8d..3cd8a6df98ec3 100644 --- a/shell/platform/darwin/common/framework/Source/FlutterChannels.mm +++ b/shell/platform/darwin/common/framework/Source/FlutterChannels.mm @@ -6,7 +6,7 @@ #pragma mark - Basic message channel -static NSString* const FlutterChannelBuffersChannel = @"com.google.flutter/channel-buffers"; +static NSString* const FlutterChannelBuffersChannel = @"dev.flutter/channel-buffers"; @implementation FlutterBasicMessageChannel { NSObject* _messenger; diff --git a/shell/platform/darwin/common/framework/Source/FlutterChannelsTest.m b/shell/platform/darwin/common/framework/Source/FlutterChannelsTest.m index 179740ea5f7bb..a6c5d7fea0fb3 100644 --- a/shell/platform/darwin/common/framework/Source/FlutterChannelsTest.m +++ b/shell/platform/darwin/common/framework/Source/FlutterChannelsTest.m @@ -152,7 +152,7 @@ - (void)testResize { NSString* expectedMessageString = [NSString stringWithFormat:@"resize\r%@\r%@", channelName, @100]; NSData* expectedMessage = [expectedMessageString dataUsingEncoding:NSUTF8StringEncoding]; - OCMExpect([binaryMessenger sendOnChannel:@"com.google.flutter/channel-buffers" + OCMExpect([binaryMessenger sendOnChannel:@"dev.flutter/channel-buffers" message:expectedMessage]); [channel resizeChannelBuffer:100]; OCMVerifyAll(binaryMessenger); From db100f80595aa585e1f2cab5e9f089fcada9b1cf Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Mon, 23 Sep 2019 13:57:03 -0700 Subject: [PATCH 07/11] ran formatter --- .../platform/darwin/common/framework/Source/FlutterChannels.mm | 3 +-- .../darwin/common/framework/Source/FlutterChannelsTest.m | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/shell/platform/darwin/common/framework/Source/FlutterChannels.mm b/shell/platform/darwin/common/framework/Source/FlutterChannels.mm index 3cd8a6df98ec3..9087bd80d7ed8 100644 --- a/shell/platform/darwin/common/framework/Source/FlutterChannels.mm +++ b/shell/platform/darwin/common/framework/Source/FlutterChannels.mm @@ -74,8 +74,7 @@ - (void)setMessageHandler:(FlutterMessageHandler)handler { } - (void)resizeChannelBuffer:(NSInteger)newSize { - NSString* messageString = - [NSString stringWithFormat:@"resize\r%@\r%@", _name, @(newSize)]; + NSString* messageString = [NSString stringWithFormat:@"resize\r%@\r%@", _name, @(newSize)]; NSData* message = [messageString dataUsingEncoding:NSUTF8StringEncoding]; [_messenger sendOnChannel:FlutterChannelBuffersChannel message:message]; } diff --git a/shell/platform/darwin/common/framework/Source/FlutterChannelsTest.m b/shell/platform/darwin/common/framework/Source/FlutterChannelsTest.m index a6c5d7fea0fb3..941bef90cb305 100644 --- a/shell/platform/darwin/common/framework/Source/FlutterChannelsTest.m +++ b/shell/platform/darwin/common/framework/Source/FlutterChannelsTest.m @@ -152,8 +152,7 @@ - (void)testResize { NSString* expectedMessageString = [NSString stringWithFormat:@"resize\r%@\r%@", channelName, @100]; NSData* expectedMessage = [expectedMessageString dataUsingEncoding:NSUTF8StringEncoding]; - OCMExpect([binaryMessenger sendOnChannel:@"dev.flutter/channel-buffers" - message:expectedMessage]); + OCMExpect([binaryMessenger sendOnChannel:@"dev.flutter/channel-buffers" message:expectedMessage]); [channel resizeChannelBuffer:100]; OCMVerifyAll(binaryMessenger); } From 466519a2c88f333adfb197f62adff86de7a95ac6 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Mon, 23 Sep 2019 14:06:05 -0700 Subject: [PATCH 08/11] fixed formatting --- lib/ui/channel_buffers.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/ui/channel_buffers.dart b/lib/ui/channel_buffers.dart index 05e9d7d4a77a1..1d1cd9800cc68 100644 --- a/lib/ui/channel_buffers.dart +++ b/lib/ui/channel_buffers.dart @@ -112,7 +112,7 @@ class ChannelBuffers { /// buffer size that will avoid any overflows. static const int kDefaultBufferSize = 1; - static const String kControlChannelName = "dev.flutter/channel-buffers"; + static const String kControlChannelName = 'dev.flutter/channel-buffers'; /// A mapping between a channel name and its associated [_RingBuffer]. final Map> _messages = @@ -190,7 +190,7 @@ class ChannelBuffers { String _getString(ByteData data) { final ByteBuffer buffer = data.buffer; - var list = buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); + final Uint8List list = buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); return utf8.decode(list); } @@ -202,8 +202,8 @@ class ChannelBuffers { /// * resize - Allows you to set the size of a channel's buffer, command is in the format of /// `resize//` void handleMessage(ByteData data) { - final List command = _getString(data).split("\r"); - if (command.length == 3 && command[0] == "resize") { + final List command = _getString(data).split('\r'); + if (command.length == 3 && command[0] == 'resize') { _resize(command[1], int.parse(command[2])); } else { throw Exception('Unrecognized command $command sent to $kControlChannelName.'); From a59725f21f5043895136df86e9604b25f88b9646 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Mon, 23 Sep 2019 14:18:16 -0700 Subject: [PATCH 09/11] updated web_ui --- lib/web_ui/lib/src/ui/channel_buffers.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/web_ui/lib/src/ui/channel_buffers.dart b/lib/web_ui/lib/src/ui/channel_buffers.dart index e872d1b9d2691..ba7ca66232cbb 100644 --- a/lib/web_ui/lib/src/ui/channel_buffers.dart +++ b/lib/web_ui/lib/src/ui/channel_buffers.dart @@ -16,8 +16,8 @@ class ChannelBuffers { return true; } - /// Noop in web_ui, caches are always size zero. - void resize(String channel, int newSize) {} + /// A noop since the web_ui implementation doesn't handle any messages. + void handleMessage(ByteData data) {} /// Remove and process all stored messages for a given channel. /// From 49b061b596731ff3fe284ba244a157ddc09ac208 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Mon, 23 Sep 2019 14:41:45 -0700 Subject: [PATCH 10/11] fixed java linter warning --- .../android/io/flutter/plugin/common/BasicMessageChannel.java | 3 ++- shell/platform/fuchsia/runtime/dart/utils/BUILD.gn | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java b/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java index 81df37a931eb6..2e7e2e790bb62 100644 --- a/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java +++ b/shell/platform/android/io/flutter/plugin/common/BasicMessageChannel.java @@ -10,6 +10,7 @@ import android.util.Log; import java.nio.ByteBuffer; import java.nio.charset.Charset; +import java.util.Locale; import io.flutter.BuildConfig; import io.flutter.plugin.common.BinaryMessenger.BinaryReply; @@ -112,7 +113,7 @@ public void setMessageHandler(@Nullable final MessageHandler handler) { */ public void resizeChannelBuffer(int newSize) { Charset charset = Charset.forName("UTF-8"); - String messageString = String.format("resize\r%s\r%d", name, newSize); + String messageString = String.format(Locale.US, "resize\r%s\r%d", name, newSize); ByteBuffer message = ByteBuffer.wrap(messageString.getBytes(charset)); messenger.send(CHANNEL_BUFFERS_CHANNEL, message); } diff --git a/shell/platform/fuchsia/runtime/dart/utils/BUILD.gn b/shell/platform/fuchsia/runtime/dart/utils/BUILD.gn index b1c94a762da59..1dca94e3c2acd 100644 --- a/shell/platform/fuchsia/runtime/dart/utils/BUILD.gn +++ b/shell/platform/fuchsia/runtime/dart/utils/BUILD.gn @@ -34,10 +34,10 @@ source_set("utils") { "$fuchsia_sdk_root/pkg:async-loop-default", "$fuchsia_sdk_root/pkg:fdio", "$fuchsia_sdk_root/pkg:memfs", - "$fuchsia_sdk_root/pkg:syslog", - "$fuchsia_sdk_root/pkg:zx", "$fuchsia_sdk_root/pkg:sys_cpp", + "$fuchsia_sdk_root/pkg:syslog", "$fuchsia_sdk_root/pkg:vfs_cpp", + "$fuchsia_sdk_root/pkg:zx", "//third_party/tonic", ] From c33b53caa22fa4a9f81028e6798dce426eeb3789 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Tue, 24 Sep 2019 14:15:22 -0700 Subject: [PATCH 11/11] updated documentation and strings --- lib/ui/channel_buffers.dart | 10 ++++++---- lib/ui/hooks.dart | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/ui/channel_buffers.dart b/lib/ui/channel_buffers.dart index 1d1cd9800cc68..c99c37ea16b95 100644 --- a/lib/ui/channel_buffers.dart +++ b/lib/ui/channel_buffers.dart @@ -194,16 +194,18 @@ class ChannelBuffers { return utf8.decode(list); } - /// Send a control message. + /// Handle a control message. /// /// This is intended to be called by the platform messages dispatcher. /// /// Available messages: - /// * resize - Allows you to set the size of a channel's buffer, command is in the format of - /// `resize//` + /// - Name: resize + /// Arity: 2 + /// Format: `resize\r\r` + /// Description: Allows you to set the size of a channel's buffer. void handleMessage(ByteData data) { final List command = _getString(data).split('\r'); - if (command.length == 3 && command[0] == 'resize') { + if (command.length == /*arity=*/2 + 1 && command[0] == 'resize') { _resize(command[1], int.parse(command[2])); } else { throw Exception('Unrecognized command $command sent to $kControlChannelName.'); diff --git a/lib/ui/hooks.dart b/lib/ui/hooks.dart index dff82a5e2f5f1..cee8de37388a3 100644 --- a/lib/ui/hooks.dart +++ b/lib/ui/hooks.dart @@ -154,7 +154,7 @@ void _dispatchPlatformMessage(String name, ByteData data, int responseId) { try { channelBuffers.handleMessage(data); } catch (ex) { - _printDebug('Message "$name" caused exception $ex'); + _printDebug('Message to "$name" caused exception $ex'); } finally { window._respondToPlatformMessage(responseId, null); }