// This file introduces / supplements and forces Dart declarations.

[DartSupplemental]
interface WaveShaperNode {
  // TODO(ager): Auto-generate this custom method when the info about retaining
  // typed arrays is in the IDL.
  [Custom=Setter] attribute Float32Array? curve;
};

[DartSupplemental]
interface AudioParam {
  // TODO(ager): Auto-generate this custom method when the info about retaining
  // typed arrays is in the IDL.
  [Custom] void setValueCurveAtTime(Float32Array values, double time, double duration);
};

[DartSupplemental]
interface Document {
  [Custom] Element createElement(DOMString tagName);
  [Custom] Element createElement(DOMString localName, DOMString typeExtension);
  [Custom] Element createElementNS(DOMString namespaceURI, DOMString qualifiedName);
  [Custom] Element createElementNS(DOMString namespaceURI, DOMString qualifiedName, DOMString typeExtension);
  [DartName=registerElement2] CustomElementConstructor registerElement(DOMString type, optional ElementRegistrationOptions options);
  [DartSuppress] readonly attribute (HTMLScriptElement or SVGScriptElement)? currentScript;
  readonly attribute HTMLScriptElement? currentScript;
};

[DartSupplemental]
interface Node {
  [Custom] Node cloneNode([Default=Undefined] optional boolean deep);
  [DartSuppress] readonly attribute Element nextElementSibling;
  [DartSuppress] readonly attribute Element previousElementSibling;
};

[DartSupplemental]
interface ScriptProcessorNode {
  [DartSuppress] attribute EventListener onaudioprocess;
  [Custom] void _setEventListener(EventListener eventListener);
};

[DartSupplemental]
interface Element {
  readonly attribute Element? nextElementSibling;
  readonly attribute Element? previousElementSibling;
};

[DartSupplemental]
interface CharacterData {
  readonly attribute Element? nextElementSibling;
  readonly attribute Element? previousElementSibling;
};

[Callback]
interface TimeoutHandler {
  void handleEvent();
};

[Callback]
interface RequestAnimationFrameCallback{
    void handleEvent(double highResTime);
};

// FIXME(leafp): This is a temporary hack to get things running while
// we are still generating _blink from the dart side idl files.
// Once we are up and running generating dart:_blink in dartium
// this should go away.
[DartSupplemental]
interface URL {
  [DartSuppress] static DOMString createObjectURL(WebKitMediaSource source);
};

[DartSupplemental]
interface CanvasRenderingContext2D {
  [DartName=createImageDataFromImageData] ImageData createImageData(ImageData imagedata);

  // Removed in 1916.
  [DartSuppress] void drawSystemFocusRing(Element element);

  [DartSuppress] void assert(boolean condition);

  [DartSuppress] attribute boolean webkitImageSmoothingEnabled;

  // Removed in 1985.
  [DartSuppress] readonly attribute float webkitBackingStorePixelRatio;
};

interface HTMLCanvasElement {
  [DartSuppress] DOMString toDataURL([TreatNullAs=NullString, Default=Undefined] DOMString type);
  [Custom] DOMString toDataURL([TreatNullAs=NullString, Default=Undefined] DOMString type, optional float quality);
};

[DartSupplemental]
interface HTMLOptionsCollection {
  [DartSuppress] void add(optional HTMLOptionElement element, optional long before);
  [DartSuppress] void remove(HTMLOptionElement option); // Non standard.
};

[DartSupplemental]
interface HTMLSelectElement {
  [DartSuppress] void add([Default=Undefined] HTMLElement element, [Default=Undefined] HTMLElement before);
  [DartSuppress, Custom] void remove();
  [DartSuppress] void remove(long index);
  [DartSuppress] void remove(HTMLOptionElement option); // Non standard.
};

