From 84d0d5a293c22f332da28dabf978c2de5f4e9c04 Mon Sep 17 00:00:00 2001 From: Jooseppi12 Date: Thu, 27 Oct 2022 13:16:50 +0200 Subject: [PATCH] Standard binding updates (#1278) * #1275 - Add warning capability on properties and constructors as well * #1274 #1276 #1277 * Minor cleanup --- .../WebSharper.Compiler/WIGCompile.fs | 6 +- .../CodeModel.fs | 4 +- .../Pervasives.fs | 4 +- src/stdlib/WebSharper.JavaScript/Html5.fs | 1112 ++++++++++++++--- tests/WebSharper.Html5.Tests/JSBindings.fs | 2 + tests/WebSharper.Html5.Tests/Tests.fs | 2 +- 6 files changed, 955 insertions(+), 175 deletions(-) diff --git a/src/compiler/WebSharper.Compiler/WIGCompile.fs b/src/compiler/WebSharper.Compiler/WIGCompile.fs index c1400a593..8f22be9c6 100644 --- a/src/compiler/WebSharper.Compiler/WIGCompile.fs +++ b/src/compiler/WebSharper.Compiler/WIGCompile.fs @@ -838,7 +838,7 @@ type MemberConverter attr.ConstructorArguments.Add(CustomAttributeArgument(tB.String, warning)) attr - let setWarnAttribute (x: CodeModel.MethodBase) (attrs: Mono.Collections.Generic.Collection) = + let setWarnAttribute (x: CodeModel.Entity) (attrs: Mono.Collections.Generic.Collection) = match x.Warning with | Some warning -> attrs.Add (warnAttribute warning) | _ -> () @@ -985,6 +985,7 @@ type MemberConverter pD.SetMethod <- mD setObsoleteAttribute p pD.CustomAttributes addDependencies p pD.CustomAttributes + setWarnAttribute p pD.CustomAttributes dT.Properties.Add pD let withGenerics (generics: Code.TypeParameter list, td: Code.TypeDeclaration, owner) = @@ -1019,6 +1020,7 @@ type MemberConverter if x.Generics.Length > 0 then tD.Name <- tD.Name + "`" + string x.Generics.Length k (withGenerics (x.Generics, x, tD)) tD + setWarnAttribute x tD.CustomAttributes | _ -> () member private c.AddMethod(dT: TypeDefinition, td: Code.TypeDeclaration, x: Code.Method) = @@ -1095,6 +1097,7 @@ type MemberConverter if not (propNames.Add name) then failwithf "Duplicate property definition: %s on %s" name x.Name addProperty tD x name p addDependencies x tD.CustomAttributes + setWarnAttribute x tD.CustomAttributes member d.AddDependencies(ent: Code.IResourceDependable, prov: ICustomAttributeProvider) = addDependencies ent prov.CustomAttributes @@ -1122,6 +1125,7 @@ type MemberConverter for ctor in x.Constructors do addConstructor tD x ctor setObsoleteAttribute x tD.CustomAttributes + setWarnAttribute x tD.CustomAttributes c.AddTypeMembers(x, tD) member c.Interface(x: Code.Interface) = diff --git a/src/compiler/WebSharper.InterfaceGenerator/CodeModel.fs b/src/compiler/WebSharper.InterfaceGenerator/CodeModel.fs index 3cf5b5bf7..d8f147332 100644 --- a/src/compiler/WebSharper.InterfaceGenerator/CodeModel.fs +++ b/src/compiler/WebSharper.InterfaceGenerator/CodeModel.fs @@ -41,6 +41,7 @@ module CodeModel = val mutable DependsOn : list val mutable Comment : option val mutable ObsoleteStatus : ObsoleteStatus + val mutable Warning : option internal new (name, t) = { @@ -50,6 +51,7 @@ module CodeModel = DependsOn = [] Comment = None ObsoleteStatus = NotObsolete + Warning = None } /// On type definitions, applies the update. @@ -289,7 +291,6 @@ module CodeModel = val mutable Inline : option val mutable IsPure : bool val mutable Macro : option - val mutable Warning : option internal new (name, t) = { @@ -297,7 +298,6 @@ module CodeModel = Inline = None IsPure = false Macro = None - Warning = None } and Constructor = diff --git a/src/compiler/WebSharper.InterfaceGenerator/Pervasives.fs b/src/compiler/WebSharper.InterfaceGenerator/Pervasives.fs index 07b01a2d4..d2bc94860 100644 --- a/src/compiler/WebSharper.InterfaceGenerator/Pervasives.fs +++ b/src/compiler/WebSharper.InterfaceGenerator/Pervasives.fs @@ -265,8 +265,8 @@ module Pervasives = let Pure (x: #Code.MethodBase) = x |> Code.Entity.Update (fun x -> x.IsPure <- true) - /// Marks an method as a pure function call. - let WithWarning s (x: #Code.MethodBase) = + /// Adds a warning for the given code entity. + let WithWarning s (x: #Code.Entity) = x |> Code.Entity.Update (fun x -> x.Warning <- Some s) /// Adds an inline. diff --git a/src/stdlib/WebSharper.JavaScript/Html5.fs b/src/stdlib/WebSharper.JavaScript/Html5.fs index b484f5054..41846cce2 100644 --- a/src/stdlib/WebSharper.JavaScript/Html5.fs +++ b/src/stdlib/WebSharper.JavaScript/Html5.fs @@ -36,6 +36,610 @@ module Utils = |> List.toSeq |> Pattern.EnumInlines n +module Decl = + let HTMLCanvasElementClass = Class "HTMLCanvasElement" + let HTMLImageElementClass = Class "HTMLImageElement" + let HTMLVideoElementClass = Class "HTMLVideoElement" + let SVGImageElementClass = Class "SVGImageElement" + +module TypedArrays = + + + let ArrayBuffer = + Class "ArrayBuffer" + |+> Instance [ + "byteLength" =? T + "slice" => T * T ^-> TSelf + |> WithComment "Warning: although part of the spec, may not work in IE10 as of 6/6/2013." + ] + |+> Static [ Constructor T ] + + module DataView = + + let private Getter<'T> name = + name => T?byteOffset * !? T?littleEndian ^-> T<'T> + + let private Setter<'T> name = + name => T?byteOffset * T<'T>?value * !? T?littleEndian ^-> T + + let Class = + Class "DataView" + |+> Static [ + Constructor ArrayBuffer + Constructor (ArrayBuffer * T?byteOffset) + Constructor (ArrayBuffer * T?byteOffset * T?byteLength) + ] + |+> Instance [ + "getInt8" => T?byteOffset ^-> T + "getUint8" => T?byteOffset ^-> T + Getter "getInt16" + Getter "getUint16" + Getter "getInt32" + Getter "getUint32" + Getter "getFloat32" + Getter "getFloat64" + "setInt8" => T?byteOffset * T?value ^-> T + "setUint8" => T?byteOffset * T?value ^-> T + Setter "setInt16" + Setter "setUint16" + Setter "setInt32" + Setter "setUint32" + Setter "setFloat32" + Setter "setFloat64" + ] + + let ArrayBufferView = + Class "ArrayBufferView" + |+> Instance + [ + "buffer" =? ArrayBuffer + "byteOffset" =? T + "byteLength" =? T + ] + + let private MakeTypedArray typedArray (elementType: Type.Type) = + Class typedArray + |=> Inherits ArrayBufferView + |+> Static [ + Constructor T + Constructor T + Constructor TSelf + Constructor (Type.ArrayOf elementType) + Constructor (ArrayBuffer?buffer * !? T?byteOffset * !? T?length) + "BYTES_PER_ELEMENT" =? T + ] + |+> Instance [ + "length" =? T + "get" => + T?offset ^-> elementType + |> WithInline "$this[$offset]" + "set" => + T?offset * elementType?value ^-> T + |> WithInline "void($this[$offset]=$value)" + "set" => TSelf?array * !? T?offset ^-> T + "set" => (Type.ArrayOf elementType)?array * !? T?offset ^-> T + "subarray" => T?``begin`` * T?``end`` ^-> TSelf + ] + + let Int8Array = MakeTypedArray "Int8Array" T + let Uint8Array = MakeTypedArray "Uint8Array" T + let Uint8ClampedArray = MakeTypedArray "Uint8ClampedArray" T + let Int16Array = MakeTypedArray "Int16Array" T + let Uint16Array = MakeTypedArray "Uint16Array" T + let Int32Array = MakeTypedArray "Int32Array" T + let Uint32Array = MakeTypedArray "Uint32Array" T + let Float32Array = MakeTypedArray "Float32Array" T + let Float64Array = MakeTypedArray "Float64Array" T + +module Media = + let MediaStreamTrackContentHint = + Pattern.EnumInlines "MediaStreamTrackContentHint" + [ + "Empty", "''" + "Speech", "'speech'" + "SpeechRecognition", "'speech-recognition'" + "Music", "'music'" + "Motion", "'motion'" + "Detail", "'detail'" + "Text", "'text'" + ] + + let MediaStreamTrackClass = + Class "MediaStreamTrackClass" + + let ULongRange = + Pattern.Config "ULongRange" + { + Required = [] + Optional = [ + "max", T + "min", T + ] + } + + let DoubleRange = + Pattern.Config "DoubleRange" + { + Required = [] + Optional = [ + "max", T + "min", T + ] + } + + let MediaStreamTrackState = + Pattern.EnumStrings "MediaStreamTrackState" + [ + "live" + "ended" + ] + + let MediaTrackCapabilities = + Pattern.Config "MediaTrackCapabilities" + { + Required = [] + Optional = [ + "facingMode", !| T + "resizeMode", !| T + + "echoCancellation", !|T + "autoGainControl", !|T + "noiseSuppression", !|T + + "deviceId", T + "groupId", T + + "width", ULongRange.Type + "height", ULongRange.Type + "channelCount", ULongRange.Type + "sampleRate", ULongRange.Type + "sampleSize", ULongRange.Type + + "latency", DoubleRange.Type + "aspectRatio", DoubleRange.Type + "frameRate", DoubleRange.Type + ] + } + + let ConstrainDOMStringParameters = + Pattern.Config "ConstrainDOMStringParameters" + { + Required = [] + Optional = [ + "exact", T + !|T + "ideal", T + !|T + ] + } + + let ConstrainDOMString = T + !|T + ConstrainDOMStringParameters + + let ConstrainBooleanParameters = + Pattern.Config "ConstrainBooleanParameters" { + Required = [] + Optional = [ + "exact", T + "ideal", T + ] + } + + let ConstrainBoolean = T + ConstrainBooleanParameters + + let ConstrainULongRange = + Pattern.Config "ConstrainULongRange" + { + Required = [] + Optional = [ + "exact", T + "ideal", T + ] + } + |=> Inherits ULongRange + + let ConstrainDoubleRange = + Pattern.Config "ConstrainDoubleRange" + { + Required = [] + Optional = [ + "exact", T + "ideal", T + ] + } + |=> Inherits DoubleRange + + let ConstrainDouble = T + ConstrainDoubleRange + let ConstrainULong = T + ConstrainULongRange + + let MediaTrackConstraintSet = + Pattern.Config "MediaTrackConstraintSet" + { + Required = [] + Optional = [ + "facingMode", ConstrainDOMString + "resizeMode", ConstrainDOMString + + "echoCancellation", ConstrainBoolean + "autoGainControl", ConstrainBoolean + "noiseSuppression", ConstrainBoolean + + "deviceId", ConstrainDOMString + "groupId", ConstrainDOMString + + "width", ConstrainULong + "height", ConstrainULong + "channelCount", ConstrainULong + "sampleRate", ConstrainULong + "sampleSize", ConstrainULong + + "latency", ConstrainDouble + "aspectRatio", ConstrainDouble + "frameRate", ConstrainDouble + ] + } + + let MediaTrackConstraints = + Pattern.Config "MediaTrackConstraints" + { + Required = [] + Optional = [ + "advanced", !| MediaTrackConstraintSet + ] + } + |=> Inherits MediaTrackConstraintSet + + let MediaTrackSettings = + Pattern.Config "MediaTrackSettings" + { + Required = [] + Optional = [ + "facingMode", T + "resizeMode", T + + "echoCancellation", T + "autoGainControl", T + "noiseSuppression", T + + "deviceId", T + "groupId", T + + "width", T + "height", T + "channelCount", T + "sampleRate", T + "sampleSize", T + + "latency", T + "aspectRatio", T + "frameRate", T + ] + } + + let MediaTrackSupportedConstraints = + Class "MediaTrackSupportedConstraints" + |+> Static [ + "facingMode" =? T + "resizeMode" =? T + "echoCancellation" =? T + "autoGainControl" =? T + "noiseSuppression" =? T + "deviceId" =? T + "groupId" =? T + "width" =? T + "height" =? T + "channelCount" =? T + "sampleRate" =? T + "sampleSize" =? T + "latency" =? T + "aspectRatio" =? T + "frameRate" =? T + ] + + let MediaStreamTrackEvent = + Class "MediaStreamTrackEvent" + |=> Inherits Dom.Interfaces.Event + |+> Static [ + Constructor T + ] + |+> Instance [ + "track" =? MediaStreamTrackClass + ] + + let MediaStreamTrack = + MediaStreamTrackClass + |=> Inherits Dom.Interfaces.EventTarget + |+> Instance [ + "contentHint" =? MediaStreamTrackContentHint.Type + |> WithWarning "This is not part of the standard API" + "kind" =? T + "id" =? T + "label" =? T + "enabled" =@ T + "muted" => T + "readyState" =? MediaStreamTrackState + + "clone" => T ^-> TSelf + "stop" => T ^-> T + "getCapabilities" => T ^-> MediaTrackCapabilities + "getConstraints" => T ^-> MediaTrackConstraints + "getSettings" => T ^-> MediaTrackSettings + "applyConstraints" => !?MediaTrackConstraints?constraints ^-> EcmaPromise.[T] + + "onended" =@ MediaStreamTrackEvent ^-> T + "onmute" =@ MediaStreamTrackEvent ^-> T + "onunmute" =@ MediaStreamTrackEvent ^-> T + ] + + let MediaStream = + Class "MediaStream" + |=> Inherits Dom.Interfaces.EventTarget + |+> Static [ + Constructor T + Constructor TSelf?stream + Constructor !|MediaStreamTrack + ] + |+> Instance [ + "active" =? T + "id" =? T + + "addTrack" => MediaStreamTrack ^-> T + "clone" => T ^-> TSelf + "getAudioTracks" => T ^-> !| MediaStreamTrack + "getVideoTracks" => T ^-> !| MediaStreamTrack + "getTracks" => T ^-> !| MediaStreamTrack + "getTrackById" => T ^-> !? MediaStreamTrack + "removeTrack" => MediaStreamTrack ^-> T + + "onaddtrack" =@ MediaStreamTrackEvent ^-> T + "onremovetrack" =@ MediaStreamTrackEvent ^-> T + "onactive" =@ MediaStreamTrackEvent ^-> T + "oninactive" =@ MediaStreamTrackEvent ^-> T + ] + + let MediaDeviceKind = + Pattern.EnumStrings "MediaDeviceKind" + [ + "audioinput" + "audiooutput" + "videoinput" + ] + + + let MediaDeviceInfo = + Interface "MediaDeviceInfo" + |+> [ + "deviceId" =? T + "kind" =? MediaDeviceKind + "label" =? T + "groupId" =? T + ] + + let InputDeviceInfo = + Interface "InputDeviceInfo" + |+> [ + "getCapabilities" => T ^-> MediaTrackCapabilities + ] + + let MediaDevices = + Class "MediaDevices" + |=> Inherits Dom.Interfaces.EventTarget + |+> Instance [ + "enumerateDevices" => T ^-> EcmaPromise.[!|MediaDeviceInfo] + "ondevicechange" => Dom.Interfaces.Event ^-> T + ] + + let CanvasCaptureMediaStreamTrack = + Class "CanvasCaptureMediaStreamTrack" + |=> Inherits MediaStreamTrackClass + |+> Instance [ + "canvas" =? Decl.HTMLCanvasElementClass + "requestFrame" => T ^-> T + ] + +module Geometry = + let DOMPointInit = + Pattern.Config "DOMPointInit" + { + Required = [] + Optional = [ + "x", T + "y", T + "z", T + "w", T + ] + } + + let DOMMatrix2DInit = + Pattern.Config "DOMMatrix2DInit" + { + Required = [] + Optional = [ + "a" , T + "b" , T + "c" , T + "d" , T + "e" , T + "f" , T + "m11" , T + "m12" , T + "m21" , T + "m22" , T + ] + } + + let DOMMatrixInit = + Pattern.Config "DOMMatrixInit" + { + Required = [] + Optional = [ + "m13" , T + "m14" , T + "m23" , T + "m24" , T + "m31" , T + "m32" , T + "m33" , T + "m34" , T + "m41" , T + "m42" , T + "m43" , T + "m44" , T + "is2D" , T + ] + } + |=> Inherits DOMMatrix2DInit + + let DOMPointReadOnly = + Class "DOMPointReadOnly" + |+> Static [ + Constructor (!?T?x * !?T?y * !?T?z * !?T?w) + "fromPoint" => !?DOMPointInit ^-> TSelf + ] + |+> Instance [ + "x" =? T + "y" =? T + "z" =? T + "w" =? T + + "matrixTransform" => !?DOMMatrixInit?matrix ^-> TSelf + ] + + let DOMPoint = + Class "DOMPoint" + |=> Inherits DOMPointReadOnly + + let DOMMatrixReadOnly = + Class "DOMMatrixReadOnly" + |+> Static [ + Constructor T + Constructor T + Constructor !|T + + "fromMatrix" => DOMMatrixInit?other ^-> TSelf + "fromFloat32Array" => TypedArrays.Float32Array?other ^-> TSelf + "fromFloat64Array" => TypedArrays.Float64Array?other ^-> TSelf + ] + |+> Instance [ + "a" =? T + "b" =? T + "c" =? T + "d" =? T + "e" =? T + "f" =? T + + "m11" =? T + "m12" =? T + "m13" =? T + "m14" =? T + "m21" =? T + "m22" =? T + "m23" =? T + "m24" =? T + "m31" =? T + "m32" =? T + "m33" =? T + "m34" =? T + "m41" =? T + "m42" =? T + "m43" =? T + "m44" =? T + + "is2D" =? T + "isIdentity" =? T + + "flipX" => T ^-> TSelf + "flipY" => T ^-> TSelf + "inverse" => T ^-> TSelf + "translate" => !?T?tx * !?T?ty * !?T?tz ^-> TSelf + "scale" => !?T?scaleX * !?T?scaleY * !?T?scaleZ * !?T?originX * !?T?originY * !?T?originZ ^-> TSelf + "scaleNonUniform" => !?T?scaleX * !?T?scaleY ^-> TSelf + "scale3D" => !?T?scale * !?T?originX * !?T?originY * !?T?originZ ^-> TSelf + "rotate" => !?T?rotX * !?T?rotY * !?T?rotZ ^-> TSelf + "rotateFromVector" => !?T?x * !?T?y ^-> TSelf + "rotateAxisAngle" => !?T?x * !?T?y * !?T?z * !?T?angle ^-> TSelf + "skewX" => !?T?sx ^-> TSelf + "skewY" => !?T?sY ^-> TSelf + "multiply" => !?DOMMatrixInit?other ^-> TSelf + "transformPoint" => !?DOMPointInit?point ^-> DOMPoint + "toFloat32Array" => T ^-> TypedArrays.Float32Array + "toFloat64Array" => T ^-> TypedArrays.Float64Array + "toJSON" => T ^-> T + ] + + let DOMMatrix = + Class "DOMMatrix" + |=> Inherits DOMMatrixReadOnly + |+> Instance [ + "invertSelf" => T ^-> TSelf + "translateSelf" => !?T?tx * !?T?ty * !?T?tz ^-> TSelf + "scaleSelf" => !?T?scaleX * !?T?scaleY * !?T?scaleZ * !?T?originX * !?T?originY * !?T?originZ ^-> TSelf + "scale3DSelf" => !?T?scale * !?T?originX * !?T?originY * !?T?originZ ^-> TSelf + "rotateSelf" => !?T?rotX * !?T?rotY * !?T?rotZ ^-> TSelf + "rotateFromVectorSelf" => !?T?x * !?T?y ^-> TSelf + "rotateAxisAngleSelf" => !?T?x * !?T?y * !?T?z * !?T?angle ^-> TSelf + "skewXSelf" => !?T?sx ^-> TSelf + "skewYSelf" => !?T?sY ^-> TSelf + "multiplySelf" => !?DOMMatrixInit?other ^-> TSelf + "preMultiplySelf" => !?DOMMatrixInit?other ^-> TSelf + ] + + let DOMQuadInit = + Pattern.Config "DOMQuadInit" { + Required = [] + Optional = [ + "p1", DOMPointInit.Type + "p2", DOMPointInit.Type + "p3", DOMPointInit.Type + "p4", DOMPointInit.Type + ] + } + + let DOMRectInit = + Pattern.Config "DOMRectInit" { + Required = [] + Optional = [ + "x", T + "y", T + "width", T + "height", T + ] + } + + let DOMRectReadOnly = + Class "DOMRectReadOnly" + |+> Static [ + Constructor (T?x * T?y * T?width * T?height) + "fromRect" => DOMRectInit?other ^-> TSelf + ] + |+> Instance [ + "x" =? T + "y" =? T + "width" =? T + "height" =? T + "top" =? T + "right" =? T + "bottom" =? T + "left" =? T + ] + + let DOMRect = + Class "DOMRect" + |=> Inherits DOMRectReadOnly + + let DOMQuad = + Class "DOMQuad" + |+> Static [ + Constructor (DOMPointInit?p1 * DOMPointInit?p2 * DOMPointInit?p3 * DOMPointInit?p4) + "fromRect" => DOMRectInit?other ^-> TSelf + "fromQuad" => DOMQuadInit?other ^-> TSelf + ] + |+> Instance [ + "p1" =? DOMPoint + "p2" =? DOMPoint + "p3" =? DOMPoint + "p4" =? DOMPoint + + "getBounds" => T ^-> DOMRect + ] + module Canvas = open Utils @@ -83,6 +687,9 @@ module Canvas = "addColorStop" => (T * T) ^-> T ] + let OffscreenCanvasClass = + Class "OffscreenCanvas" + let Repetition = let renamer n = match n with @@ -108,21 +715,27 @@ module Canvas = ] let TextDirection = - Pattern.EnumStrings "TextDirection" [ + Pattern.EnumStrings "CanvasTextDirection" [ "ltr" "rtl" "inherit" ] + + let PredefinedColorSpace = + Pattern.EnumInlines "PredefinedColorSpace" [ + "srgb", "'srgb'" + "display-p3", "DisplayP3" + ] let LineJoin = - Pattern.EnumStrings "LineJoin" [ + Pattern.EnumStrings "CanvasLineJoin" [ "round" "bevel" "miter" ] let TextAlign = - Pattern.EnumStrings "TextAlign" [ + Pattern.EnumStrings "CanvasTextAlign" [ "start" "end" "left" @@ -131,7 +744,7 @@ module Canvas = ] let TextBaseline = - Pattern.EnumStrings "TextBaseLine" [ + Pattern.EnumStrings "CanvasTextBaseLine" [ "top" "hanging" "middle" @@ -140,6 +753,15 @@ module Canvas = "bottom" ] + let ImageDataSettings = + Pattern.Config "ImageDataSettings" + { + Required = [] + Optional = [ + "colorSpace", PredefinedColorSpace.Type + ] + } + let TextMetrics = Class "TextMetrics" |+> Instance ["width" =@ T ] @@ -159,106 +781,256 @@ module Canvas = |+> Instance [ "height" =? T "width" =? T - "data" =? CanvasPixelArray + "colorSpace" =? PredefinedColorSpace + "data" =? TypedArrays.Uint8ClampedArray ] - - let CanvasRenderingContext2D = - Class "CanvasRenderingContext2D" - |+> Instance [ - "canvas" =? Dom.Interfaces.Element // FIXME - // push state on state stack + + let CanvasState = + Interface "CanvasState" + |+> [ "save" => T ^-> T - // pop state stack and restore state "restore" => T ^-> T - "scale" => (T * T) ^-> T - "rotate" => (T) ^-> T - "translate" => (T * T) ^-> T - "transform" => (T * T * T * T * T * T) ^-> T - "setTransform" => (T * T * T * T * T * T) ^-> T + "reset" => T ^-> T + "isContextLost" => T ^-> T + ] + + let CanvasTransform = + Interface "CanvasTransform" + |+> [ + "scale" => (T?x * T?y) ^-> T + "rotate" => (T?angle) ^-> T + "translate" => (T?x * T?y) ^-> T + "transform" => (T?a * T?b * T?c * T?d * T?e * T?f) ^-> T + "setTransform" => (T?a * T?b * T?c * T?d * T?e * T?f) ^-> T + //"getTransform" => T ^-> DOMMatrix //!!!!! + "resetTransform" => T ^-> T + ] + + let ImageSmoothingQuality = + Pattern.EnumStrings "ImageSmoothingQuality" + [ + "low" + "medium" + "high" + ] + + let CanvasCompositing = + Interface "CanvasCompositing" + |+> [ "globalAlpha" =@ T "globalCompositeOperation" =@ GlobalCompositeOperation - // (default black) - "strokeStyle" =@ T - // (default black) - "fillStyle" =@ T - "createLinearGradient" => (T * T * T * T) ^-> CanvasGradient - "createRadialGradient" => (T * T * T * T * T * T) ^-> CanvasGradient - "createPattern" => (Dom.Interfaces.Element * Repetition) ^-> CanvasPattern - // (default 1) - "lineWidth" =@ T - // "butt", "round", "square" (default "butt") - "lineCap" =@ LineCap - // "round", "bevel", "miter" (default "miter") - "lineJoin" =@ LineJoin - "getLineDash" => T ^-> T - "setLineDash" => T ^-> T - // (default 0.0) - "lineDashOffset" =@ T - // (default 10) - "miterLimit" =@ T - // (default 0) + ] + + let CanvasImageSmoothing = + Interface "CanvasImageSmoothing" + |+> [ + "imageSmootingEnabled" =@ T + "imageSmoothingQuality" =@ ImageSmoothingQuality + ] + + let HTMLOrSVGImageElement = + Decl.HTMLImageElementClass + Decl.SVGImageElementClass + + let CanvasImageSource = + HTMLOrSVGImageElement + Decl.HTMLVideoElementClass + Decl.HTMLCanvasElementClass + OffscreenCanvasClass //+ ImageBitmap + VideoFrame + + let CanvasFillStrokeStyles = + Interface "CanvasFillStrokeStyles" + |+> [ + "strokeStyle" =@ T + CanvasGradient + CanvasPattern + "fillStyle" =@ T + CanvasGradient + CanvasPattern + "createLinearGradient" => (T?x0 * T?y0 * T?x1 * T?y1) ^-> CanvasGradient + "createRadialGradient" => (T?x0 * T?y0 * T?r0 * T?x1 * T?y1 * T?r1) ^-> CanvasGradient + "createConicGradient" => (T?angle * T?x * T?y) ^-> CanvasGradient + "createPattern" => (CanvasImageSource?image * !?Repetition?repetition) ^-> CanvasPattern + ] + + let CanvasShadowStyles = + Interface "CanvasShadowStyles" + |+> [ "shadowOffsetX" =@ T - // (default 0) "shadowOffsetY" =@ T - // (default 0) "shadowBlur" =@ T - // (default transparent black) "shadowColor" =@ T + ] - // rects - "clearRect" => (T * T * T * T) ^-> T - "fillRect" => (T * T * T * T) ^-> T - "strokeRect" => (T * T * T * T) ^-> T + let CanvasFilters = + Interface "CanvasFilters" + |+> [ + "filter" =@ T + ] - // path API - "beginPath" => T ^-> T + let CanvasRect = + Interface "CanvasRect" + |+> [ + "clearRect" => (T?x * T?y * T?w * T?h) ^-> T + "fillRect" => (T?x * T?y * T?w * T?h) ^-> T + "strokeRect" => (T?x * T?y * T?w * T?h) ^-> T + ] + + let CanvasFillRule = + Pattern.EnumStrings "CanvasFillRule" ["nonzero"; "evenodd"] + + let CanvasPath = + Interface "CanvasPath" + |+> [ "closePath" => T ^-> T - "moveTo" => (T * T) ^-> T - "lineTo" => (T * T) ^-> T - "quadraticCurveTo" => (T * T * T * T) ^-> T - "bezierCurveTo" => (T * T * T * T * T * T) ^-> T - "arcTo" => (T * T * T * T * T) ^-> T - "rect" => (T * T * T * T) ^-> T - "arc" => (T * T * T * T * T * T) ^-> T - "fill" => T ^-> T - "stroke" => T ^-> T - "clip" => T ^-> T - "drawFocusIfNeeded" => Dom.Interfaces.Element ^-> T - "scrollPathIntoView" => T ^-> T - "isPointInPath" => (T * T) ^-> T - "isPointInStroke" => (T * T) ^-> T + "roundRect" => (T?x * T?y * T?w * T?h * !?(T + Geometry.DOMPointInit + !|(T + Geometry.DOMPointInit))?radii) ^-> T + "moveTo" => T?x * T?y ^-> T + "lineTo" => T?x * T?y ^-> T + "bezierCurveTo" => T?cp1x * T?cp1y * T?cp2x * T?cp2y * T?x * T?y ^-> T + "quadraticCurveTo" => T?cpx * T?cpy * T?x * T?y ^-> T + "arc" => (T?x * T?y * T?radius * T?startAngle * T?endAngle * !?T?counterclockwise) ^-> T + "arcTo" => (T?x1 * T?y1 * T?x2 * T?y2 * T?radius) ^-> T + "ellipse" => (T?x * T?y * T?radiusX * T?radiusY * T?rotation * T?startAngle * T?endAngle * !?T?counterclockwise) ^-> T + "rect" => (T?x * T?y * T?width * T?height) ^-> T + ] + + let Path2D = + Class "Path2D" + |=> Implements [CanvasPath] + |+> Static [ + Constructor T + Constructor TSelf + Constructor T + ] + |+> Instance [ + "addPath" => TSelf * !?Geometry.DOMMatrix2DInit?transform ^-> T + ] - // focus management - "drawFocusRing" => (Dom.Interfaces.Element?el * T?x * T?y * !? T) ^-> T + let CanvasDrawPath = + Interface "CanvasDrawPath" + |+> [ + "beginPath" => T ^-> T + "fill" => !?CanvasFillRule ^-> T + "fill" => Path2D * !?CanvasFillRule ^-> T + "stroke" => T ^-> T + "stroke" => Path2D ^-> T + "clip" => !?CanvasFillRule ^-> T + "clip" => Path2D * !?CanvasFillRule ^-> T + "isPointInPath" => (T * T * !?CanvasFillRule) ^-> T + "isPointInPath" => (Path2D * !?CanvasFillRule) ^-> T + "isPointInStroke" => (T * T * !?CanvasFillRule) ^-> T + "isPointInStroke" => (Path2D * T * !?CanvasFillRule) ^-> T + ] - // text - // (default 10px sans-serif) - "font" =@ T - "textAlign" =@ TextAlign - "textBaseline" =@ TextBaseline - // (default inherit) - "direction" =@ TextDirection + let CanvasUserInterface = + Interface "CanvasUserInterface" + |+> [ + "drawFocusIfNeeded" => Dom.Interfaces.Element?element ^-> T + "drawFocusIfNeeded" => Path2D?path * Dom.Interfaces.Element?element ^-> T + "scrollPathIntoView" => T ^-> T + "scrollPathIntoView" => Path2D?path ^-> T + ] - "fillText" => T * T * T ^-> T - "fillText" => T * T * T * T ^-> T - "strokeText" => T * T * T ^-> T - "strokeText" => T * T * T * T ^-> T - "measureText" => T ^-> TextMetrics + let CanvasText = + Interface "CanvasText" + |+> [ + "fillText" => T?text * T?x * T?y * !?T?maxWidth ^-> T + "strokeText" => T?text * T?x * T?y * !?T?maxWidth ^-> T + "measureText" => T?text ^-> TextMetrics + ] - // drawing images + let CanvasDrawImage = + Interface "CanvasDrawImage" + |+> [ "drawImage" => (Dom.Interfaces.Element * T * T) ^-> T "drawImage" => (Dom.Interfaces.Element * T * T * T * T) ^-> T "drawImage" => (Dom.Interfaces.Element * T * T * T * T * T * T * T * T) ^-> T + ] - // pixel manipulation - "createImageData" => (T * T) ^-> ImageData + let CanvasImageData = + Interface "CanvasImageData" + |+> [ + "createImageData" => (T * T * !?ImageDataSettings) ^-> ImageData "createImageData" => (ImageData) ^-> ImageData - "getImageData" => (T * T * T * T) ^-> ImageData + "getImageData" => (T * T * T * T * !?ImageDataSettings) ^-> ImageData "putImageData" => (ImageData * T * T ) ^-> T "putImageData" => (ImageData * T * T * T * T * T * T) ^-> T ] + let CanvasPathDrawingStyles = + Interface "CanvasPathDrawingStyles" + |+> [ + "lineWidth" =@ T + "lineCap" =@ LineCap + "lineJoin" =@ LineJoin + "miterLimit" =@ T + "getLineDash" => T ^-> T + "setLineDash" => T ^-> T + "lineDashOffset" =@ T + ] + + let CanvasFontKerning = Pattern.EnumStrings "CanvasFontKerning" ["auto"; "normal"; "none"] + + let CanvasFontStretch = + Pattern.EnumInlines "CanvasFontStretch" [ + "UltraCondensed", "'ultra-condensed'" + "ExtraCondensed", "'extra-condensed'" + "Condensed", "'condensed'" + "SemiCondensed", "'semi-condensed'" + "UltraExpanded", "'ultra-expanded'" + "ExtraExpanded", "'extra-expanded'" + "Expanded", "'expanded'" + ] + + let CanvasFontVariantCaps = + Pattern.EnumInlines "CanvasFontVariantCaps" [ + "Normal", "'normal'" + "SmallCaps", "'small-caps'" + "AllSmallCaps", "'all-small-caps'" + "PetiteCaps", "'petite-caps'" + "AllPetiteCaps", "'all-petite-caps'" + "Unicase", "'unicase'" + "TitlingCaps", "'titling-caps'" + ] + + let CanvasTextRendering = Pattern.EnumStrings "CanvasTextRendering" ["auto"; "optimizeSpeed"; "optimizeLegibility"; "geometricPrecision"] + + let CanvasTextDrawingStyles = + Interface "CanvasTextDrawingStyles" + |+> [ + "font" =@ T + "textAlign" =@ TextAlign + "textBaseline" =@ TextBaseline + "direction" =@ TextDirection + "letterSpacing" =@ T + "fontKerning" =@ CanvasFontKerning + "fontStretch" =@ CanvasFontStretch + "fontVariantCaps" =@ CanvasFontVariantCaps + "textRendering" =@ CanvasTextRendering + "wordSpacing" =@ T + ] + + let CanvasRenderingContext2D = + Class "CanvasRenderingContext2D" + |=> Implements + [ + CanvasState + CanvasTransform + CanvasCompositing + CanvasImageSmoothing + CanvasFillStrokeStyles + CanvasShadowStyles + CanvasFilters + CanvasRect + CanvasDrawPath + CanvasUserInterface + CanvasText + CanvasDrawImage + CanvasImageData + CanvasPathDrawingStyles + CanvasTextDrawingStyles + CanvasPath + ] + |+> Instance [ + "canvas" =? Decl.HTMLCanvasElementClass + ] + + let OffScreenCanvas = + Class "OffScreenCanvas" + module AudioVideoCommon = let TimeRanges = @@ -448,95 +1220,6 @@ module EventHandlers = "onpaste" =@ eh ] -module TypedArrays = - - - let ArrayBuffer = - Class "ArrayBuffer" - |+> Instance [ - "byteLength" =? T - /// Warning: although part of the spec, may not work in IE10 as of 6/6/2013. - "slice" => T * T ^-> TSelf - ] - |+> Static [ Constructor T ] - - module DataView = - - let private Getter<'T> name = - name => T?byteOffset * !? T?littleEndian ^-> T<'T> - - let private Setter<'T> name = - name => T?byteOffset * T<'T>?value * !? T?littleEndian ^-> T - - let Class = - Class "DataView" - |+> Static [ - Constructor ArrayBuffer - Constructor (ArrayBuffer * T?byteOffset) - Constructor (ArrayBuffer * T?byteOffset * T?byteLength) - ] - |+> Instance [ - "getInt8" => T?byteOffset ^-> T - "getUint8" => T?byteOffset ^-> T - Getter "getInt16" - Getter "getUint16" - Getter "getInt32" - Getter "getUint32" - Getter "getFloat32" - Getter "getFloat64" - "setInt8" => T?byteOffset * T?value ^-> T - "setUint8" => T?byteOffset * T?value ^-> T - Setter "setInt16" - Setter "setUint16" - Setter "setInt32" - Setter "setUint32" - Setter "setFloat32" - Setter "setFloat64" - ] - - let ArrayBufferView = - Class "ArrayBufferView" - |+> Instance - [ - "buffer" =? ArrayBuffer - "byteOffset" =? T - "byteLength" =? T - ] - - let private MakeTypedArray typedArray (elementType: Type.Type) = - Class typedArray - |=> Inherits ArrayBufferView - |+> Static [ - Constructor T - Constructor T - Constructor TSelf - Constructor (Type.ArrayOf elementType) - Constructor (ArrayBuffer?buffer * !? T?byteOffset * !? T?length) - "BYTES_PER_ELEMENT" =? T - ] - |+> Instance [ - "length" =? T - "get" => - T?offset ^-> elementType - |> WithInline "$this[$offset]" - "set" => - T?offset * elementType?value ^-> T - |> WithInline "void($this[$offset]=$value)" - "set" => TSelf?array * !? T?offset ^-> T - "set" => (Type.ArrayOf elementType)?array * !? T?offset ^-> T - "subarray" => T?``begin`` * T?``end`` ^-> TSelf - ] - - let Int8Array = MakeTypedArray "Int8Array" T - let Uint8Array = MakeTypedArray "Uint8Array" T - let Uint8ClampedArray = MakeTypedArray "Uint8ClampedArray" T - let Int16Array = MakeTypedArray "Int16Array" T - let Uint16Array = MakeTypedArray "Uint16Array" T - let Int32Array = MakeTypedArray "Int32Array" T - let Uint32Array = MakeTypedArray "Uint32Array" T - let Float32Array = MakeTypedArray "Float32Array" T - let Float64Array = MakeTypedArray "Float64Array" T - module Streamable = let ReadableStream = @@ -1271,15 +1954,37 @@ module Elements = ] let CanvasElement = + Decl.HTMLCanvasElementClass + |=> Inherits HTMLElement + |+> Instance [ + "width" =@ T + "height" =@ T + "toDataURL" => !? T?a * !? T?b ^-> T + "getContext" => T ^-> Canvas.CanvasRenderingContext2D + "captureStream" => T ^-> Media.MediaStream + "toBlob" => T ^-> File.Blob + "transferControlToOffScreen" => T ^-> Canvas.OffscreenCanvasClass + ] + + let OldCanvasElement = Class "CanvasElement" |=> Inherits HTMLElement + |+> Static [ + Constructor T + |> ObsoleteWithMessage "CanvasElement is now obsolete, use HTMLCanvasElement instead" + |> WithInline "new HTMLCanvasElement()" + ] |+> Instance [ "width" =@ T "height" =@ T "toDataURL" => !? T?a * !? T?b ^-> T "getContext" => T ^-> Canvas.CanvasRenderingContext2D + "captureStream" => T ^-> Media.MediaStream + "toBlob" => T ^-> File.Blob + "transferControlToOffScreen" => T ^-> Canvas.OffscreenCanvasClass ] + let HTMLMediaElement = Class "HTMLMediaElement" |=> Inherits HTMLElement @@ -1348,7 +2053,7 @@ module Elements = ] let HTMLVideoElement = - Class "HTMLVideoElement" + Decl.HTMLVideoElementClass |=> Inherits HTMLMediaElement |+> Instance [ "width" =@ T @@ -1881,7 +2586,10 @@ module General = let Navigator = Class "Navigator" - |+> Instance ["geolocation" =? Geolocation.Geolocation] + |+> Instance [ + "geolocation" =? Geolocation.Geolocation + "mediaDevices" =? Media.MediaDevices + ] let MQL = Class "MediaQueryList" @@ -2905,8 +3613,52 @@ module Definition = Canvas.TextBaseline Canvas.TextDirection Canvas.TextMetrics + Canvas.OffscreenCanvasClass + Canvas.PredefinedColorSpace + Canvas.CanvasState + Canvas.CanvasTransform + Canvas.CanvasCompositing + Canvas.CanvasImageSmoothing + Canvas.CanvasFillStrokeStyles + Canvas.CanvasShadowStyles + Canvas.CanvasFilters + Canvas.CanvasRect + Canvas.CanvasDrawPath + Canvas.CanvasUserInterface + Canvas.CanvasText + Canvas.CanvasDrawImage + Canvas.CanvasImageData + Canvas.CanvasPathDrawingStyles + Canvas.CanvasTextDrawingStyles + Canvas.CanvasPath + Canvas.Path2D + Canvas.CanvasFillRule + Canvas.ImageDataSettings + Canvas.ImageSmoothingQuality + Canvas.CanvasTextRendering + Canvas.CanvasFontVariantCaps + Canvas.CanvasFontKerning + Canvas.CanvasFontStretch + + Decl.SVGImageElementClass + Decl.HTMLImageElementClass + + Geometry.DOMMatrixInit + Geometry.DOMMatrix2DInit + Geometry.DOMMatrixReadOnly + Geometry.DOMMatrix + Geometry.DOMQuadInit + Geometry.DOMQuad + Geometry.DOMRectInit + Geometry.DOMRectReadOnly + Geometry.DOMRect + Geometry.DOMPointInit + Geometry.DOMPointReadOnly + Geometry.DOMPoint + Elements.HTMLElement Elements.CanvasElement + Elements.OldCanvasElement Elements.HTMLAudioElement Elements.HTMLVideoElement Elements.HTMLMediaElement @@ -2978,6 +3730,28 @@ module Definition = General.CSSSD General.MQL + Media.MediaStream + Media.MediaStreamTrack + Media.CanvasCaptureMediaStreamTrack + Media.ConstrainBooleanParameters + Media.ConstrainDOMStringParameters + Media.ConstrainDoubleRange + Media.ConstrainULongRange + Media.InputDeviceInfo + Media.MediaDeviceInfo + Media.MediaDeviceKind + Media.MediaStreamTrackContentHint + Media.MediaDevices + Media.MediaStreamTrackEvent + Media.MediaStreamTrackState + Media.ULongRange + Media.DoubleRange + Media.MediaTrackSupportedConstraints + Media.MediaTrackSettings + Media.MediaTrackCapabilities + Media.MediaTrackConstraints + Media.MediaTrackConstraintSet + Streamable.ReadableStream Streamable.WritableStream Streamable.QueuingStrategy diff --git a/tests/WebSharper.Html5.Tests/JSBindings.fs b/tests/WebSharper.Html5.Tests/JSBindings.fs index ca4db600d..4ccd7a7e3 100644 --- a/tests/WebSharper.Html5.Tests/JSBindings.fs +++ b/tests/WebSharper.Html5.Tests/JSBindings.fs @@ -41,6 +41,8 @@ let BrowserVersion() = let regexstr = "(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)" let regexp = new RegExp(regexstr, "i") let m = regexp.Exec(ua) + let x = null :> MediaStreamTrackClass + let p = x.ContentHint let m1, m2 = if Array.length m >= 3 then m.[1], m.[2] diff --git a/tests/WebSharper.Html5.Tests/Tests.fs b/tests/WebSharper.Html5.Tests/Tests.fs index 6380eb533..04effe2d2 100644 --- a/tests/WebSharper.Html5.Tests/Tests.fs +++ b/tests/WebSharper.Html5.Tests/Tests.fs @@ -68,7 +68,7 @@ module SamplesInternals = Elt("canvas").OnAfterInsert(fun e -> e.SetAttribute("height", string height) e.SetAttribute("width", string width) - let context = As(e).GetContext "2d" + let context = As(e).GetContext "2d" f context )