Index: mojo/public/dart/third_party/html/lib/parser_console.dart |
diff --git a/mojo/public/dart/third_party/html/lib/parser_console.dart b/mojo/public/dart/third_party/html/lib/parser_console.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..515f891c45cf3b242bc3b7e5ebc6134a7e9117ef |
--- /dev/null |
+++ b/mojo/public/dart/third_party/html/lib/parser_console.dart |
@@ -0,0 +1,42 @@ |
+/// This library adds `dart:io` support to the HTML5 parser. Call |
+/// [initDartIOSupport] before calling the [parse] methods and they will accept |
+/// a [RandomAccessFile] as input, in addition to the other input types. |
+library parser_console; |
+ |
+import 'dart:io'; |
+import 'parser.dart'; |
+import 'src/inputstream.dart' as inputstream; |
+ |
+/// Adds support to the [HtmlParser] for running on a console VM. In particular |
+/// this means it will be able to handle `dart:io` and [RandomAccessFile]s as |
+/// input to the various [parse] methods. |
+void useConsole() { |
+ inputstream.consoleSupport = new _ConsoleSupport(); |
+} |
+ |
+class _ConsoleSupport extends inputstream.ConsoleSupport { |
+ List<int> bytesFromFile(source) { |
+ if (source is! RandomAccessFile) return null; |
+ return readAllBytesFromFile(source); |
+ } |
+} |
+ |
+// TODO(jmesserly): this should be `RandomAccessFile.readAllBytes`. |
+/// Synchronously reads all bytes from the [file]. |
+List<int> readAllBytesFromFile(RandomAccessFile file) { |
+ int length = file.lengthSync(); |
+ var bytes = new List<int>(length); |
+ |
+ int bytesRead = 0; |
+ while (bytesRead < length) { |
+ int read = file.readIntoSync(bytes, bytesRead, length - bytesRead); |
+ if (read <= 0) { |
+ // This could happen if, for example, the file was resized while |
+ // we're reading. Just shrink the bytes array and move on. |
+ bytes = bytes.sublist(0, bytesRead); |
+ break; |
+ } |
+ bytesRead += read; |
+ } |
+ return bytes; |
+} |