[DartSupplemental]
interface HTMLMediaElement {
  // Adding media events.
  attribute EventListener oncanplay;
  attribute EventListener oncanplaythrough;
  attribute EventListener ondurationchange;
  attribute EventListener onemptied;
  attribute EventListener onended;
  attribute EventListener onloadeddata;
  attribute EventListener onloadedmetadata;
  attribute EventListener onloadstart;
  attribute EventListener onpause;
  attribute EventListener onplay;
  attribute EventListener onplaying;
  attribute EventListener onprogress;
  attribute EventListener onratechange;
  attribute EventListener onseeked;
  attribute EventListener onseeking;
  attribute EventListener onshow;
  attribute EventListener onstalled;
  attribute EventListener onsuspend;
  attribute EventListener ontimeupdate;
  attribute EventListener onvolumechange;
  attribute EventListener onwaiting;
  attribute EventListener onwheel;
};

[DartSupplemental]
interface RTCPeerConnection {
  [DartSuppress] Promise<void> createOffer(RTCSessionDescriptionCallback successCallback, RTCPeerConnectionErrorCallback failureCallback, optional Dictionary rtcOfferOptions);
  [DartSuppress] Promise<void> createAnswer(RTCSessionDescriptionCallback successCallback, RTCPeerConnectionErrorCallback failureCallback, optional Dictionary mediaConstraints);
  [DartSuppress] void addIceCandidate(RTCIceCandidate candidate);
  [DartSuppress] Promise<void> getStats(RTCStatsCallback successCallback, optional MediaStreamTrack? selector);
  [DartSuppress] Promise<void> setLocalDescription(RTCSessionDescriptionInit description, VoidCallback successCallback, [Default=Undefined] optional RTCPeerConnectionErrorCallback failureCallback);
  [DartSuppress] Promise<void> setRemoteDescription(RTCSessionDescriptionInit description, VoidCallback successCallback, [Default=Undefined] optional RTCPeerConnectionErrorCallback failureCallback);
};

// See implementation in tools/dom/templates for canvas and offscreenCanvas.
interface WebGLCanvas {
};

[DartSupplemental]
interface WebGL2RenderingContext {
    [DartSuppress] readonly attribute (HTMLCanvasElement or OffscreenCanvas) canvas;
    readonly attribute WebGLCanvas canvas;
};

[DartSupplemental]
interface WebGLRenderingContext {
    [DartSuppress] readonly attribute (HTMLCanvasElement or OffscreenCanvas) canvas;
    readonly attribute HTMLCanvasElement canvas;
};

