| Index: sdk/lib/io/websocket_impl.dart | 
| diff --git a/sdk/lib/io/websocket_impl.dart b/sdk/lib/io/websocket_impl.dart | 
| index d593b58558962d77187f304a90e267c8c2674921..17520a1ecfb72bfef75a7ebce21403d8040b1871 100644 | 
| --- a/sdk/lib/io/websocket_impl.dart | 
| +++ b/sdk/lib/io/websocket_impl.dart | 
| @@ -36,6 +36,11 @@ class _WebSocketOpcode { | 
| static const int RESERVED_F = 15; | 
| } | 
|  | 
| +class _EncodedString { | 
| +  final List<int> bytes; | 
| +  _EncodedString(this.bytes); | 
| +} | 
| + | 
| /** | 
| *  Stores the header and integer value derived from negotiation of | 
| *  client_max_window_bits and server_max_window_bits. headerValue will be | 
| @@ -670,13 +675,14 @@ class _WebSocketOutgoingTransformer | 
| if (message is String) { | 
| opcode = _WebSocketOpcode.TEXT; | 
| data = UTF8.encode(message); | 
| +      } else if (message is List<int>) { | 
| +        opcode = _WebSocketOpcode.BINARY; | 
| +        data = message; | 
| +      } else if (message is _EncodedString) { | 
| +        opcode = _WebSocketOpcode.TEXT; | 
| +        data = message.bytes; | 
| } else { | 
| -        if (message is List<int>) { | 
| -          opcode = _WebSocketOpcode.BINARY; | 
| -          data = message; | 
| -        } else { | 
| -          throw new ArgumentError(message); | 
| -        } | 
| +        throw new ArgumentError(message); | 
| } | 
|  | 
| if (_deflateHelper != null) { | 
| @@ -1176,6 +1182,12 @@ class _WebSocketImpl extends Stream with _ServiceObject implements WebSocket { | 
| String get closeReason => _closeReason; | 
|  | 
| void add(data) { _sink.add(data); } | 
| +  void addUtf8Text(List<int> bytes) { | 
| +    if (bytes is! List<int>) { | 
| +      throw new ArgumentError(bytes, "bytes", "Is not a list of bytes"); | 
| +    } | 
| +    _sink.add(new _EncodedString(bytes)); | 
| +  } | 
| void addError(error, [StackTrace stackTrace]) { | 
| _sink.addError(error, stackTrace); | 
| } | 
|  |