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

[Supplemental,
 Constructor]
interface AudioContext {
  // TODO(ager): Auto-generate this custom method when the info about retaining
  // typed arrays is in the IDL.
  [Custom] void decodeAudioData(ArrayBuffer audioData, AudioBufferCallback successCallback, AudioBufferCallback errorCallback);
};

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

[Supplemental]
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, float time, float duration);
};

[Supplemental]
interface Document {
  [Suppressed] DOMObject getCSSCanvasContext(DOMString contextId, DOMString name, long width, long height);
  CanvasRenderingContext getCSSCanvasContext(DOMString contextId, DOMString name, long width, 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(ImageData imagedata);
};

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

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

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

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

[Supplemental]
interface HTMLSelectElement {
  [Suppressed] void add([Default=Undefined] HTMLElement element, [Default=Undefined] 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 DOMString eventTypeArg,
                              optional boolean canBubbleArg,
                              optional boolean cancelableArg,
                              optional DOMString statusMessageArg);
};

[Supplemental]
interface WebGLRenderingContext {

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

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

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

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

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

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

  [Custom] any getShaderParameter(WebGLShader shader, 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(unsigned long target, unsigned long pname);
  [Suppressed, StrictTypeChecking, Custom] void getTexParameter();

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

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

// TODO(vsm): Define new names for these (see b/4436830).
[Supplemental]
interface IDBCursor {
  [DartName=next, CallWith=ScriptExecutionContext, ImplementedAs=continueFunction, RaisesException] void continue([ForceOptional] optional any key);
};
[Supplemental]
interface IDBIndex {
    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest openCursor([ForceOptional] optional IDBKeyRange? range, [ForceOptional] optional DOMString direction);
    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest openCursor(any key, [ForceOptional] optional DOMString direction);
    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest openKeyCursor([ForceOptional] optional IDBKeyRange? range, [ForceOptional] optional DOMString  direction);
    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest openKeyCursor(any key,
    [ForceOptional] optional DOMString direction);

    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest count([ForceOptional] optional IDBKeyRange? range);
    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest count(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(DOMStringList storeNames, unsigned short mode);
  [Suppressed, CallWith=ScriptExecutionContext] IDBTransaction transaction(DOMString[] storeNames, unsigned short mode);
  [Suppressed, CallWith=ScriptExecutionContext] IDBTransaction transaction(DOMString storeName, unsigned short mode);
};

[Supplemental]
interface IDBKeyRange {
  [DartName=only_] static IDBKeyRange only(any value);
  [DartName=lowerBound_] static IDBKeyRange lowerBound(any bound, [ForceOptional] optional boolean open);
  [DartName=upperBound_] static IDBKeyRange upperBound(any bound, [ForceOptional] optional boolean open);
  [DartName=bound_] static IDBKeyRange bound(any lower, any upper, [ForceOptional] optional boolean lowerOpen, [ForceOptional] optional boolean upperOpen);
};
[Supplemental]
interface IDBObjectStore {
    [CallWith=ScriptState, RaisesException] IDBRequest put(any value, [ForceOptional] optional any key);
    [CallWith=ScriptState, RaisesException] IDBRequest add(any value, [ForceOptional] optional any key);
    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest openCursor([ForceOptional] optional IDBKeyRange? range, [ForceOptional] optional DOMString direction);
    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest openCursor(any key, [ForceOptional] optional DOMString direction);
    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest count([ForceOptional] optional IDBKeyRange? range);
    [CallWith=ScriptExecutionContext, RaisesException] IDBRequest count(any key);
};

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


[Supplemental,
  CustomConstructor,
  Constructor(Array blobParts, optional DOMString type, optional 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(MutationRecordArray mutations, 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(Node target, Dictionary options);
};

  [Supplemental,
    CustomConstructor,
    // Provide missing constructor signature.
    Constructor(optional HTMLFormElement form)]
  interface DOMFormData {
    [Suppressed] 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);
  };

[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(unsigned long index);
  [Custom] Dictionary item(unsigned long index);
};

[Supplemental]
interface WebSocket {
  // Suppress the default since it has non-standard return type and add
  // overrides.
  [Suppressed] boolean send(ArrayBuffer data);
  [Suppressed] boolean send(ArrayBufferView data);
  [Suppressed] boolean send(Blob data);
  [Suppressed] boolean send(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(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([StrictTypeChecking] DOMString data);
   [Custom] void send(DOMFormData data);
};


[Suppressed]
interface AbstractView {};


[Suppressed]
interface InjectedScriptHost {};


[Suppressed]
interface InspectorFrontendHost {};


[Suppressed]
interface JavaScriptCallFrame {};


[Suppressed]
interface Entity {};
