# # # Nim's Runtime Library # (c) Copyright 2012 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. # ## Declaration of the Document Object Model for the `JavaScript backend ## `_. when not defined(js) and not defined(Nimdoc): {.error: "This module only works on the JavaScript platform".} const DomApiVersion* = 3 ## the version of DOM API we try to follow. No guarantees though. type EventTarget* = ref EventTargetObj EventTargetObj {.importc.} = object of RootObj onabort*: proc (event: Event) {.nimcall.} onblur*: proc (event: Event) {.nimcall.} onchange*: proc (event: Event) {.nimcall.} onclick*: proc (event: Event) {.nimcall.} ondblclick*: proc (event: Event) {.nimcall.} onerror*: proc (event: Event) {.nimcall.} onfocus*: proc (event: Event) {.nimcall.} onkeydown*: proc (event: Event) {.nimcall.} onkeypress*: proc (event: Event) {.nimcall.} onkeyup*: proc (event: Event) {.nimcall.} onload*: proc (event: Event) {.nimcall.} onmousedown*: proc (event: Event) {.nimcall.} onmousemove*: proc (event: Event) {.nimcall.} onmouseout*: proc (event: Event) {.nimcall.} onmouseover*: proc (event: Event) {.nimcall.} onmouseup*: proc (event: Event) {.nimcall.} onreset*: proc (event: Event) {.nimcall.} onselect*: proc (event: Event) {.nimcall.} onsubmit*: proc (event: Event) {.nimcall.} onunload*: proc (event: Event) {.nimcall.} # https://developer.mozilla.org/en-US/docs/Web/Events DomEvent* {.pure.} = enum Abort = "abort", BeforeInput = "beforeinput", Blur = "blur", Click = "click", CompositionEnd = "compositionend", CompositionStart = "compositionstart", CompositionUpdate = "compositionupdate", DblClick = "dblclick", Error = "error", Focus = "focus", FocusIn = "focusin", FocusOut = "focusout", Input = "input", KeyDown = "keydown", KeyPress = "keypress", KeyUp = "keyup", Load = "load", MouseDown = "mousedown", MouseEnter = "mouseenter", MouseLeave = "mouseleave", MouseMove = "mousemove", MouseOut = "mouseout", MouseOver = "mouseover", MouseUp = "mouseup", Resize = "resize", Scroll = "scroll", Select = "select", Unload = "unload", Wheel = "wheel" PerformanceMemory* {.importc.} = ref object jsHeapSizeLimit*: float totalJSHeapSize*: float usedJSHeapSize*: float PerformanceTiming* {.importc.} = ref object connectStart*: float domComplete*: float domContentLoadedEventEnd*: float domContentLoadedEventStart*: float domInteractive*: float domLoading*: float domainLookupEnd*: float domainLookupStart*: float fetchStart*: float loadEventEnd*: float loadEventStart*: float navigationStart*: float redirectEnd*: float redirectStart*: float requestStart*: float responseEnd*: float responseStart*: float secureConnectionStart*: float unloadEventEnd*: float unloadEventStart*: float Performance* {.importc.} = ref object memory*: PerformanceMemory timing*: PerformanceTiming Window* = ref WindowObj WindowObj {.importc.} = object of EventTargetObj document*: Document event*: Event history*: History location*: Location closed*: bool defaultStatus*: cstring devicePixelRatio*: float innerHeight*, innerWidth*: int locationbar*: ref LocationBar menubar*: ref MenuBar name*: cstring outerHeight*, outerWidth*: int pageXOffset*, pageYOffset*: int scrollX*: float scrollY*: float personalbar*: ref PersonalBar scrollbars*: ref ScrollBars statusbar*: ref StatusBar status*: cstring toolbar*: ref ToolBar frames*: seq[Frame] screen*: Screen performance*: Performance onpopstate*: proc (event: Event) Frame* = ref FrameObj FrameObj {.importc.} = object of WindowObj ClassList* = ref ClassListObj ClassListObj {.importc.} = object of RootObj NodeType* = enum ElementNode = 1, AttributeNode, TextNode, CDATANode, EntityRefNode, EntityNode, ProcessingInstructionNode, CommentNode, DocumentNode, DocumentTypeNode, DocumentFragmentNode, NotationNode Node* = ref NodeObj NodeObj {.importc.} = object of EventTargetObj attributes*: seq[Node] childNodes*: seq[Node] children*: seq[Node] data*: cstring firstChild*: Node lastChild*: Node nextSibling*: Node nodeName*: cstring nodeType*: NodeType nodeValue*: cstring parentNode*: Node previousSibling*: Node innerHTML*: cstring style*: Style Document* = ref DocumentObj DocumentObj {.importc.} = object of NodeObj alinkColor*: cstring bgColor*: cstring body*: Element charset*: cstring cookie*: cstring defaultCharset*: cstring fgColor*: cstring head*: Element lastModified*: cstring linkColor*: cstring referrer*: cstring title*: cstring URL*: cstring vlinkColor*: cstring anchors*: seq[AnchorElement] forms*: seq[FormElement] images*: seq[ImageElement] applets*: seq[Element] embeds*: seq[EmbedElement] links*: seq[LinkElement] Element* = ref ElementObj ElementObj {.importc.} = object of NodeObj classList*: ClassList checked*: bool defaultChecked*: bool defaultValue*: cstring disabled*: bool form*: FormElement name*: cstring readOnly*: bool options*: seq[OptionElement] selectedOptions*: seq[OptionElement] clientWidth*, clientHeight*: int contentEditable*: cstring isContentEditable*: bool dir*: cstring offsetHeight*: int offsetWidth*: int offsetLeft*: int offsetTop*: int # https://developer.mozilla.org/en-US/docs/Web/API/ValidityState ValidityState* = ref ValidityStateObj ValidityStateObj {.importc.} = object badInput*: bool customError*: bool patternMismatch*: bool rangeOverflow*: bool rangeUnderflow*: bool stepMismatch*: bool tooLong*: bool tooShort*: bool typeMismatch*: bool valid*: bool valueMissing*: bool # https://developer.mozilla.org/en-US/docs/Web/API/Blob Blob* = ref BlobObj BlobObj {.importc.} = object of RootObj size*: int `type`*: cstring # https://developer.mozilla.org/en-US/docs/Web/API/File File* = ref FileObj FileObj {.importc.} = object of Blob lastModified*: int name*: cstring # https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement InputElement* = ref InputElementObj InputElementObj {.importc.} = object of Element # Properties related to the parent form formAction*: cstring formEncType*: cstring formMethod*: cstring formNoValidate*: bool formTarget*: cstring # Properties that apply to any type of input element that is not hidden `type`*: cstring autofocus*: bool required*: bool value*: cstring validity*: ValidityState validationMessage*: cstring willValidate*: bool # Properties that apply only to elements of type "checkbox" or "radio" indeterminate*: bool # Properties that apply only to elements of type "image" alt*: cstring height*: cstring src*: cstring width*: cstring # Properties that apply only to elements of type "file" accept*: cstring files*: seq[Blob] # Properties that apply only to text/number-containing or elements autocomplete*: cstring maxLength*: int size*: int pattern*: cstring placeholder*: cstring min*: cstring max*: cstring selectionStart*: int selectionEnd*: int selectionDirection*: cstring # Properties not yet categorized dirName*: cstring accessKey*: cstring list*: Element multiple*: bool labels*: seq[Element] step*: cstring valueAsDate*: cstring valueAsNumber*: float LinkElement* = ref LinkObj LinkObj {.importc.} = object of ElementObj target*: cstring text*: cstring x*: int y*: int EmbedElement* = ref EmbedObj EmbedObj {.importc.} = object of ElementObj height*: int hspace*: int src*: cstring width*: int `type`*: cstring vspace*: int AnchorElement* = ref AnchorObj AnchorObj {.importc.} = object of ElementObj text*: cstring x*, y*: int OptionElement* = ref OptionObj OptionObj {.importc.} = object of ElementObj defaultSelected*: bool selected*: bool selectedIndex*: int text*: cstring value*: cstring # https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement FormElement* = ref FormObj FormObj {.importc.} = object of ElementObj acceptCharset*: cstring action*: cstring autocomplete*: cstring elements*: seq[Element] encoding*: cstring enctype*: cstring length*: int `method`*: cstring noValidate*: bool target*: cstring ImageElement* = ref ImageObj ImageObj {.importc.} = object of ElementObj border*: int complete*: bool height*: int hspace*: int lowsrc*: cstring src*: cstring vspace*: int width*: int Style* = ref StyleObj StyleObj {.importc.} = object of RootObj background*: cstring backgroundAttachment*: cstring backgroundColor*: cstring backgroundImage*: cstring backgroundPosition*: cstring backgroundRepeat*: cstring border*: cstring borderBottom*: cstring borderBottomColor*: cstring borderBottomStyle*: cstring borderBottomWidth*: cstring borderColor*: cstring borderLeft*: cstring borderLeftColor*: cstring borderLeftStyle*: cstring borderLeftWidth*: cstring borderRight*: cstring borderRightColor*: cstring borderRightStyle*: cstring borderRightWidth*: cstring borderStyle*: cstring borderTop*: cstring borderTopColor*: cstring borderTopStyle*: cstring borderTopWidth*: cstring borderWidth*: cstring bottom*: cstring captionSide*: cstring clear*: cstring clip*: cstring color*: cstring cursor*: cstring direction*: cstring display*: cstring emptyCells*: cstring cssFloat*: cstring font*: cstring fontFamily*: cstring fontSize*: cstring fontStretch*: cstring fontStyle*: cstring fontVariant*: cstring fontWeight*: cstring height*: cstring left*: cstring letterSpacing*: cstring lineHeight*: cstring listStyle*: cstring listStyleImage*: cstring listStylePosition*: cstring listStyleType*: cstring margin*: cstring marginBottom*: cstring marginLeft*: cstring marginRight*: cstring marginTop*: cstring maxHeight*: cstring maxWidth*: cstring minHeight*: cstring minWidth*: cstring overflow*: cstring padding*: cstring paddingBottom*: cstring paddingLeft*: cstring paddingRight*: cstring paddingTop*: cstring pageBreakAfter*: cstring pageBreakBefore*: cstring pointerEvents*: cstring position*: cstring right*: cstring scrollbar3dLightColor*: cstring scrollbarArrowColor*: cstring scrollbarBaseColor*: cstring scrollbarDarkshadowColor*: cstring scrollbarFaceColor*: cstring scrollbarHighlightColor*: cstring scrollbarShadowColor*: cstring scrollbarTrackColor*: cstring tableLayout*: cstring textAlign*: cstring textDecoration*: cstring textIndent*: cstring textTransform*: cstring transform*: cstring top*: cstring verticalAlign*: cstring visibility*: cstring width*: cstring wordSpacing*: cstring zIndex*: int EventPhase* = enum None = 0, CapturingPhase, AtTarget, BubblingPhase # https://developer.mozilla.org/en-US/docs/Web/API/Event Event* = ref EventObj EventObj {.importc.} = object of RootObj bubbles*: bool cancelBubble*: bool cancelable*: bool composed*: bool currentTarget*: Node defaultPrevented*: bool eventPhase*: int target*: Node `type`*: cstring isTrusted*: bool # https://developer.mozilla.org/en-US/docs/Web/API/UIEvent UIEvent* = ref UIEventObj UIEventObj {.importc.} = object of Event detail*: int64 view*: Window # https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent KeyboardEvent* = ref KeyboardEventObj KeyboardEventObj {.importc.} = object of UIEvent altKey*, ctrlKey*, metaKey*, shiftKey*: bool code*: cstring isComposing*: bool key*: cstring keyCode*: int location*: int # https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values KeyboardEventKey* {.pure.} = enum # Modifier keys Alt, AltGraph, CapsLock, Control, Fn, FnLock, Hyper, Meta, NumLock, ScrollLock, Shift, Super, Symbol, SymbolLock, # Whitespace keys ArrowDown, ArrowLeft, ArrowRight, ArrowUp, End, Home, PageDown, PageUp, # Editing keys Backspace, Clear, Copy, CrSel, Cut, Delete, EraseEof, ExSel, Insert, Paste, Redo, Undo, # UI keys Accept, Again, Attn, Cancel, ContextMenu, Escape, Execute, Find, Finish, Help, Pause, Play, Props, Select, ZoomIn, ZoomOut, # Device keys BrigtnessDown, BrigtnessUp, Eject, LogOff, Power, PowerOff, PrintScreen, Hibernate, Standby, WakeUp, # Common IME keys AllCandidates, Alphanumeric, CodeInput, Compose, Convert, Dead, FinalMode, GroupFirst, GroupLast, GroupNext, GroupPrevious, ModeChange, NextCandidate, NonConvert, PreviousCandidate, Process, SingleCandidate, # Korean keyboards only HangulMode, HanjaMode, JunjaMode, # Japanese keyboards only Eisu, Hankaku, Hiragana, HiraganaKatakana, KanaMode, KanjiMode, Katakana, Romaji, Zenkaku, ZenkakuHanaku, # Function keys F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, Soft1, Soft2, Soft3, Soft4, # Phone keys AppSwitch, Call, Camera, CameraFocus, EndCall, GoBack, GoHome, HeadsetHook, LastNumberRedial, Notification, MannerMode, VoiceDial, # Multimedia keys ChannelDown, ChannelUp, MediaFastForward, MediaPause, MediaPlay, MediaPlayPause, MediaRecord, MediaRewind, MediaStop, MediaTrackNext, MediaTrackPrevious, # Audio control keys AudioBalanceLeft, AudioBalanceRight, AudioBassDown, AudioBassBoostDown, AudioBassBoostToggle, AudioBassBoostUp, AudioBassUp, AudioFaderFront, AudioFaderRear, AudioSurroundModeNext, AudioTrebleDown, AudioTrebleUp, AudioVolumeDown, AUdioVolumeMute, AudioVolumeUp, MicrophoneToggle, MicrophoneVolumeDown, MicrophoneVolumeMute, MicrophoneVolumeUp, # TV control keys TV, TV3DMode, TVAntennaCable, TVAudioDescription, TVAudioDescriptionMixDown, TVAudioDescriptionMixUp, TVContentsMenu, TVDataService, TVInput, TVInputComponent1, TVInputComponent2, TVInputComposite1, TVInputComposite2, TVInputHDMI1, TVInputHDMI2, TVInputHDMI3, TVInputHDMI4, TVInputVGA1, TVMediaContext, TVNetwork, TVNumberEntry, TVPower, TVRadioService, TVSatellite, TVSatelliteBS, TVSatelliteCS, TVSatelliteToggle, TVTerrestrialAnalog, TVTerrestrialDigital, TVTimer, # Media controller keys AVRInput, AVRPower, ColorF0Red, ColorF1Green, ColorF2Yellow, ColorF3Blue, ColorF4Grey, ColorF5Brown, ClosedCaptionToggle, Dimmer, DisplaySwap, DVR, Exit, FavoriteClear0, FavoriteClear1, FavoriteClear2, FavoriteClear3, FavoriteRecall0, FavoriteRecall1, FavoriteRecall2, FavoriteRecall3, FavoriteStore0, FavoriteStore1, FavoriteStore2, FavoriteStore3, Guide, GuideNextDay, GuidePreviousDay, Info, InstantReplay, Link, ListProgram, LiveContent, Lock, MediaApps, MediaAudioTrack, MediaLast, MediaSkipBackward, MediaSkipForward, MediaStepBackward, MediaStepForward, MediaTopMenu, NavigateIn, NavigateNext, NavigateOut, NavigatePrevious, NextFavoriteChannel, NextUserProfile, OnDemand, Pairing, PinPDown, PinPMove, PinPUp, PlaySpeedDown, PlaySpeedReset, PlaySpeedUp, RandomToggle, RcLowBattery, RecordSpeedNext, RfBypass, ScanChannelsToggle, ScreenModeNext, Settings, SplitScreenToggle, STBInput, STBPower, Subtitle, Teletext, VideoModeNext, Wink, ZoomToggle, # Speech recognition keys SpeechCorrectionList, SpeechInputToggle, # Document keys Close, New, Open, Print, Save, SpellCheck, MailForward, MailReply, MailSend, # Application selector keys LaunchCalculator, LaunchCalendar, LaunchContacts, LaunchMail, LaunchMediaPlayer, LaunchMusicPlayer, LaunchMyComputer, LaunchPhone, LaunchScreenSaver, LaunchSpreadsheet, LaunchWebBrowser, LaunchWebCam, LaunchWordProcessor, LaunchApplication1, LaunchApplication2, LaunchApplication3, LaunchApplication4, LaunchApplication5, LaunchApplication6, LaunchApplication7, LaunchApplication8, LaunchApplication9, LaunchApplication10, LaunchApplication11, LaunchApplication12, LaunchApplication13, LaunchApplication14, LaunchApplication15, LaunchApplication16, # Browser control keys BrowserBack, BrowserFavorites, BrowserForward, BrowserHome, BrowserRefresh, BrowserSearch, BrowserStop, # Numeric keypad keys Key11, Key12, Separator MouseButtons* = enum NoButton = 0, PrimaryButton = 1, SecondaryButton = 2, AuxilaryButton = 4, FourthButton = 8, FifthButton = 16 # https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent MouseEvent* = ref MouseEventObj MouseEventObj {.importc.} = object of UIEvent altKey*, ctrlKey*, metaKey*, shiftKey*: bool button*: int buttons*: int clientX*, clientY*: int movementX*, movementY*: int offsetX*, offsetY*: int pageX*, pageY*: int relatedTarget*: EventTarget #region*: cstring screenX*, screenY*: int x*, y*: int DataTransferItemKind* {.pure.} = enum File = "file", String = "string" # https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItem DataTransferItem* = ref DataTransferItemObj DataTransferItemObj {.importc.} = object of RootObj kind*: cstring `type`*: cstring # https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer DataTransfer* = ref DataTransferObj DataTransferObj {.importc.} = object of RootObj dropEffect*: cstring effectAllowed*: cstring files*: seq[Element] items*: seq[DataTransferItem] types*: seq[cstring] DataTransferDropEffect* {.pure.} = enum None = "none", Copy = "copy", Link = "link", Move = "move" DataTransferEffectAllowed* {.pure.} = enum None = "none", Copy = "copy", CopyLink = "copyLink", CopyMove = "copyMove", Link = "link", LinkMove = "linkMove", Move = "move", All = "all", Uninitialized = "uninitialized" DragEventTypes* = enum Drag = "drag", DragEnd = "dragend", DragEnter = "dragenter", DragExit = "dragexit", DragLeave = "dragleave", DragOver = "dragover", DragStart = "dragstart", Drop = "drop" # https://developer.mozilla.org/en-US/docs/Web/API/DragEvent DragEvent* {.importc.} = object of MouseEvent dataTransfer*: DataTransfer TouchList* {.importc.} = ref object of RootObj length*: int Touch* = ref TouchObj TouchObj {.importc.} = object of RootObj identifier*: int screenX*, screenY*, clientX*, clientY*, pageX*, pageY*: int target*: Element radiusX*, radiusY*: int rotationAngle*: int force*: float TouchEvent* = ref TouchEventObj TouchEventObj {.importc.} = object of UIEvent changedTouches*, targetTouches*, touches*: seq[Touch] Location* = ref LocationObj LocationObj {.importc.} = object of RootObj hash*: cstring host*: cstring hostname*: cstring href*: cstring pathname*: cstring port*: cstring protocol*: cstring search*: cstring History* = ref HistoryObj HistoryObj {.importc.} = object of RootObj length*: int Navigator* = ref NavigatorObj NavigatorObj {.importc.} = object of RootObj appCodeName*: cstring appName*: cstring appVersion*: cstring cookieEnabled*: bool language*: cstring platform*: cstring userAgent*: cstring mimeTypes*: seq[ref MimeType] Plugin* {.importc.} = object of RootObj description*: cstring filename*: cstring name*: cstring MimeType* {.importc.} = object of RootObj description*: cstring enabledPlugin*: ref Plugin suffixes*: seq[cstring] `type`*: cstring LocationBar* {.importc.} = object of RootObj visible*: bool MenuBar* = LocationBar PersonalBar* = LocationBar ScrollBars* = LocationBar ToolBar* = LocationBar StatusBar* = LocationBar Screen = ref ScreenObj ScreenObj {.importc.} = object of RootObj availHeight*: int availWidth*: int colorDepth*: int height*: int pixelDepth*: int width*: int TimeOut* {.importc.} = ref object of RootObj Interval* {.importc.} = object of RootObj AddEventListenerOptions* = object capture*: bool once*: bool passive*: bool proc id*(n: Node): cstring {.importcpp: "#.id", nodecl.} proc `id=`*(n: Node; x: cstring) {.importcpp: "#.id = #", nodecl.} proc class*(n: Node): cstring {.importcpp: "#.className", nodecl.} proc `class=`*(n: Node; v: cstring) {.importcpp: "#.className = #", nodecl.} proc value*(n: Node): cstring {.importcpp: "#.value", nodecl.} proc `value=`*(n: Node; v: cstring) {.importcpp: "#.value = #", nodecl.} proc `disabled=`*(n: Node; v: bool) {.importcpp: "#.disabled = #", nodecl.} when defined(nodejs): # we provide a dummy DOM for nodejs for testing purposes proc len*(x: Node): int = x.childNodes.len proc `[]`*(x: Node; idx: int): Element = assert idx >= 0 and idx < x.childNodes.len result = cast[Element](x.childNodes[idx]) var document* = Document(nodeType: DocumentNode) proc getElem(x: Element; id: cstring): Element = if x.id == id: return x for i in 0..= 0 and rect.left >= 0 and rect.bottom <= clientHeight().float and rect.right <= clientWidth().float proc scrollTop*(e: Node): int {.importcpp: "#.scrollTop", nodecl.} proc scrollLeft*(e: Node): int {.importcpp: "#.scrollLeft", nodecl.} proc scrollHeight*(e: Node): int {.importcpp: "#.scrollHeight", nodecl.} proc scrollWidth*(e: Node): int {.importcpp: "#.scrollWidth", nodecl.} proc offsetHeight*(e: Node): int {.importcpp: "#.offsetHeight", nodecl.} proc offsetWidth*(e: Node): int {.importcpp: "#.offsetWidth", nodecl.} proc offsetTop*(e: Node): int {.importcpp: "#.offsetTop", nodecl.} proc offsetLeft*(e: Node): int {.importcpp: "#.offsetLeft", nodecl.}