| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| // for details. 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.9 |
| |
| library url_test; |
| |
| import 'dart:async'; |
| import 'dart:html'; |
| import 'dart:typed_data'; |
| |
| import 'package:expect/minitest.dart'; |
| |
| Blob createImageBlob() { |
| var canvas = new CanvasElement(); |
| canvas.width = 100; |
| canvas.height = 100; |
| |
| var context = canvas.context2D; |
| context.fillStyle = 'red'; |
| context.fillRect(0, 0, canvas.width, canvas.height); |
| |
| var dataUri = canvas.toDataUrl('image/png'); |
| var byteString = window.atob(dataUri.split(',')[1]); |
| var mimeString = dataUri.split(',')[0].split(':')[1].split(';')[0]; |
| |
| var arrayBuffer = new Uint8List(byteString.length); |
| var dataArray = new Uint8List.view(arrayBuffer.buffer); |
| for (var i = 0; i < byteString.length; i++) { |
| dataArray[i] = byteString.codeUnitAt(i); |
| } |
| |
| var blob = new Blob([arrayBuffer], 'image/png'); |
| return blob; |
| } |
| |
| Future testCreateObjectUrlFromBlob() async { |
| final done = new Completer(); |
| var blob = createImageBlob(); |
| var url = Url.createObjectUrlFromBlob(blob); |
| expect(url.length, greaterThan(0)); |
| expect(url.startsWith('blob:'), isTrue); |
| |
| var img = new ImageElement(); |
| img.onLoad.listen((_) { |
| expect(img.complete, true); |
| done.complete(); |
| }); |
| img.onError.listen((_) { |
| fail('URL failed to load.'); |
| }); |
| img.src = url; |
| await done.future; |
| } |
| |
| Future testRevokeObjectUrl() async { |
| final done = new Completer(); |
| var blob = createImageBlob(); |
| var url = Url.createObjectUrlFromBlob(blob); |
| expect(url.startsWith('blob:'), isTrue); |
| Url.revokeObjectUrl(url); |
| |
| var img = new ImageElement(); |
| // Image should fail to load since the URL was revoked. |
| img.onError.listen(done.complete); |
| img.onLoad.listen((_) { |
| fail('URL should not have loaded.'); |
| }); |
| img.src = url; |
| await done.future; |
| } |
| |
| main() async { |
| await testCreateObjectUrlFromBlob(); |
| await testRevokeObjectUrl(); |
| } |