[DartSupplemental]
interface WebGL2RenderingContextBase {
    [DartSuppress] readonly attribute (HTMLCanvasElement or OffscreenCanvas) canvas;
    readonly attribute WebGLCanvas canvas;
    [DartName=bufferData2] void bufferData(GLenum target, [AllowShared] ArrayBufferView srcData, GLenum usage, GLuint srcOffset, optional GLuint length = 0);
    [DartName=bufferSubData2] void bufferSubData(GLenum target, GLintptr dstByteOffset, [AllowShared] ArrayBufferView srcData, GLuint srcOffset, optional GLuint length = 0);
    [DartName=compressedTexImage2D2] void compressedTexImage2D(GLenum target, GLint level, GLenum internalformat,
                              GLsizei width, GLsizei height, GLint border,
                              [AllowShared] ArrayBufferView data, GLuint srcOffset,
                              optional GLuint srcLengthOverride = 0);
    [DartName=compressedTexImage2D3] void compressedTexImage2D(GLenum target, GLint level, GLenum internalformat,
                              GLsizei width, GLsizei height, GLint border,
                              GLsizei imageSize, GLintptr offset);
    [DartName=compressedTexSubImage2D2] void compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
                                 GLsizei width, GLsizei height, GLenum format,
                                 [AllowShared] ArrayBufferView data, GLuint srcOffset,
                                 optional GLuint srcLengthOverride = 0);
    [DartName=compressedTexSubImage2D3] void compressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,
                                 GLsizei width, GLsizei height, GLenum format,
                                 GLsizei imageSize, GLintptr offset);
    [DartName=compressedTexImage3D2] void compressedTexImage3D(GLenum target, GLint level, GLenum internalformat,
                              GLsizei width, GLsizei height, GLsizei depth, GLint border,
                              GLsizei imageSize, GLintptr offset);
    [DartName=compressedTexSubImage3D2] void compressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset,
                                 GLsizei width, GLsizei height, GLsizei depth, GLenum format,
                                 GLsizei imageSize, GLintptr offset);
    [DartName=readPixels2] void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, ArrayBufferView dstData, GLintptr offset);
    [DartName=readPixels2] void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLintptr offset);
    [DartName=texImage2D2] void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLintptr offset);
    [DartName=texImage2D2] void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, ImageData data);
    [DartName=texImage2D2] void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, HTMLImageElement image);
    [DartName=texImage2D2] void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, HTMLCanvasElement canvas);
    [DartName=texImage2D2] void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, HTMLVideoElement video);
    [DartName=texImage2D2] void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, ImageBitmap bitmap);
    [DartName=texImage2D2] void texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData, GLuint srcOffset);
    [DartName=texSubImage2D2] void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLintptr offset);
    [DartName=texSubImage2D2] void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, ImageData data);
    [DartName=texSubImage2D2] void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, HTMLImageElement image);
    [DartName=texSubImage2D2] void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, HTMLCanvasElement canvas);
    [DartName=texSubImage2D2] void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, HTMLVideoElement video);
    [DartName=texSubImage2D2] void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, ImageBitmap bitmap);
    [DartName=texSubImage2D2] void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData, GLuint srcOffset);
    [DartName=uniform1fv2] void uniform1fv(WebGLUniformLocation? location, [FlexibleArrayBufferView] Float32Array v,
                    GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniform1fv2] void uniform1fv(WebGLUniformLocation? location, sequence<GLfloat> v,
                    GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniform2fv2] void uniform2fv(WebGLUniformLocation? location, [FlexibleArrayBufferView] Float32Array v,
                    GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniform2fv2] void uniform2fv(WebGLUniformLocation? location, sequence<GLfloat> v,
                    GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniform3fv2] void uniform3fv(WebGLUniformLocation? location, [FlexibleArrayBufferView] Float32Array v,
                    GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniform3fv2] void uniform3fv(WebGLUniformLocation? location, sequence<GLfloat> v,
                    GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniform4fv2] void uniform4fv(WebGLUniformLocation? location, [FlexibleArrayBufferView] Float32Array v,
                    GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniform4fv2] void uniform4fv(WebGLUniformLocation? location, sequence<GLfloat> v,
                    GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniform1iv2] void uniform1iv(WebGLUniformLocation? location, [FlexibleArrayBufferView] Int32Array v,
                    GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniform1iv2] void uniform1iv(WebGLUniformLocation? location, sequence<GLint> v,
                    GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniform2iv2] void uniform2iv(WebGLUniformLocation? location, [FlexibleArrayBufferView] Int32Array v,
                    GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniform2iv2] void uniform2iv(WebGLUniformLocation? location, sequence<GLint> v,
                    GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniform3iv2] void uniform3iv(WebGLUniformLocation? location, [FlexibleArrayBufferView] Int32Array v,
                    GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniform3iv2] void uniform3iv(WebGLUniformLocation? location, sequence<GLint> v,
                    GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniform4iv2] void uniform4iv(WebGLUniformLocation? location, [FlexibleArrayBufferView] Int32Array v,
                    GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniform4iv2] void uniform4iv(WebGLUniformLocation? location, sequence<GLint> v,
                    GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniformMatrix2fv2] void uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, [AllowShared] Float32Array array,
                          GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniformMatrix2fv2] void uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, sequence<GLfloat> array,
                          GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniformMatrix3fv2] void uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, [AllowShared] Float32Array array,
                          GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniformMatrix3fv2] void uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, sequence<GLfloat> array,
                          GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniformMatrix4fv2] void uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, [AllowShared] Float32Array array,
                          GLuint srcOffset, optional GLuint srcLength = 0);
    [DartName=uniformMatrix4fv2] void uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, sequence<GLfloat> array,
                          GLuint srcOffset, optional GLuint srcLength = 0);
};

