// 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.
  [Custom=Setter] 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, double time, double 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);
  [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);
};

[Supplemental]
interface Node {
  [Custom] Node cloneNode([Default=Undefined] optional boolean deep);
};

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

/*
// TODO(vsm): How should this interact with the new ChildNode and
// ParentNode interfaces?
// Force ElementTraversal. WebKit defines these directly.
interface ElementTraversal : ChildNode, ParentNode {
  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();
};

// 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.
[Supplemental]
interface URL {
  [Suppressed] static DOMString createObjectURL(WebKitMediaSource source);
};

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

  [Suppressed] attribute boolean webkitImageSmoothingEnabled;
};

[Supplemental]
interface ConsoleBase {
  [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);
  [Suppressed] void remove(HTMLOptionElement option); // Non standard.
};

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

[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 RTCPeerConnection {
  [Suppressed, RaisesException] void addIceCandidate(RTCIceCandidate candidate);
};

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

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

    [CallWith=ExecutionContext, RaisesException] IDBRequest openKeyCursor([Default=Undefined] optional any key, [ForceOptional] optional DOMString direction);

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

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

[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=ExecutionContext, ImplementedAs=deleteFunction, RaisesException] IDBRequest delete(any key);
    [CallWith=ExecutionContext, RaisesException] IDBRequest openCursor(any key, [ForceOptional] optional DOMString direction);
    [CallWith=ExecutionContext, 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 WebKitPoint {
};

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

[Supplemental,
  CustomConstructor,
  // Provide missing constructor signature.
  Constructor(optional HTMLFormElement form)]
interface FormData {
  [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] object item(unsigned long index);
  [Custom] Dictionary item(unsigned long index);
};

[Supplemental, 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([StrictTypeChecking] DOMString data);
   [Custom] void send(FormData data);
};

[Suppressed]
interface AbstractView {};


[Suppressed]
interface InjectedScriptHost {};


[Suppressed]
interface InspectorFrontendHost {};


[Suppressed]
interface JavaScriptCallFrame {};


[Supplemental]
interface Location {
  [Custom=Setter] attribute DOMString href;

  [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.
[Suppressed]
interface ImageBitmapFactories {};

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

[Suppressed]
interface TextDecoder {};

[Supplemental]
interface Window : EventTarget {};

[Suppressed]
interface Promise {};

Element implements GlobalEventHandlers;
