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

[Supplemental,
 Constructor]
interface AudioContext {};

[Supplemental]
interface Document {
  [Suppressed] DOMObject getCSSCanvasContext(in DOMString contextId, in DOMString name, in long width, in long height);
  CanvasRenderingContext getCSSCanvasContext(in DOMString contextId, in DOMString name, in long width, in long height);
};

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

// Force ElementTraversal. WebKit defines these directly.
interface ElementTraversal {
  readonly attribute unsigned long childElementCount;
  readonly attribute Element firstElementChild;
  readonly attribute Element lastElementChild;
  readonly attribute Element nextElementSibling;
  readonly attribute Element previousElementSibling;
};
Element implements ElementTraversal;

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

[Supplemental]
interface CanvasRenderingContext2D {
  [DartName=createImageDataFromImageData] ImageData createImageData(in ImageData imagedata);
};

[Supplemental]
interface Console {
  [Suppressed] void assert(in boolean condition);
  [CallWith=ScriptArguments|ScriptState] void assertCondition(boolean condition);
};

interface HTMLCanvasElement {
  [Suppressed] DOMString toDataURL([TreatNullAs=NullString, TreatUndefinedAs=NullString,Optional=DefaultIsUndefined] in DOMString type);
  [Custom] DOMString toDataURL([TreatNullAs=NullString, TreatUndefinedAs=NullString,Optional=DefaultIsUndefined] in DOMString type, [Optional] in float quality);

  [Suppressed] any getContext(in DOMString contextId);
  [Custom] CanvasRenderingContext getContext(in DOMString contextId, [Optional] in Dictionary attrs);
};

[Supplemental]
interface HTMLOptionsCollection {
  [Suppressed] void add([Optional] in HTMLOptionElement element, [Optional] in long before);
};

[Supplemental]
interface HTMLSelectElement {
  [Suppressed] void add([Optional=DefaultIsUndefined] in HTMLElement element, [Optional=DefaultIsUndefined] in HTMLElement before);
  [Suppressed, Custom] void remove();
};

[Supplemental]
interface ImageData {
  [Custom] readonly attribute int[] data;
};

[Supplemental]
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;
};

[Supplemental]
interface WebGLContextEvent {
  [Suppressed] void initEvent([Optional] in DOMString eventTypeArg,
                              [Optional] in boolean canBubbleArg,
                              [Optional] in boolean cancelableArg,
                              [Optional] in DOMString statusMessageArg);
};

[Supplemental]
interface WebGLRenderingContext {

  //void         compressedTexImage2D(in unsigned long target, in long level, in unsigned long internalformat, in unsigned long width, in unsigned long height, in long border, in unsigned long imageSize, const void* data);
  //void         compressedTexSubImage2D(in unsigned long target, in long level, in long xoffset, in long yoffset, in unsigned long width, in unsigned long height, in unsigned long format, in unsigned long imageSize, const void* data);

  [Custom] any getBufferParameter(in unsigned long target, in unsigned long pname);
  [Suppressed, StrictTypeChecking, Custom] void getBufferParameter();

  [Custom] any getFramebufferAttachmentParameter(in unsigned long target, in unsigned long attachment, in unsigned long pname);
  [Suppressed, StrictTypeChecking, Custom] void getFramebufferAttachmentParameter();

  [Custom] any getParameter(in unsigned long pname);
  [Suppressed, StrictTypeChecking, Custom] void getParameter();

  [Custom] any getProgramParameter(in WebGLProgram program, in unsigned long pname);
  [Suppressed, StrictTypeChecking, Custom] void getProgramParameter();

  [Custom] any getRenderbufferParameter(in unsigned long target, in unsigned long pname);
  [Suppressed, StrictTypeChecking, Custom] void getRenderbufferParameter();

  [Custom] any getShaderParameter(in WebGLShader shader, in unsigned long pname);
  [Suppressed, StrictTypeChecking, Custom] void getShaderParameter();

  // TBD
  // void glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);

  [Custom] any getExtension(DOMString name);
  [Suppressed, StrictTypeChecking, Custom] void getExtension(DOMString name);
  [Custom] DOMString[] getSupportedExtensions();
  [Suppressed, StrictTypeChecking, Custom] void getSupportedExtensions();

  [Custom] any getTexParameter(in unsigned long target, in unsigned long pname);
  [Suppressed, StrictTypeChecking, Custom] void getTexParameter();

  [Custom] any getUniform(in WebGLProgram program, in WebGLUniformLocation location);
  [Suppressed, StrictTypeChecking, Custom] void getUniform();

  [Custom] any getVertexAttrib(in unsigned long index, in unsigned long pname);
  [Suppressed, StrictTypeChecking, Custom] void getVertexAttrib();
};
[Supplemental]
interface CSSStyleDeclaration {
  void setProperty(in DOMString propertyName, in DOMString value, [Optional] in DOMString priority);
  [DartName=_getPropertyValue] DOMString getPropertyValue(in DOMString propertyName);
};

[Supplemental,
  Constructor(in long length)]  // Add constructor signature.