[DartSupplemental]
interface WebGLContextEvent {
  [DartSuppress] void initEvent(optional DOMString eventTypeArg,
                              optional boolean canBubbleArg,
                              optional boolean cancelableArg,
                              optional DOMString statusMessageArg);
};

// TODO(vsm): Define new names for these (see b/4436830).
[DartSupplemental]
interface IDBCursor {
  [DartName=next, CallWith=ExecutionContext, ImplementedAs=continueFunction, RaisesException] void continue([DartForceOptional] optional any key);
};

[DartSupplemental]
interface IDBIndex {
    [CallWith=ExecutionContext, RaisesException] IDBRequest count([Default=Undefined] optional any key);
};

[DartSupplemental]
interface HTMLMediaElement {
  DOMString canPlayType([Default=Undefined] optional DOMString type, [Default=Undefined, TreatNullAs=NullString, DartForceOptional] optional DOMString keySystem);
};

[DartSupplemental]
interface IDBKeyRange {
  [DartName=only_] static IDBKeyRange only(any value);
  [DartName=lowerBound_] static IDBKeyRange lowerBound(any bound, [DartForceOptional] optional boolean open);
  [DartName=upperBound_] static IDBKeyRange upperBound(any bound, [DartForceOptional] optional boolean open);
  [DartName=bound_] static IDBKeyRange bound(any lower, any upper, [DartForceOptional] optional boolean lowerOpen, [DartForceOptional] optional boolean upperOpen);
};

[DartSupplemental]
interface IDBObjectStore {
    [CallWith=ScriptState, RaisesException] IDBRequest put(any value, [DartForceOptional] optional any key);
    [CallWith=ScriptState, RaisesException] IDBRequest add(any value, [DartForceOptional] optional any key);
};

interface EntrySync {
  // Native implementation is declared to return EntrySync.
  [DartSuppress] DirectoryEntrySync getParent();
  EntrySync getParent();
};

// Need to add for Blob which are really File that extends a Blob when called
// via file() method on FileEntry
callback interface FileCallback {
    void handleEvent(File? file);
};

[DartSupplemental]
interface FileEntry {
    [DartSuppress] void file(BlobCallback successCallback, optional ErrorCallback errorCallback);
    void file(FileCallback successCallback, optional ErrorCallback errorCallback);
};

[DartSupplemental,
  CustomConstructor,
  Constructor(Array blobParts, optional DOMString type, optional DOMString endings)
  ]
interface Blob {
};

[DartSupplemental, Callback] // Add missing Callback attribute.
interface VoidCallback {
};

interface SVGNumber {
  [DartStrictTypeChecking, Custom] attribute float value;
};

[DartSupplemental]
interface Navigator {
  [DartSuppress] void getUserMedia(MediaStreamConstraints constraints,
                                   NavigatorUserMediaSuccessCallback successCallback,
                                   NavigatorUserMediaErrorCallback errorCallback);
  // Marked as nullable to address browser compatibility. See 41905.
  [DartSuppress, MeasureAs=NavigatorDeviceMemory,RuntimeEnabled=NavigatorDeviceMemory,SecureContext]
  readonly attribute float deviceMemory;
  [MeasureAs=NavigatorDeviceMemory,RuntimeEnabled=NavigatorDeviceMemory,SecureContext]
  readonly attribute float? deviceMemory;
  // Defined as part of NavigatorNetworkInformation. Marked as nullable to
  // address browser compatibility. See 41905.
  [DartSuppress, MeasureAs=NetInfo] readonly attribute NetworkInformation connection;
  [MeasureAs=NetInfo] readonly attribute NetworkInformation? connection;
};

