// Copyright (c) 2014, 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.

/// @assertion static Future<HttpRequest> request(String url, {String method,
/// bool withCredentials, String responseType, String mimeType,
/// Map<String, String> requestHeaders, sendData, Function onProgress})
/// Creates and sends a URL request for the specified url.
/// By default request will perform an HTTP GET request, but a different method
/// (POST, PUT, DELETE, etc) can be used by specifying the method parameter.
/// The Future is completed when the response is available.
/// If specified, sendData will send data in the form of a ByteBuffer, Blob,
/// Document, String, or FormData along with the HttpRequest.
/// The withCredentials parameter specified that credentials such as a cookie
/// (already) set in the header or authorization headers should be specified
/// for the request. Details to keep in mind when using credentials:
/// Using credentials is only useful for cross-origin requests.
/// The Access-Control-Allow-Origin header of url cannot contain a wildcard (*).
/// The Access-Control-Allow-Credentials header of url must be set to true.
/// If Access-Control-Expose-Headers has not been set to true, only a subset
/// of all the response headers will be returned when calling getAllRequestHeaders.
/// @description Checks that the method works with "GET".

import "dart:html";
import "dart:async";
import "../../../Utils/expect.dart";
import "../testcommon.dart";

main() {
  asyncStart();
  var port = crossOriginPort;
  var host = '${window.location.protocol}//${window.location.hostname}:$port';
  var url = '$host/root_dart/tests/co19/src/LibTest/html/xhr_cross_origin_data.txt';
  Future<HttpRequest> f =
      HttpRequest.request(url, method: "GET", onProgress: (event) {
    Expect.equals("progress", event.type, "stream.listen.onData");
  });
  f.then((HttpRequest r) {
    Expect.isNotNull(r.responseText?.length);
    Expect.isTrue(r.responseText!.length > 0);
    asyncEnd();
  }, onError: (Object error) {
    Expect.fail("request.onLoad.listen:onError($error)");
  });
}
