// 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, RaisesException] void addIceCandidate(RTCIceCandidate candidate);
  [DartSuppress] Promise<void> getStats(RTCStatsCallback successCallback, optional MediaStreamTrack? selector);
  [DartSuppress] Promise<void> setLocalDescription(RTCSessionDescriptionInit description);
  [DartSuppress] Promise<void> setRemoteDescription(RTCSessionDescriptionInit description);
};

// 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 MediaDevices {
  [DartSuppress] Promise<MediaStream> getUserMedia(optional MediaStreamConstraints constraints);
};

[DartSupplemental]
interface Navigator {
  [DartSuppress] void getUserMedia(MediaStreamConstraints constraints,
                                   NavigatorUserMediaSuccessCallback successCallback,
                                   NavigatorUserMediaErrorCallback errorCallback);
};

[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);
};

[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);

};

[DartSupplemental]
interface Performance {
    [DartSuppress] void webkitClearResourceTimings();
    [DartSuppress] void webkitSetResourceTimingBufferSize(unsigned long maxSize);
    [DartSuppress] attribute EventHandler onwebkitresourcetimingbufferfull;
};

[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 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);
};
