blob: 4e66c6a51214d7f0acec3f0bf32aca1745253259 [file] [log] [blame]
// Copyright (c) 2025, 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.
//
// API docs from [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web).
// Attributions and copyright licensing by Mozilla Contributors is licensed
// under [CC-BY-SA 2.5](https://creativecommons.org/licenses/by-sa/2.5/.
// Generated from Web IDL definitions.
// ignore_for_file: unintended_html_in_doc_comment
@JS()
library;
import 'dart:js_interop';
import 'dom.dart';
import 'html.dart';
typedef FormDataEntryValue = JSAny;
typedef XMLHttpRequestResponseType = String;
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// `XMLHttpRequestEventTarget` is the interface that describes the event
/// handlers shared on [XMLHttpRequest] and [XMLHttpRequestUpload].
///
/// You don't use `XMLHttpRequestEventTarget` directly; instead you interact
/// with the sub classes.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequestEventTarget).
extension type XMLHttpRequestEventTarget._(JSObject _)
implements EventTarget, JSObject {
external EventHandler get onloadstart;
external set onloadstart(EventHandler value);
external EventHandler get onprogress;
external set onprogress(EventHandler value);
external EventHandler get onabort;
external set onabort(EventHandler value);
external EventHandler get onerror;
external set onerror(EventHandler value);
external EventHandler get onload;
external set onload(EventHandler value);
external EventHandler get ontimeout;
external set ontimeout(EventHandler value);
external EventHandler get onloadend;
external set onloadend(EventHandler value);
}
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The **`XMLHttpRequestUpload`** interface represents the upload process for a
/// specific [XMLHttpRequest]. It is an _opaque_ object that represents the
/// underlying, browser-dependent, upload process. It is an
/// [XMLHttpRequestEventTarget] and can be obtained by calling
/// [XMLHttpRequest.upload].
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequestUpload).
extension type XMLHttpRequestUpload._(JSObject _)
implements XMLHttpRequestEventTarget, JSObject {}
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// `XMLHttpRequest` (XHR) objects are used to interact with servers. You can
/// retrieve data from a URL without having to do a full page refresh. This
/// enables a Web page to update just part of a page without disrupting what the
/// user is doing.
///
/// Despite its name, `XMLHttpRequest` can be used to retrieve any type of data,
/// not just XML.
///
/// If your communication needs to involve receiving event data or message data
/// from a server, consider using
/// [server-sent events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events)
/// through the [EventSource] interface. For full-duplex communication,
/// [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API)
/// may be a better choice.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest).
extension type XMLHttpRequest._(JSObject _)
implements XMLHttpRequestEventTarget, JSObject {
external factory XMLHttpRequest();
static const int UNSENT = 0;
static const int OPENED = 1;
static const int HEADERS_RECEIVED = 2;
static const int LOADING = 3;
static const int DONE = 4;
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The [XMLHttpRequest] method **`open()`**
/// initializes a newly-created request, or re-initializes an existing one.
///
/// > [!NOTE]
/// > Calling this method for an already active request
/// > (one for which `open()` has already been called) is the equivalent of
/// > calling
/// > [XMLHttpRequest.abort].
external void open(
String method,
String url, [
bool async,
String? username,
String? password,
]);
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The [XMLHttpRequest] method **`setRequestHeader()`** sets the value of an
/// HTTP request header.
/// When using `setRequestHeader()`, you must call it after calling
/// [XMLHttpRequest.open], but before calling [XMLHttpRequest.send].
/// If this method is called several times with the same header, the values
/// are merged into one single request header.
///
/// Each time you call `setRequestHeader()` after the first time you call it,
/// the specified text is appended to the end of the existing header's
/// content.
///
/// If no `Accept` header has been set using this, an `Accept` header with the
/// type `"*/*"` is sent with the request when [XMLHttpRequest.send] is
/// called.
///
/// For security reasons, there are several whose values are controlled by
/// the user agent. Any attempt to set a value for one of those headers from
/// frontend JavaScript code will be ignored without warning or error.
///
/// In addition, the
/// [`Authorization`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization)
/// HTTP header may be added to a request, but will be removed if the request
/// is redirected cross-origin.
///
/// > [!NOTE]
/// > For your custom fields, you may encounter a "**not allowed by
/// > Access-Control-Allow-Headers in preflight response**" exception when you
/// > send requests across domains.
/// > In this situation, you need to set up the in your response header at
/// > server side.
external void setRequestHeader(
String name,
String value,
);
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The [XMLHttpRequest] method
/// **`send()`** sends the request to the server.
///
/// If the
/// request is asynchronous (which is the default), this method returns as
/// soon as the
/// request is sent and the result is delivered using events. If the request
/// is synchronous,
/// this method doesn't return until the response has arrived.
///
/// `send()` accepts an optional parameter which lets you specify the
/// request's
/// body; this is primarily used for requests such as `PUT`. If the request
/// method is `GET` or `HEAD`, the `body`
/// parameter is ignored and the request body is set to `null`.
///
/// If no `Accept` header has been set using the
/// [XMLHttpRequest.setRequestHeader], an
/// `Accept` header with the type `"*/*"` (any type) is sent.
external void send([JSAny? body]);
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The **`XMLHttpRequest.abort()`** method aborts the request if
/// it has already been sent. When a request is aborted, its
/// [XMLHttpRequest.readyState] is changed to
/// `XMLHttpRequest.UNSENT` (0) and the request's
/// [XMLHttpRequest.status] code is set to 0.
///
/// If the request is still in progress (its `readyState` is not
/// `XMLHttpRequest.DONE` or `XMLHttpRequest.UNSENT`), a
/// [XMLHttpRequest.readystatechange_event] event,
/// [XMLHttpRequest.abort_event], and a [XMLHttpRequest.loadend_event] event
/// are dispatched, in that order. For synchronous requests, no events are
/// dispatched and an error is thrown instead.
external void abort();
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The [XMLHttpRequest] method
/// **`getResponseHeader()`** returns the string containing the
/// text of a particular header's value.
///
/// If there are multiple response headers
/// with the same name, then their values are returned as a single
/// concatenated string,
/// where each value is separated from the previous one by a pair of comma and
/// space. The
/// `getResponseHeader()` method returns the value as a UTF byte sequence.
///
/// > [!NOTE]
/// > The search for the header name is case-insensitive.
///
/// If you need to get the raw string of all of the headers, use the
/// [XMLHttpRequest.getAllResponseHeaders] method,
/// which returns the entire raw header string.
external String? getResponseHeader(String name);
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The [XMLHttpRequest] method
/// **`getAllResponseHeaders()`** returns all the response
/// headers, separated by , as a string, or returns `null`
/// if no response has been received.
///
/// If a network error happened, an empty string
/// is returned.
///
/// > [!NOTE]
/// > For multipart requests, this returns the headers from the
/// > _current_ part of the request, not from the original channel.
external String getAllResponseHeaders();
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The [XMLHttpRequest] method
/// **`overrideMimeType()`** specifies a MIME type other than the
/// one provided by the server to be used instead when interpreting the data
/// being
/// transferred in a request.
///
/// This may be used, for example, to force a stream to
/// be treated and parsed as `"text/xml"`, even if the server does not report
/// it
/// as such. This method must be called before calling [XMLHttpRequest.send].
external void overrideMimeType(String mime);
external EventHandler get onreadystatechange;
external set onreadystatechange(EventHandler value);
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The **XMLHttpRequest.readyState** property returns the state an
/// XMLHttpRequest client is in. An XHR client exists in one of the following
/// states:
///
/// | Value | State | Description |
/// | ----- | ------------------ | --------------------------------------------------------------- |
/// | `0` | `UNSENT` | Client has been created. `open()` not called yet. |
/// | `1` | `OPENED` | `open()` has been called. |
/// | `2` | `HEADERS_RECEIVED` | `send()` has been called, and headers and status are available. |
/// | `3` | `LOADING` | Downloading; `responseText` holds partial data. |
/// | `4` | `DONE` | The operation is complete. |
///
/// - UNSENT
/// - : The XMLHttpRequest client has been created, but the open() method hasn't been called yet.
/// - OPENED
/// - : open() method has been invoked. During this state, the request headers can be set using the [setRequestHeader()](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/setRequestHeader) method and the [send()](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/send) method can be called which will initiate the fetch.
/// - HEADERS_RECEIVED
/// - : send() has been called, all redirects (if any) have been followed and the response headers have been received.
/// - LOADING
/// - : Response's body is being received. If [`responseType`](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseType) is "text" or empty string, [`responseText`](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseText) will have the partial text response as it loads.
/// - DONE
/// - : The fetch operation is complete. This could mean that either the data transfer has been completed successfully or failed.
external int get readyState;
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The **`XMLHttpRequest.timeout`** property is an `unsigned long`
/// representing the number of milliseconds a request can take before
/// automatically being terminated. The default value is 0, which means there
/// is no timeout. Timeout shouldn't be used for synchronous XMLHttpRequests
/// requests used in a or it will throw an `InvalidAccessError` exception.
/// When a timeout happens, a
/// [timeout](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/timeout_event)
/// event is fired.
///
/// > [!NOTE]
/// > You may not use a timeout for synchronous requests with an owning
/// > window.
///
/// [Using a timeout with an asynchronous request](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest_API/Synchronous_and_Asynchronous_Requests#example_using_a_timeout).
external int get timeout;
external set timeout(int value);
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The **`XMLHttpRequest.withCredentials`** property is a boolean value that
/// indicates whether or not cross-site `Access-Control` requests should be
/// made using credentials such as cookies, authentication headers or TLS
/// client certificates. Setting `withCredentials` has no effect on
/// same-origin requests.
///
/// In addition, this flag is also used to indicate when cookies are to be
/// ignored in the response. The default is `false`. `XMLHttpRequest`
/// responses from a different domain cannot set cookie values for their own
/// domain unless `withCredentials` is set to `true` before making the
/// request. The
/// [third-party cookies](https://developer.mozilla.org/en-US/docs/Web/Privacy/Guides/Third-party_cookies)
/// obtained by setting `withCredentials` to `true` will still honor
/// same-origin policy and hence can not be accessed by the requesting script
/// through
/// [document.cookie](https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie)
/// or from response headers.
///
/// > [!NOTE]
/// > This never affects same-origin requests.
///
/// > **Note:** `XMLHttpRequest` responses from a different domain _cannot_
/// > set cookie values for their own domain unless `withCredentials` is set
/// > to `true` before making the request, regardless of `Access-Control-`
/// > header values.
external bool get withCredentials;
external set withCredentials(bool value);
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The [XMLHttpRequest] `upload` property returns an [XMLHttpRequestUpload]
/// object that can be observed to monitor an upload's progress.
///
/// It is an opaque object, but because it's also an
/// [XMLHttpRequestEventTarget], event listeners can be attached to track its
/// process.
///
/// > [!NOTE]
/// > Attaching event listeners to this object prevents the request from being
/// > a "simple request" and will cause a preflight request to be issued if
/// > cross-origin; see
/// > [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). Because
/// > of this, event listeners need to be registered before calling
/// > [XMLHttpRequest.send] or upload events won't be dispatched.
///
/// > [!NOTE]
/// > The spec also seems to indicate that event listeners should be attached
/// > after [XMLHttpRequest.open]. However, browsers are buggy on this matter,
/// > and often need the listeners to be registered _before_
/// > [XMLHttpRequest.open] to work.
///
/// The following events can be triggered on an upload object and used to
/// monitor the upload:
///
/// <table class="no-markdown">
/// <thead>
/// <tr>
/// <th>Event</th>
/// <th>Description</th>
/// </tr>
/// </thead>
/// <tbody>
/// <tr>
/// <td>[XMLHttpRequestUpload.loadstart_event]</td>
/// <td>The upload has begun.</td>
/// </tr>
/// <tr>
/// <td>[XMLHttpRequestUpload.progress_event]</td>
/// <td>
/// Periodically delivered to indicate the amount of progress made so far.
/// </td>
/// </tr>
/// <tr>
/// <td>[XMLHttpRequestUpload.abort_event]</td>
/// <td>The upload operation was aborted.</td>
/// </tr>
/// <tr>
/// <td>[XMLHttpRequestUpload.error_event]</td>
/// <td>The upload failed due to an error.</td>
/// </tr>
/// <tr>
/// <td>[XMLHttpRequestUpload.load_event]</td>
/// <td>The upload completed successfully.</td>
/// </tr>
/// <tr>
/// <td>[XMLHttpRequestUpload.timeout_event]</td>
/// <td>
/// The upload timed out because a reply did not arrive within the time
/// interval specified by the
/// [XMLHttpRequest.timeout].
/// </td>
/// </tr>
/// <tr>
/// <td>[XMLHttpRequestUpload.loadend_event]</td>
/// <td>
/// The upload finished. This event does not differentiate between success
/// or failure, and is sent at the end of the upload regardless of the
/// outcome. Prior to this event, one of <code>load</code>,
/// <code>error</code>, <code>abort</code>, or <code>timeout</code> will
/// already have been delivered to indicate why the upload ended.
/// </td>
/// </tr>
/// </tbody>
/// </table>
external XMLHttpRequestUpload get upload;
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The read-only **`XMLHttpRequest.responseURL`** property returns the
/// serialized URL of the response or the empty string if the URL is `null`.
/// If the URL is returned, any URL fragment present in the URL will be
/// stripped away. The value of `responseURL` will be the final URL obtained
/// after any redirects.
external String get responseURL;
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The read-only **`XMLHttpRequest.status`** property returns the numerical
/// HTTP
/// [status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status) of
/// the `XMLHttpRequest`'s response.
///
/// Before the request completes, the value of `status` is 0. Browsers also
/// report a status of 0 in case of `XMLHttpRequest` errors.
external int get status;
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The read-only **`XMLHttpRequest.statusText`** property returns a string
/// containing the response's status message as returned by the HTTP server.
/// Unlike
/// [`XMLHTTPRequest.status`](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/status)
/// which indicates a numerical status code, this property contains the _text_
/// of the response status, such as "OK" or "Not Found". If the request's
/// [`readyState`](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState)
/// is in `UNSENT` or `OPENED` state, the value of `statusText` will be an
/// empty string.
///
/// If the server response doesn't explicitly specify a status text,
/// `statusText` will assume the default value "OK".
///
/// > [!NOTE]
/// > Responses over an HTTP/2 connection will always have an empty string as
/// > status message as HTTP/2 does not support them.
external String get statusText;
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The [XMLHttpRequest] property
/// **`responseType`** is an enumerated string value specifying
/// the type of data contained in the response.
///
/// It also lets the author change the
/// response type. If an empty string is set as the value of `responseType`,
/// the
/// default value of `text` is used.
external XMLHttpRequestResponseType get responseType;
external set responseType(XMLHttpRequestResponseType value);
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The [XMLHttpRequest]
/// **`response`** property returns the response's body content as
/// an `ArrayBuffer`, a [Blob], a [Document],
/// a JavaScript `Object`, or a string, depending on the value
/// of the request's [XMLHttpRequest.responseType]
/// property.
external JSAny? get response;
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The read-only [XMLHttpRequest] property
/// **`responseText`** returns the text received from a server
/// following a request being sent.
external String get responseText;
/// @AvailableInWorkers("window_and_worker_except_service")
///
/// The **`XMLHttpRequest.responseXML`** read-only property returns
/// a [Document] containing the HTML or XML retrieved by the request; or
/// `null` if the request was unsuccessful, has not yet been sent, or if the
/// data
/// can't be parsed as XML or HTML.
///
/// > [!NOTE]
/// > The name `responseXML` is an artifact of this
/// > property's history; it works for both HTML and XML.
///
/// Usually, the response is parsed as `"text/xml"`. If the
/// [XMLHttpRequest.responseType] is set to
/// `"document"` and the request was made asynchronously, instead the response
/// is
/// parsed as `"text/html"`. `responseXML` is `null` for
/// any other types of data, as well as for [`data:`
/// URLs](https://developer.mozilla.org/en-US/docs/Web/URI/Reference/Schemes/data).
///
/// If the server doesn't specify the as
/// `"text/xml"` or `"application/xml"`, you can use
/// [XMLHttpRequest.overrideMimeType] to parse it as XML anyway.
///
/// This property isn't available to workers.
external Document? get responseXML;
}
/// The **`FormData`** interface provides a way to construct a set of key/value
/// pairs representing form fields and their values, which can be sent using the
/// [Window.fetch], [XMLHttpRequest.send] or [navigator.sendBeacon] methods. It
/// uses the same format a form would use if the encoding type were set to
/// `"multipart/form-data"`.
///
/// You can also pass it directly to the [URLSearchParams] constructor if you
/// want to generate query parameters in the way a `form` would do if it were
/// using simple `GET` submission.
///
/// An object implementing `FormData` can directly be used in a `for...of`
/// structure, instead of [FormData.entries]: `for (const p of myFormData)` is
/// equivalent to `for (const p of myFormData.entries())`.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/FormData).
extension type FormData._(JSObject _) implements JSObject {
external factory FormData([
HTMLFormElement form,
HTMLElement? submitter,
]);
/// The **`append()`** method of the [FormData] interface appends a new value
/// onto an existing key inside a `FormData` object, or adds the key if it
/// does not already exist.
///
/// The difference between [FormData.set] and `append()` is that if the
/// specified key already exists, `set()` will overwrite all existing values
/// with the new one, whereas `append()` will append the new value onto the
/// end of the existing set of values.
external void append(
String name,
JSAny blobValueOrValue, [
String filename,
]);
/// The **`delete()`** method of the [FormData] interface deletes a key and
/// its value(s) from a `FormData` object.
external void delete(String name);
/// The **`get()`** method of the [FormData] interface
/// returns the first value associated with a given key from within a
/// `FormData`
/// object. If you expect multiple values and want all of them, use the
/// [FormData.getAll] method instead.
external FormDataEntryValue? get(String name);
/// The **`getAll()`** method of the [FormData] interface returns all the
/// values associated with a given key from within a `FormData` object.
external JSArray<FormDataEntryValue> getAll(String name);
/// The **`has()`** method of the [FormData] interface returns whether a
/// `FormData` object contains a certain key.
external bool has(String name);
/// The **`set()`** method of the [FormData] interface sets a new value for an
/// existing key inside a `FormData` object, or adds the key/value if it does
/// not already exist.
///
/// The difference between `set()` and [FormData.append] is that if the
/// specified key does already exist, `set()` will overwrite all existing
/// values with the new one, whereas `append()` will append the new value onto
/// the end of the existing set of values.
external void set(
String name,
JSAny blobValueOrValue, [
String filename,
]);
}
/// The **`ProgressEvent`** interface represents events measuring progress of an
/// underlying process, like an HTTP request (for an `XMLHttpRequest`, or the
/// loading of the underlying resource of an `img`, `audio`, `video`, `style` or
/// `link`).
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/ProgressEvent).
extension type ProgressEvent._(JSObject _) implements Event, JSObject {
external factory ProgressEvent(
String type, [
ProgressEventInit eventInitDict,
]);
/// The
/// **`ProgressEvent.lengthComputable`** read-only property is a
/// boolean flag indicating if the resource concerned by the
/// [ProgressEvent] has a length that can be calculated. If not, the
/// [ProgressEvent.total] property has no significant value.
external bool get lengthComputable;
/// The **`ProgressEvent.loaded`** read-only property is a 64-bit unsigned
/// integer
/// indicating the size, in bytes, of the data already transmitted or
/// processed. The ratio can be calculated by dividing the value of this
/// property by `ProgressEvent.total`.
/// When downloading a resource using HTTP, this only counts the body of the
/// HTTP message, and doesn't include headers and other overhead.
///
/// Note that for compressed requests of unknown total size, `loaded` might
/// contain the size of the compressed, or decompressed, data, depending on
/// the browser. As of 2024, it contains the size of the compressed data in
/// Firefox, and the size of the uncompressed data in Chrome.
external int get loaded;
/// The **`ProgressEvent.total`** read-only property is a 64-bit unsigned
/// integer
/// indicating the total size, in bytes, of the data being transmitted or
/// processed.
///
/// When downloading a resource using HTTP, this value is taken from the
/// `Content-Length` response header. It only counts the body of the HTTP
/// message, and doesn't include headers and other overhead.
///
/// If the event's [ProgressEvent.lengthComputable]
/// property is `false`, this value is meaningless and should be ignored.
external int get total;
}
extension type ProgressEventInit._(JSObject _) implements EventInit, JSObject {
external factory ProgressEventInit({
bool bubbles,
bool cancelable,
bool composed,
bool lengthComputable,
int loaded,
int total,
});
external bool get lengthComputable;
external set lengthComputable(bool value);
external int get loaded;
external set loaded(int value);
external int get total;
external set total(int value);
}