[DartSupplemental,
  CustomConstructor,
  // Provide missing constructor signature.
  Constructor(optional HTMLFormElement form)]
interface FormData {
  [DartSuppress] void append(DOMString name, DOMString value, DOMString filename);
  [Custom] void append(DOMString name, DOMString value);
  [Custom] void append(DOMString name, Blob value, optional DOMString filename);
};

[DartSupplemental, Constructor]
interface XMLHttpRequest {
   [Custom] void send();
   [Custom] void send(ArrayBuffer data); // FIXME: this should be eventually deprecated.
   [Custom] void send(ArrayBufferView data);
   [Custom] void send(Blob data);
   [Custom] void send(Document data);
   [Custom] void send([DartStrictTypeChecking] DOMString data);
   [Custom] void send(FormData data);
};

[DartSuppress]
interface AbstractView {};

[DartSuppress]
interface JavaScriptCallFrame {};

[DartSupplemental]
interface Location {
  [DartSuppress] attribute URLString href;
  [Custom=Setter] attribute DOMString href;
  [Custom=Setter] attribute TrustedURL trustedHref;

  [Custom] void assign(optional DOMString url);
  [Custom] void replace([Default=Undefined] optional DOMString url);
  [Custom] void reload();

  // URI decomposition attributes
  [Custom=Setter] attribute DOMString protocol;
  [Custom=Setter] attribute DOMString host;
  [Custom=Setter] attribute DOMString hostname;
  [Custom=Setter] attribute DOMString port;
  [Custom=Setter] attribute DOMString pathname;
  [Custom=Setter] attribute DOMString search;
  [Custom=Setter] attribute DOMString hash;
};

// TODO(jacobr): reenable these new Blink features.
[DartSuppress]
interface ImageBitmapFactories {};

[DartSupplemental]
interface ImageData {
    [DartSuppress] ImageDataColorSettings getColorSettings();
    // Below needs 'any' because ImageDataArray is union of (Uint8ClampedArray
    // or Uint16Array or Float32Array)
    [DartSuppress] readonly attribute any dataUnion;
};

[DartSupplemental,
  CustomConstructor,
  Constructor()
]
interface MessageChannel {
};

// See https://chromiumcodereview.appspot.com/15901002 for the V8 implementation of
// TextEncoder/TextDecoder
[DartSuppress]
interface TextEncoder {};

[DartSuppress]
interface TextDecoder {};

[DartSupplemental]
interface Window : EventTarget {
  [DartSuppress] void alert();
  [DartSuppress] void alert(DOMString message);
  void alert(optional DOMString message);

  [DartSuppress] void scrollBy(long x, long y);
  [DartSuppress] void scrollBy(long x, long y, Dictionary scrollOptions);
  [RaisesException] void scrollBy(long x, long y, optional Dictionary scrollOptions);

  [DartSuppress] void scrollTo(long x, long y);
  [DartSuppress] void scrollTo(long x, long y, Dictionary scrollOptions);
  [RaisesException] void scrollTo(long x, long y, optional Dictionary scrollOptions);

  [DartSuppress] void scroll(long x, long y);
  [DartSuppress] void scroll(long x, long y, Dictionary scrollOptions);
  [RaisesException] void scroll(long x, long y, optional Dictionary scrollOptions);

  [RuntimeEnabled=VisualViewportAPI, Replaceable, SameObject, DartSuppress] readonly attribute VisualViewport visualViewport;
  [RuntimeEnabled=VisualViewportAPI, Replaceable, SameObject] readonly attribute VisualViewport? visualViewport;
};

[DartSupplemental]
interface CanvasRenderingContext2D {
    [DartSuppress] void webkitPutImageDataHD(ImageData? imagedata, float dx, float dy);
    [DartSuppress] void webkitPutImageDataHD(ImageData? imagedata, float dx, float dy, float dirtyX, float dirtyY, float dirtyWidth, float dirtyHeight);
    [DartSuppress] ImageData webkitGetImageDataHD(float sx, float sy, float sw, float sh);
};

