requestCrossOrigin static method

Future<String> requestCrossOrigin(
  1. String url, {
  2. String? method,
  3. String? sendData,
})

Makes a cross-origin request to the specified URL.

This API provides a subset of request which works on IE9. If IE9 cross-origin support is not required then request should be used instead.

Implementation

static Future<String> requestCrossOrigin(
  String url, {
  String? method,
  String? sendData,
}) {
  if (supportsCrossOrigin) {
    return request(url, method: method, sendData: sendData).then((xhr) {
      return xhr.responseText!;
    });
  }
  var completer = new Completer<String>();
  if (method == null) {
    method = 'GET';
  }
  var xhr = JS('var', 'new XDomainRequest()');
  JS('', '#.open(#, #)', xhr, method, url);
  JS(
    '',
    '#.onload = #',
    xhr,
    convertDartClosureToJS((e) {
      var response = JS('String', '#.responseText', xhr);
      completer.complete(response as FutureOr<String>?);
    }, 1),
  );
  JS(
    '',
    '#.onerror = #',
    xhr,
    convertDartClosureToJS((e) {
      completer.completeError(e);
    }, 1),
  );

  // IE9 RTM - XDomainRequest issued requests may abort if all event handlers
  // not specified
  // http://social.msdn.microsoft.com/Forums/ie/en-US/30ef3add-767c-4436-b8a9-f1ca19b4812e/ie9-rtm-xdomainrequest-issued-requests-may-abort-if-all-event-handlers-not-specified
  JS('', '#.onprogress = {}', xhr);
  JS('', '#.ontimeout = {}', xhr);
  JS('', '#.timeout = Number.MAX_VALUE', xhr);

  if (sendData != null) {
    JS('', '#.send(#)', xhr, sendData);
  } else {
    JS('', '#.send()', xhr);
  }

  return completer.future;
}