// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// https://www.w3.org/TR/2014/WD-XMLHttpRequest-20140130/#xmlhttprequest

[
    Constructor,
    ConstructorCallWith=EnvironmentSettings,
    Exposed=(Window,Worker),
] interface XMLHttpRequest : XMLHttpRequestEventTarget {
    // event handler
    attribute EventHandler onreadystatechange;

    // states
    const unsigned short UNSENT = 0;
    const unsigned short OPENED = 1;
    const unsigned short HEADERS_RECEIVED = 2;
    const unsigned short LOADING = 3;
    const unsigned short DONE = 4;
    readonly attribute unsigned short readyState;

    // request
    [RaisesException] void open(DOMString method, DOMString url);
    [RaisesException] void open(DOMString method, DOMString url,
                                boolean async,
                                optional DOMString? username,
                                optional DOMString? password);
    [RaisesException] void setRequestHeader(DOMString header, DOMString value);
    attribute unsigned long timeout;
    [RaisesException=Setter] attribute boolean withCredentials;
    readonly attribute XMLHttpRequestUpload upload;
    // TODO: Upgrade to void send(optional (Document or BodyInit)? body = null);
    //       See https://xhr.spec.whatwg.org/#interface-xmlhttprequest.
    [RaisesException] void send(
        optional (DOMString or ArrayBufferView or ArrayBuffer)? requestBody);
    void abort();

    // FetchAPI: replacement for "send" when fetch functionality is needed.
    [RaisesException] void fetch(
        FetchUpdateCallback fetchCallback, FetchModeCallback modeCallback,
        (DOMString or ArrayBufferView or ArrayBuffer)? requestBody);

    // response
    readonly attribute unsigned short status;
    readonly attribute DOMString statusText;
    DOMString? getResponseHeader(DOMString header);
    DOMString getAllResponseHeaders();
    [RaisesException] void overrideMimeType(DOMString mimeType);
    [RaisesException=Setter] attribute DOMString responseType;
    // TODO: Use a union type for all the possible response types.
    [RaisesException] readonly attribute (DOMString or ArrayBuffer) response;
    [RaisesException] readonly attribute DOMString responseText;
    // TODO: responseXML should only be exposed to Window, not Worker
    [RaisesException] readonly attribute Document? responseXML;

    // Not part of the spec. Enable verbose XHR logging.
    static attribute boolean verbose;
};

// TODO: The IDL defines EventHandler as a nullable callback function. Define it
// as a nullable EventListener for now until we can do some refactoring to
// accept both in the EventTarget implementation.
typedef EventListener? EventHandler;

// FetchAPI: custom callback to allow progressive updates.
callback FetchUpdateCallback = void(Uint8Array data);
// FetchAPI: custom callback to distinguish between mode.
callback FetchModeCallback = void(boolean isCorsMode);