[DartSupplemental]
interface AudioParam {
    [DartSuppress] void setTargetValueAtTime(float target, double time, double timeConstant);
    void setTargetAtTime(float target, double time, double timeConstant);
};

[DartSupplemental]
interface AudioContext {
    // Number of AudioBufferSourceNodes that are currently playing.
    [DartSuppress] readonly attribute unsigned long activeSourceCount;
    [DartSuppress] ScriptProcessorNode createJavaScriptNode(unsigned long bufferSize, optional unsigned long numberOfInputChannels, optional unsigned long numberOfOutputChannels);
    [DartSuppress] AudioBuffer createBuffer(ArrayBuffer? buffer, boolean mixToMono);
    [DartSuppress] GainNode createGainNode();
    [DartSuppress] DelayNode createDelayNode(optional double maxDelayTime);
};

[DartSupplemental]
interface HTMLInputElement {
    [DartSuppress] attribute boolean webkitSpeech;
    [DartSuppress] attribute boolean webkitGrammar;
};

[DartSupplemental]
interface ShadowRoot {
    [DartSuppress] attribute boolean applyAuthorStyles;
};

[DartSupplemental]
interface BeforeLoadEvent {
    [DartSuppress] readonly attribute DOMString url;
};

[DartSupplemental]
interface OscillatorNode {
    [DartSuppress] readonly attribute unsigned short playbackState;
};

[DartSupplemental]
interface SVGElementInstance {
    [DartSuppress] readonly attribute SVGElementInstanceList childNodes;
};

[DartSupplemental]
interface DOMImplementation {
    [DartSuppress] CSSStyleSheet createCSSStyleSheet([Default=Undefined] optional DOMString title,
                                      [Default=Undefined] optional DOMString media);
    [DartSuppress] Document createHTMLDocument(optional DOMString title);
    HTMLDocument createHTMLDocument(optional DOMString title);
};

[DartSupplemental]
interface DOMRect {
    [DartSuppress] static DOMRect fromRect(optional DOMRectInit other);
};

[DartSupplemental]
interface SVGSVGElement {
    [DartSuppress] attribute DOMString contentStyleType;
    [DartSuppress] attribute DOMString contentScriptType;
};

[DartSupplemental]
interface AudioBuffer {
    [DartSuppress] attribute float gain;
};

[DartSupplemental]
interface WorkerCrypto {
    [DartSuppress] ArrayBufferView getRandomValues(ArrayBufferView array);
};

[DartSupplemental]
interface HTMLFormElement {
    void requestAutocomplete([Default=Undefined] optional Dictionary details);
    [DartSuppress] void requestAutocomplete();
};

[DartSupplemental]
interface AudioBufferSourceNode {
    [DartSuppress] readonly attribute unsigned short playbackState;
};

[DartSupplemental]
interface AudioScheduledSourceNode {
    [DartName=start2] void start(optional double when);
};

// Remove operation requestFullscreen only use webKitRequestFullscreen.
[DartSupplemental]
interface Element : Node {
    [DartSuppress] void requestFullscreen();
};

[DartSupplemental]
interface CSS {
  [DartName=inch] static CSSUnitValue in(double value);
};

[DartSupplemental]
interface CSSStyleDeclaration {
    // Expose __propertyQuery__  a getter with a special operation in the IDL
    // when used with Custom=PropertyQuery will emit __propertyQuery__.
    [Custom=PropertyQuery] getter boolean (DOMString name);
};

[DartSupplemental]
interface MIDIOutput : MIDIPort {
    // TODO(terry): Need to support both send operations where the first param
    //              is Uint8Array or sequence<unsigned long>.  For now suppress
    //              the new operation. Vijay suggestion, and I think this makes
    //              sense, change dart:html to have a send operation that takes
    //              a List<int> and have custom handler to call the correct
    //              method.  The dart:blink library needs to do something else
    //              postfix the name with send_sequence (?).
    [DartSuppress] void send(sequence<unsigned long> data, optional double timestamp);
};