interface ArrayBuffer {
};
[Supplemental]
interface Float32Array {
  [Suppressed] void set();
  [DartName=setElements, Custom] void set(in any array, [Optional] in unsigned long offset);
};
[Supplemental]
interface Float64Array {
  [Suppressed] void set();
  [DartName=setElements, Custom] void set(in any array, [Optional] in unsigned long offset);
};
[Supplemental]
interface Int16Array {
  [Suppressed] void set();
  [DartName=setElements, Custom] void set(in any array, [Optional] in unsigned long offset);
};
[Supplemental]
interface Int32Array {
  [Suppressed] void set();
  [DartName=setElements, Custom] void set(in any array, [Optional] in unsigned long offset);
};
[Supplemental]
interface Int8Array {
  [Suppressed] void set();
  [DartName=setElements, Custom] void set(in any array, [Optional] in unsigned long offset);
};
[Supplemental]
interface Uint16Array {
  [Suppressed] void set();
  [DartName=setElements, Custom] void set(in any array, [Optional] in unsigned long offset);
};
[Supplemental]
interface Uint32Array {
  [Suppressed] void set();
  [DartName=setElements, Custom] void set(in any array, [Optional] in unsigned long offset);
};
[Supplemental]
interface Uint8Array {
  [Suppressed] void set();
  [DartName=setElements, Custom] void set(in any array, [Optional] in unsigned long offset);
};

[Supplemental]
interface Uint8ClampedArray {
  // Avoid 'overriding static member BYTES_PER_ELEMENT'.
  [Suppressed] const long BYTES_PER_ELEMENT = 1;

  [Suppressed] void set();
  [DartName=setElements, Custom] void set(in any array, [Optional] in unsigned long offset);
};

[Supplemental,
  Constructor(in ArrayBuffer buffer,
              [Optional] in unsigned long byteOffset,
              [Optional] in unsigned long byteLength)
  ]
interface DataView {
  // Undo this:
  // We have to use custom code because our code generator does not support int8_t type.
  // int8_t getInt8(in unsigned long byteOffset);
  // uint8_t getUint8(in unsigned long byteOffset);
  [Suppressed] any getInt8();
  [Suppressed] any getUint8();
  [RaisesException] byte getInt8(in unsigned long byteOffset);
  [RaisesException] octet getUint8(in unsigned long byteOffset);

  // We have to use custom code because our code generator does not support uint8_t type.
  // void setInt8(in unsigned long byteOffset, in int8_t value);
  // void setUint8(in unsigned long byteOffset, in uint8_t value);
  [Suppressed] void setInt8();
  [Suppressed] void setUint8();
  [RaisesException] void setInt8(in unsigned long byteOffset, in byte value);
  [RaisesException] void setUint8(in unsigned long byteOffset, in octet value);
};

// TODO(vsm): Define new names for these (see b/4436830).
[Supplemental]
interface IDBCursor {
  [DartName=next] void continue([Optional] in any key);
};
[Supplemental]
interface IDBDatabase {
  // These variants are slated for removal from WebKit.  Suppress to bring our
  // API in line with the most recent spec.
  [Suppressed, CallWith=ScriptExecutionContext] IDBTransaction transaction(in DOMStringList storeNames, in unsigned short mode);
  [Suppressed, CallWith=ScriptExecutionContext] IDBTransaction transaction(in DOMString[] storeNames, in unsigned short mode);
  [Suppressed, CallWith=ScriptExecutionContext] IDBTransaction transaction(in DOMString storeName, in unsigned short mode);
};

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

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


[Supplemental,
  CustomConstructor,
  Constructor(in Array blobParts,
              [Optional] in DOMString type, [Optional] in DOMString endings)
  ]
interface Blob {
};

[Supplemental,
  Constructor(float x, float y)
]
interface DOMPoint {
};

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

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

// Keep it in to generate Dart code, C++ implementation is filterd out in generator.
[
  Callback
] interface MutationCallback {
  [Custom] boolean handleEvent(in MutationRecordArray mutations, in MutationObserver observer);
};

[Supplemental,
  CustomConstructor,
  // Provide missing constructor signature.
  Constructor(MutationCallback callback)]
interface MutationObserver {
  // Rename 'observe' so we can define a new 'observe' API that calls the
  // original.
  [DartName=_observe] void observe(in Node target, in Dictionary options);
};

  [Supplemental,
    CustomConstructor,
    // Provide missing constructor signature.
    Constructor([Optional] in HTMLFormElement form)]
  interface DOMFormData {
    [Suppressed] void append(in DOMString name, in DOMString value, in DOMString filename);
    [Custom] void append(in DOMString name, in DOMString value);
    [Custom] void append(in DOMString name, in Blob value, [Optional] in DOMString filename);
  };

[Supplemental]
interface SQLResultSetRowList {
  // Change the return type to Dictionary so that rows are exposed in the Dart
  // API as a Maps, with the appropriate conversion in JavaScript.
  [Suppressed] any item(in unsigned long index);
  [Custom] Dictionary item(in unsigned long index);
};

[Supplemental]
interface WebSocket {
  // Suppress the default since it has non-standard return type and add
  // overrides.
  [Suppressed] boolean send(in ArrayBuffer data);
  [Suppressed] boolean send(in ArrayBufferView data);
  [Suppressed] boolean send(in Blob data);
  [Suppressed] boolean send(in DOMString data);

  [Custom] void send(DOMString data);
  [Custom] void send(Blob data);
  [Custom] void send(ArrayBuffer data);
  [Custom] void send(ArrayBufferView data);
};

[Supplemental]
interface XMLHttpRequest {
   [Custom] void send();
   [Custom] void send(in ArrayBuffer data); // FIXME: this should be eventually deprecated.
   [Custom] void send(in ArrayBufferView data);
   [Custom] void send(in Blob data);
   [Custom] void send(in Document data);
   [Custom] void send([StrictTypeChecking] in DOMString data);
   [Custom] void send(in DOMFormData data);
};


[Suppressed]
interface AbstractView {};


[Suppressed]
interface InjectedScriptHost {};


[Suppressed]
interface InspectorFrontendHost {};


[Suppressed]
interface JavaScriptCallFrame {};


[Suppressed]
interface Entity {};
