// 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();
}