// Tweaks types required for Dart strong mode.
[DartSupplemental]
interface HTMLCollection {

    // FIXME: The index argument should not be optional.
    getter Node? item([Default=Undefined] optional unsigned long index);
    getter any namedItem(DOMString name);

    [DartSuppress] getter Element? item([Default=Undefined] optional unsigned long index);
    [DartSuppress] getter Element? namedItem(DOMString name);

};

// Make sure HTMLFormControlsCollection matches HTMLCollection.
[DartSupplemental]
interface HTMLFormControlsCollection : HTMLCollection  {

    // FIXME: The index argument should not be optional.
    getter Node? item([Default=Undefined] optional unsigned long index);

    [DartSuppress, ImplementedAs=item] getter Node (unsigned long index);

};

[DartSupplemental]
interface Performance {
    [DartSuppress] void webkitClearResourceTimings();
    [DartSuppress] void webkitSetResourceTimingBufferSize(unsigned long maxSize);
    [DartSuppress] attribute EventHandler onwebkitresourcetimingbufferfull;
    // Marked as nullable to address browser compatibility. See 41905.
    [DartSuppress, Measure] readonly attribute MemoryInfo memory;
    [Measure] readonly attribute MemoryInfo? memory;
};

[DartSupplemental]
interface CalcLength {
    [DartName=inch] readonly attribute double? in;
};

[DartSuppress]
interface DragEvent {};

[DartSuppress]
interface InputEvent {};

[DartSuppress]
interface Scale {};

Element implements GlobalEventHandlers;


// This only exists in Safari, and is deprecated there. But include it anyway
// because otherwise iterating CSSRules in Safari can yield unknown JS objects.
interface CSSCharsetRule : CSSRule {
    [MeasureAs=CSSCharsetRuleEncoding] attribute DOMString encoding;
};

[DartSupplemental]
interface Event {
  [DartSuppress] readonly attribute object path;
};

[DartSupplemental]
interface UIEvent : Event {

    // None of these are optional anymore.
    [DartSuppress] void initUIEvent([Default=Undefined] optional DOMString type,
                                    [Default=Undefined] optional boolean bubbles,
                                    [Default=Undefined] optional boolean cancelable,
                                    [Default=Undefined] optional Window? view,
                                    [Default=Undefined] optional long detail);

    void initUIEvent(DOMString type, boolean bubbles, boolean cancelable,
                     Window? view, long detail);

};

[DartSupplemental]
interface EventTarget {
    [DartSuppress] void addEventListener(DOMString type, EventListener? listener, optional (AddEventListenerOptions or boolean) options);
    [DartSuppress] void removeEventListener(DOMString type, EventListener? listener, optional (EventListenerOptions or boolean) options);
    [Custom] void addEventListener(DOMString type, EventListener? listener, optional boolean options);
    [Custom] void removeEventListener(DOMString type, EventListener? listener, optional boolean options);
};

[DartSupplemental]
interface NetworkInformation : EventTarget {
    // Marked as nullable to address browser compatibility. See 41905.
    [DartSuppress, RuntimeEnabled=NetInfoDownlink, MeasureAs=NetInfoDownlink] readonly attribute unrestricted double downlink;
    [RuntimeEnabled=NetInfoDownlink, MeasureAs=NetInfoDownlink] readonly attribute unrestricted double? downlink;
};

interface NoncedElement {
    // Marked as nullable to address browser compatibility. See 41905.
    [DartSuppress, CEReactions] attribute DOMString nonce;
    [CEReactions] attribute DOMString? nonce;
};

// PositionCallback can be used on a deprecated Position object,
// a GeolocationPosition object, or a Firefox-specific object.
callback PositionCallback = void(object position);
