├── .github └── workflows │ └── nix.yml ├── .gitignore ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── Makefile ├── README.md ├── dune-project ├── examples ├── dom_example.re └── dune ├── flake.lock ├── flake.nix ├── melange-webapi.opam ├── scripts └── eventTemplate.re ├── sed.js ├── src ├── Webapi.re ├── Webapi │ ├── Canvas │ │ ├── Webapi__Canvas__Canvas2d.re │ │ └── Webapi__Canvas__WebGl.re │ ├── Dom │ │ ├── Webapi__Dom__AnimationEvent.re │ │ ├── Webapi__Dom__Attr.re │ │ ├── Webapi__Dom__BeforeUnloadEvent.re │ │ ├── Webapi__Dom__CdataSection.re │ │ ├── Webapi__Dom__CharacterData.re │ │ ├── Webapi__Dom__ChildNode.re │ │ ├── Webapi__Dom__ClipboardEvent.re │ │ ├── Webapi__Dom__CloseEvent.re │ │ ├── Webapi__Dom__Comment.re │ │ ├── Webapi__Dom__CompositionEvent.re │ │ ├── Webapi__Dom__CssStyleDeclaration.re │ │ ├── Webapi__Dom__CustomEvent.re │ │ ├── Webapi__Dom__Document.re │ │ ├── Webapi__Dom__DocumentFragment.re │ │ ├── Webapi__Dom__DocumentOrShadowRoot.re │ │ ├── Webapi__Dom__DocumentType.re │ │ ├── Webapi__Dom__DomImplementation.re │ │ ├── Webapi__Dom__DomRect.re │ │ ├── Webapi__Dom__DomStringMap.re │ │ ├── Webapi__Dom__DomTokenList.re │ │ ├── Webapi__Dom__DragEvent.re │ │ ├── Webapi__Dom__Element.re │ │ ├── Webapi__Dom__ErrorEvent.re │ │ ├── Webapi__Dom__Event.re │ │ ├── Webapi__Dom__EventTarget.re │ │ ├── Webapi__Dom__FocusEvent.re │ │ ├── Webapi__Dom__GlobalEventHandlers.re │ │ ├── Webapi__Dom__History.re │ │ ├── Webapi__Dom__HtmlCollection.re │ │ ├── Webapi__Dom__HtmlDocument.re │ │ ├── Webapi__Dom__HtmlElement.re │ │ ├── Webapi__Dom__HtmlFormElement.re │ │ ├── Webapi__Dom__HtmlImageElement.re │ │ ├── Webapi__Dom__HtmlInputElement.re │ │ ├── Webapi__Dom__IdbVersionChangeEvent.re │ │ ├── Webapi__Dom__Image.re │ │ ├── Webapi__Dom__InputEvent.re │ │ ├── Webapi__Dom__KeyboardEvent.re │ │ ├── Webapi__Dom__Location.re │ │ ├── Webapi__Dom__MouseEvent.re │ │ ├── Webapi__Dom__MutationObserver.re │ │ ├── Webapi__Dom__MutationRecord.re │ │ ├── Webapi__Dom__NamedNodeMap.re │ │ ├── Webapi__Dom__Node.re │ │ ├── Webapi__Dom__NodeFilter.re │ │ ├── Webapi__Dom__NodeIterator.re │ │ ├── Webapi__Dom__NodeList.re │ │ ├── Webapi__Dom__NonDocumentTypeChildNode.re │ │ ├── Webapi__Dom__NonElementParentNode.re │ │ ├── Webapi__Dom__PageTransitionEvent.re │ │ ├── Webapi__Dom__ParentNode.re │ │ ├── Webapi__Dom__PointerEvent.re │ │ ├── Webapi__Dom__PopStateEvent.re │ │ ├── Webapi__Dom__ProcessingInstruction.re │ │ ├── Webapi__Dom__ProgressEvent.re │ │ ├── Webapi__Dom__Range.re │ │ ├── Webapi__Dom__RelatedEvent.re │ │ ├── Webapi__Dom__Selection.re │ │ ├── Webapi__Dom__ShadowRoot.re │ │ ├── Webapi__Dom__Slotable.re │ │ ├── Webapi__Dom__StorageEvent.re │ │ ├── Webapi__Dom__SvgZoomEvent.re │ │ ├── Webapi__Dom__Text.re │ │ ├── Webapi__Dom__TimeEvent.re │ │ ├── Webapi__Dom__TouchEvent.re │ │ ├── Webapi__Dom__TrackEvent.re │ │ ├── Webapi__Dom__TransitionEvent.re │ │ ├── Webapi__Dom__TreeWalker.re │ │ ├── Webapi__Dom__Types.re │ │ ├── Webapi__Dom__UiEvent.re │ │ ├── Webapi__Dom__ValidityState.re │ │ ├── Webapi__Dom__WebGlContextEvent.re │ │ ├── Webapi__Dom__WheelEvent.re │ │ └── Webapi__Dom__Window.re │ ├── ResizeObserver │ │ └── Webapi__ResizeObserver__ResizeObserverEntry.re │ ├── Webapi__Base64.re │ ├── Webapi__Blob.re │ ├── Webapi__Canvas.re │ ├── Webapi__Dom.re │ ├── Webapi__File.re │ ├── Webapi__Performance.re │ ├── Webapi__ReadableStream.re │ ├── Webapi__ResizeObserver.re │ └── Webapi__Url.re └── dune └── tests ├── Webapi ├── Canvas │ └── Webapi__Canvas__Canvas2d__test.re ├── Dom │ ├── Webapi__Dom__AnimationEvent__test.re │ ├── Webapi__Dom__BeforeUnloadEvent__test.re │ ├── Webapi__Dom__ClipboardEvent__test.re │ ├── Webapi__Dom__CloseEvent__test.re │ ├── Webapi__Dom__CompositionEvent__test.re │ ├── Webapi__Dom__CustomEvent__test.re │ ├── Webapi__Dom__Document__test.re │ ├── Webapi__Dom__DomStringMap__test.re │ ├── Webapi__Dom__DomTokenList__test.re │ ├── Webapi__Dom__DragEvent__test.re │ ├── Webapi__Dom__Element__test.re │ ├── Webapi__Dom__ErrorEvent__test.re │ ├── Webapi__Dom__EventTarget__test.re │ ├── Webapi__Dom__Event__test.re │ ├── Webapi__Dom__FocusEvent__test.re │ ├── Webapi__Dom__GlobalEventHandlers__test.re │ ├── Webapi__Dom__History__test.re │ ├── Webapi__Dom__HtmlDocument__test.re │ ├── Webapi__Dom__HtmlElement__test.re │ ├── Webapi__Dom__HtmlFormElement__test.re │ ├── Webapi__Dom__IdbVersionChangeEvent__test.re │ ├── Webapi__Dom__Image__test.re │ ├── Webapi__Dom__InputEvent__test.re │ ├── Webapi__Dom__KeyboardEvent__test.re │ ├── Webapi__Dom__Location__test.re │ ├── Webapi__Dom__MouseEvent__test.re │ ├── Webapi__Dom__NodeList__test.re │ ├── Webapi__Dom__Node__test.re │ ├── Webapi__Dom__PageTransitionEvent__test.re │ ├── Webapi__Dom__PointerEvent__test.re │ ├── Webapi__Dom__PopStateEvent__test.re │ ├── Webapi__Dom__ProgressEvent__test.re │ ├── Webapi__Dom__Range__test.re │ ├── Webapi__Dom__RelatedEvent__test.re │ ├── Webapi__Dom__Selection__test.re │ ├── Webapi__Dom__StorageEvent__test.re │ ├── Webapi__Dom__SvgZoomEvent__test.re │ ├── Webapi__Dom__Text__test.re │ ├── Webapi__Dom__TimeEvent__test.re │ ├── Webapi__Dom__TouchEvent__test.re │ ├── Webapi__Dom__TrackEvent__test.re │ ├── Webapi__Dom__TransitionEvent__test.re │ ├── Webapi__Dom__UiEvent__test.re │ ├── Webapi__Dom__WebGlContextEvent__test.re │ ├── Webapi__Dom__WheelEvent__test.re │ └── Webapi__Dom__Window__test.re ├── Webapi__Base64__test.re ├── Webapi__Blob__test.re ├── Webapi__File__test.re ├── Webapi__Performace__test.re ├── Webapi__ReadableStream__test.re ├── Webapi__ResizeObserver__test.re └── Webapi__Url__test.re ├── dune └── testHelpers.re /.github/workflows/nix.yml: -------------------------------------------------------------------------------- 1 | name: "Nix Build" 2 | on: 3 | pull_request: 4 | push: 5 | branches: 6 | - main 7 | 8 | concurrency: 9 | group: ${{ github.workflow }}-${{ github.ref }} 10 | cancel-in-progress: true 11 | 12 | jobs: 13 | tests: 14 | runs-on: ubuntu-latest 15 | strategy: 16 | matrix: 17 | ocamlVersion: [5_1] 18 | steps: 19 | - uses: actions/checkout@v2 20 | - uses: cachix/install-nix-action@v21 21 | with: 22 | extra_nix_config: | 23 | extra-substituters = https://anmonteiro.nix-cache.workers.dev 24 | extra-trusted-public-keys = ocaml.nix-cache.com-1:/xI2h2+56rwFfKyyFVbkJSeGqSIYMC/Je+7XXqGKDIY= 25 | - name: "Run Nix tests" 26 | run: nix build .# 27 | 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .merlin 3 | .bsb.lock 4 | docs/ 5 | node_modules/ 6 | lib/* 7 | !lib/js/tests 8 | lib/js/tests/testHelpers.js 9 | npm-debug.log 10 | _opam 11 | _build 12 | .vscode/ 13 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ### Unreleased 2 | 3 | * feat: bind to new FormData(HtmlFormElement) by @andreypopp (#13) 4 | 5 | ### 0.20.0 6 | 7 | * Migrate to Melange 8 | * Remove bsdoc 9 | 10 | ### 0.19.2 11 | 12 | * Removed peer dependency on `bsdoc` 13 | 14 | ### 0.19.1 15 | 16 | * Removed dev dependency on `bsdoc` to allow smooth installs on non-Mac 17 | OS 18 | 19 | ### 0.19.0 20 | 21 | * Added bindings to `ReadableStream` 22 | * Added `Webapi.Url.makeWith` 23 | * Deprecated `Webapi.Url.makeWithBase` in favor of `Webapi.Url.makeWith` 24 | * (Breaking) Fixed the binding for `Webapi.Url.URLSearchParams.entries` 25 | to return `(string, string)` 26 | * Added `Webapi.Dom.Node.replaceChild` 27 | 28 | ### 0.18.0 29 | 30 | * Upgraded to bs-platform@7.1.0 and added API doc generation 31 | * Added `bs-fetch` dependency for `FormData` bindings 32 | * Added bindings for `Blob` and `File` 33 | * Deprecated `File._type` for `File.type_` 34 | 35 | ### 0.17.1 (2020-07-01) 36 | * Deprecated `Webapi.Dom.eventPhase` in favour of 37 | `Webapi.Dom.EventPhase.t` 38 | 39 | ### 0.17.0 (2020-06-29) 40 | * (Breaking) fixed `Canvas2d.putImageData`, unfortunately this needs to 41 | be a breaking change because the JavaScript method itself doesn't 42 | accept optional arguments 43 | 44 | ### 0.16.2 (2020-06-29) 45 | * Fixed `document instanceof HTMLDocument` check to ensure it works 46 | across windows 47 | 48 | ### 0.16.1 (2020-06-24) 49 | * Fixed `element instanceof HTMLElement` check to ensure it works for 50 | elements from different windows 51 | * Un-deprecated the unsafe downcast functions 52 | 53 | ### 0.16.0 (2020-06-16) 54 | * Fixed `DomStringMap.unsafeDeleteKey` for BuckleScript 8 55 | * Removed `main` file from `package.json` 56 | * Removed JS outputs except for tests 57 | * Enabled more warnings and errors 58 | * Used `instanceof` to implement downcasts and deprecated the unsafe 59 | downcasts 60 | 61 | ### 0.15.9 (2020-03-14) 62 | * Added `ResizeObserver` 63 | 64 | ### 0.15.8 (2020-02-22) 65 | * Added `Window.performance` and `Performance.now` 66 | 67 | ### 0.15.6 (2020-02-08) 68 | * `WheelEvent` now inherits the implementation of `MouseEvent` 69 | 70 | ### 0.15.6 (2019-11-20) 71 | * Added `DomStringMap` 72 | * Changed `Window.open_` to have optional `features` argument 73 | 74 | ### 0.15.5 - (2019-10-09) 75 | * Added `keypress` event handler API 76 | * Added `selectionchange` event handler API 77 | * Added `Text.ofNode` 78 | 79 | ### 0.15.4 - (2019-09-02) 80 | * Added `Selection.setBaseAndExtent` 81 | 82 | ### 0.15.3 - (2019-08-22) 83 | * Added `NodeList.forEach` 84 | * Added `Node.asNode` 85 | 86 | ### 0.15.2 - (2019-05-25) 87 | * Added `File.size` 88 | 89 | ### 0.15.1 - (2019-05-17) 90 | * Added `URLSearchParams.forEach` 91 | * Added `Element.scrollBy` and `Element.srollByWithOptions` 92 | 93 | ### 0.15.0 - (2019-05-11) 94 | * (Breaking) Changed `DomRect` coordinates to use `float` instead of `int` 95 | 96 | ### 0.14.4 - (2019-05-04) 97 | * Added `File.name` 98 | 99 | ### 0.14.3 - (2019-04-28) 100 | * Added `width`, `height`, `setWidth` and `setHeight` to `CanvasElement` 101 | 102 | ### 0.14.0 - (2019-04-15) 103 | * Removed deprecated `Webapi.Dom.onload` function 104 | * Removed deprecated `Webapi.File.Url` module alias 105 | * Restructured internal module layout (non-breaking for modules accessed through the `Webapi` top-level module, but breaking if internal `*Re` modules have been accessed directly) 106 | * Enforce private modules (effectively a formality and non-breaking) 107 | 108 | ### 0.13.6 - (2019-03-22) 109 | * Added `HtmlElement.focusPreventScroll` 110 | * Refined return type of `Node.cloneNode` and `Node.cloneDeepNode` so it now returns the specific type of the cloned node. 111 | 112 | ### 0.13.5 - (2019-03-15) 113 | * Added `Element.scrollTo`, `Element.scrollToWithOptions` 114 | 115 | ### 0.13.4 - (2019-02-24) 116 | * Added `URLSearchParams.makeWithDict` and `URLSearchParams.makeWithArray` 117 | 118 | ### 0.13.3 - (2019-02-19) 119 | * Added `bs.return nullable` to `URLSearchParams.get` since it returns `null`, not `undefined` and therefore does not autmatically conform to the runtime representation of `option` as previosuly assumed. 120 | 121 | ### 0.13.2 - (2019-01-16) 122 | * Fixed signature of `NamedNodeMap.toArray`, which returned `element` but should return `attr` (considere non-breaking since it was just plain wrong) 123 | * Added `add...` and `removePopStateEventListener` to `Window` 124 | * Added `add...` and `remove...` functions for touch and animation event listeners to `EventTarget` 125 | 126 | ### 0.13.1 - (2018-11-11) 127 | * Added `add...` and `remove...` functions for drag event listeners to `EventTarget` 128 | 129 | ### 0.13.0 - (2018-10-09) 130 | * (Breaking) Requires bs-platform > 4.0.0 131 | * (Breaking) Changed `FocusEvent.relatedTarget` to return `option` 132 | * Added `HtmlFormElement` and `HtmlInputElement` 133 | 134 | ### 0.12.0 - (2018-09-16) 135 | * (Breaking) Fixed return type if `StorageEvent.oldValue` and `StorageEvent.newValue`. They should be `nullable`, but were not. 136 | * Added `Url` and `UrlSearchParams` 137 | * Deprecated `Webapi.File.Url` in favor of `Webapi.Url` 138 | 139 | ### 0.11.0 - (2018-08-02) 140 | * `EventTarget.dispatchEvent` now take a `Dom.event_like(_)` instead of just `Dom.event`, so it will accept any event subtype. 141 | * `Window.pageXOffset`, `pageYOffset`, `scrollX`, `scrollY`, `scrollLeft` and `scrollTop` now return `float`s instead of `int`s, and `Window.scroll`, `scrollBy`, `scrollTo`, `setScrollLeft` and `setScrollTop` take `float`s instead of `int`s 142 | * `HtmlElement.offsetParent` now returns an `option` 143 | * `Selection.anchorNode` and `Selection.focusNode` now return `option`s 144 | * `Element.closest` now returns an `option` 145 | 146 | ### 0.10.0 - (2018-06-14) 147 | * Added inheritance of `HtmlElement` and its ancestors to `HtmlImageElement` 148 | * Deprecated `HtmlImageElement.onload` 149 | * Fixed inconsistencies with `HtmlImageElement.src` and `HtmlImageElement.getSrc`, breaking the API 150 | * Fleshed out `HtmlImageElement` 151 | 152 | ### 0.9.1 - (2018-04-19) 153 | * Renamed `Document.docType` to `Document.doctype` to fix #95 154 | 155 | ### 0.9.0 - (2018-04-17) 156 | * Support `bs-platform@3.0.0`. If your app isn't using that version, then don't upgrade to `0.9.0`; otherwise, please do! 157 | 158 | ### 0.8.0 - (2018-01-03) 159 | * Added `EventTarget.unsafeAsDocument`, `EventTarget.unsafeAsElement` and `EventTarget.unsafeAsWindow` functions 160 | * Removed deprecated `Bs_webapi` module` 161 | * Added event-specific listener APIs to `EventTarget`, e.g. `EventTarget.addMouseMoveListener(mouseEvent => ...)` 162 | * Added `requestCancellableAnimationFrame` and `cancelAnimationFrame` 163 | * Fixed msising `@bs.return` annotations causing type unsoundness 164 | * Fixed typo in encoding of `insertPosition` type 165 | * Added `Dom.HtmlImageElement`, `File` and `File.Url` 166 | * Fixed `HtmlElement.offsetParent` returning `int` instead of `Dom.Element` 167 | 168 | ### 0.7.0 - (2017-09-22) 169 | * Added `Webapi` module, Deprecated `Bs_webapi` 170 | * Removed deprecated Storage API 171 | * Add `Document.unsafeAshtmlDocument`, `Element.unsafeAsHtmlElement`. Deprecated `Document.asHtmlDocument`, `Element.asHtmlElement`, `HtmlEleement.ofElement`. 172 | * Changed `Dom.history` and `Dom.location` to use `window` instead of `document` 173 | 174 | ### 0.6.1 - (2017-09-10) 175 | * Fix incorrect heuristic in `HtmlElement.ofElement` 176 | 177 | ### 0.6.0 - (2017-09-10) 178 | * Renamed createText to CreateTextNode, according to spec 179 | * Deprecated Storage API, it's been upstreamed to `bs-platform` as `Dom.Storage` 180 | * Removed `ReasonJs` namespace. Use ` Bs_webapi` instead 181 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Thank you for contributing to `melange-webapi`. Please follow the steps here 2 | to help keep things smooth. 3 | 4 | ## Before starting 5 | 6 | Please ensure you are working on an open issue. If necessary, you can 7 | open the issue and then start working. This will give people a chance to 8 | verify the issue and potentially save work. 9 | 10 | Please ensure you turn off auto-formatting while working on this project. 11 | For historical reasons, it does not use auto-formatting. If you auto- 12 | format files in this project, it will lead to noisy diffs that will be 13 | hard to review. 14 | 15 | ## When creating a PR 16 | 17 | Please ensure the PR has the following: 18 | 19 | - A minimal description of the PR's purpose 20 | - A link to the issue at the end of the description, e.g. `Fix #19` 21 | - `@since ` directive in a doc comment if adding a new item in 22 | the code 23 | - Deprecates instead of removing items in minor versions 24 | - Adds new item to replace deprecated item 25 | - Adds doc comment on deprecated item 26 | - Adds changelog entry for the PR 27 | - Updates version number in `package.json`–if necessary–following SemVer 28 | 29 | Please use proper git commit messages. 30 | 31 | ## During review 32 | 33 | If you make any changes, please try to push new commits instead of force- 34 | pushing and wiping out the old ones. It helps when reviewing changes, and 35 | I will squash the branch when merging anyway. 36 | 37 | ## After PR merged or closed 38 | 39 | Thank you for your contribution. There is no calendar for publishing new 40 | versions, if you want your change to be released, reach out on 41 | [the Reason discord](https://discord.gg/reasonml). 42 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 reasonml-community 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | project_name = melange-webapi 2 | 3 | DUNE = opam exec -- dune 4 | 5 | .DEFAULT_GOAL := help 6 | 7 | .PHONY: help 8 | help: ## Print this help message 9 | @echo "List of available make commands"; 10 | @echo ""; 11 | @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-15s\033[0m %s\n", $$1, $$2}'; 12 | @echo ""; 13 | 14 | .PHONY: create-switch 15 | create-switch: ## Create opam switch 16 | opam switch create . 5.1.0~rc3 -y --deps-only 17 | 18 | .PHONY: init 19 | init: create-switch install ## Configure everything to develop this repository in local 20 | 21 | .PHONY: install 22 | install: ## Install development dependencies 23 | opam update 24 | opam install -y . --deps-only 25 | opam pin -y add $(project_name).dev . --working-dir 26 | 27 | .PHONY: build 28 | build: ## Build the project 29 | $(DUNE) build @melange 30 | 31 | .PHONY: build_verbose 32 | build_verbose: ## Build the project 33 | $(DUNE) build --verbose @melange 34 | 35 | .PHONY: clean 36 | clean: ## Clean build artifacts and other generated files 37 | $(DUNE) clean 38 | 39 | .PHONY: format 40 | format: ## Format the codebase with ocamlformat 41 | $(DUNE) build @fmt --auto-promote 42 | 43 | .PHONY: format-check 44 | format-check: ## Checks if format is correct 45 | $(DUNE) build @fmt 46 | 47 | .PHONY: watch 48 | watch: ## Watch for the filesystem and rebuild on every change 49 | $(DUNE) build --watch @melange 50 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # melange-webapi 2 | 3 | Bindings to the DOM and other Web APIs. 4 | 5 | The bindings are currently undocumented, but as the code mostly just consists of external declarations with type signatures, the code itself is fairly self-documenting. The bindings generally also correspond very well to the Web APIs they bind to, so using MDN along with GitHub should go a long way. 6 | 7 | ## Installation 8 | 9 | ```sh 10 | opam install melange-webapi 11 | ``` 12 | Then add `melange-webapi` to the `libraries` field in your `dune` file: 13 | ```lisp 14 | (libraries melange-webapi) 15 | ``` 16 | 17 | ## Usage 18 | 19 | See the [examples folder](https://github.com/melange-community/melange-webapi/blob/master/examples/) 20 | 21 | Please only use the modules exposed through the toplevel module `Webapi`, for example `Webapi.Dom.Element`. In particular, don't use the 'flat' modules like `Webapi__Dom__Element` as these are considered private and are not guaranteed to be backwards-compatible. 22 | 23 | ## Some notes on the DOM API 24 | 25 | The DOM API is mostly organized into interfaces and relies heavily on inheritance. The ergonomics of the API is also heavily dependent on dynamic typing, which makes it somewhat challenging to implement a thin binding layer that is both safe and ergonomic. To achieve this we employ subtyping and implementation inheritance, concepts which aren't very idiomatic to OCaml (or Reason), but all the more beneficial to understand in order to be able to use these bindings effectively. 26 | 27 | ### Subtyping 28 | 29 | The Dom types, and the relationships between them, are actually defined in the `Dom` module that ships with Melange ([Source code](https://github.com/melange-re/melange/blob/f954fd34e67106fc71ab64cf2bd309ace9b4d3db/jscomp/others/dom.ml)), where you'll find a bunch of types that look like this: 30 | 31 | ```reason 32 | type _element('a); 33 | type element_like('a) = node_like(_element('a)); 34 | type element = element_like(_baseClass); 35 | ``` 36 | 37 | This is subtyping implemented with abstract types and phantom arguments. The details of how this works isn't very important (but see [#23](https://github.com/reasonml-community/bs-webapi-incubator/pull/23) for a detailed explanation of how exactly this trickery works) in order to just use them, but there are a few things you should know: 38 | 39 | * If you expand the alias of a concrete DOM type, you'll discover it's actually a list of abstract types. e.g. `element` expands to `_baseClass _element _node _eventTarget_like` This means `element` is a subtype of `_element`, `_node` and `_eventTarget_like`. 40 | * The `_like` type are "open" (because they have a type variable). This means that a function accepting an `'a element_like` will accept any "supertype" of `element_like`. A function accepting just an `element` will only accept an `element` (Technically `element` is actually a "supertype" of `element_like` too). 41 | 42 | This system works exceptionally well, but has one significant flaw: It makes type errors even more complicated than they normally are. If you know what to look for it's not that bad, but unfortunately the formatting of these errors don't make looking for it any easier. We hope to improve that in other ways (see [BetterErrors](https://github.com/reasonml/BetterErrors)) 43 | 44 | ### Implementation inheritance 45 | 46 | If you've looked through the source code a bit, you've likely come across code like this: 47 | 48 | ```reason 49 | include Webapi__Dom__EventTarget.Impl({ type nonrec t = t }); 50 | include Webapi__Dom__Node.Impl({ type nonrec t = t }); 51 | include Webapi__Dom__ParentNode.Impl({ type nonrec t = t }); 52 | include Webapi__Dom__NonDocumentTypeChildNode.Impl({ type nonrec t = t }); 53 | include Webapi__Dom__ChildNode.Impl({ type nonrec t = t }); 54 | include Webapi__Dom__Slotable.Impl({ type nonrec t = t }); 55 | include Impl({ type nonrec t = t }); 56 | ``` 57 | 58 | This is the implementation inheritance. Each "inheritable" module defines an "Impl" module where all its exported functions are defined. `include Webapi__Dom__Node.Impl { type nonrec t = t };` means that all the functions in `Webapi__Dom__Node.Impl` should be included in this module, but with the `t` type of that module replaced by the `t` type of this one. And that's it, it now has all the functions. 59 | 60 | Implementation inheritance is used instead of subtyping to make it easier to understand which functions operate on any given "subject". If you have an `element` and you need to use a function defined in `Node`, let's say `removeChild` you cannot just use `Node.removeChild`. Instead you need to use `Element.removeChild`, which you can since `Element` inherits from `Node`. As a general rule, always use the function in the module corresponding to the type you have. You'll find this makes it very easy to see what types you're dealing with just by reading the code. 61 | 62 | ## Changes 63 | 64 | See [CHANGELOG.md](CHANGELOG.md). 65 | -------------------------------------------------------------------------------- /dune-project: -------------------------------------------------------------------------------- 1 | (lang dune 3.8) 2 | 3 | (using melange 0.1) 4 | 5 | (name melange-webapi) 6 | 7 | (generate_opam_files true) 8 | 9 | (source 10 | (github melange-community/melange-webapi)) 11 | 12 | (authors "Cheng Lou ") 13 | 14 | (maintainers 15 | "Javier Chávarri " 16 | "David Sancho ") 17 | 18 | (homepage "https://github.com/melange-community/melange-webapi") 19 | 20 | (bug_reports "https://github.com/melange-community/melange-webapi/issues") 21 | 22 | (license "MIT") 23 | 24 | (package 25 | (name melange-webapi) 26 | (synopsis "Melange bindings to the DOM") 27 | (description "Melange bindings to the DOM and other Web APIs.") 28 | (depends 29 | ocaml 30 | (melange 31 | (>= "5.0.1")) 32 | melange-fetch 33 | (reason 34 | (>= "3.10")) 35 | (ocaml-lsp-server :with-test))) 36 | -------------------------------------------------------------------------------- /examples/dom_example.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | 3 | /* Adapted from https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Examples#Example_7:_Displaying_Event_Object_Properties */ 4 | /* Option.map */ 5 | let map = (f) => 6 | fun 7 | | Some(v) => Some(f(v)) 8 | | None => None; 9 | 10 | let andThen = (f: 'a => option('b)) => 11 | fun 12 | | Some(v) => f(v) 13 | | None => None; 14 | 15 | let unwrapUnsafely = 16 | fun 17 | | Some(v) => v 18 | | None => raise(Invalid_argument("Passed `None` to unwrapUnsafely")); 19 | 20 | /* 21 | * These SHOULD type check 22 | */ 23 | let _className: string = 24 | document |> Document.createElement("div") 25 | |> Element.className; 26 | 27 | let _inner: option(string) = 28 | document |> Document.createElement("div") 29 | |> Element.nextElementSibling 30 | |> map(Element.innerText); /* innerText is a function that accepts a Node */ 31 | 32 | /* Before subtyping: 33 | document |> Document.createElement("div") 34 | |> Element.asNode 35 | |> Node.parentElement /* inherited from Node, returns DomRe.element */ 36 | |> map(Element.innerText); /* inherited from Node */ 37 | */ 38 | 39 | /* After subtyping: */ 40 | let _inner: option(string) = 41 | document |> Document.createElement("div") 42 | |> Element.parentElement /* inherited from Node, returns DomRe.element */ 43 | |> map(Element.innerText); /* inherited from Node */ 44 | 45 | let el = 46 | document |> Document.createElement("div") 47 | |> Element.asHtmlElement 48 | |> unwrapUnsafely; 49 | 50 | /* 51 | document |> Document.asHtmlDocument 52 | |> andThen(HtmlDocument.body) 53 | |> map(Element.appendChild(el)); 54 | */ 55 | 56 | /* Before subtyping: 57 | document |> Document.asHtmlDocument 58 | |> andThen(HtmlDocument.body) 59 | |> map(Element.appendChild (el |> HtmlElement.asNode)); 60 | */ 61 | 62 | /* After subtyping: */ 63 | let _unit: option(unit) = document |> Document.asHtmlDocument 64 | |> andThen(HtmlDocument.body) 65 | |> map(Element.appendChild(el)); 66 | 67 | /* 68 | /* 69 | * These MAY fail type check 70 | */ 71 | document |> Document.createElement("div") 72 | |> Element.nextElementSibling 73 | |> map(Node.innerText); 74 | 75 | /* 76 | * These SHOULD NOT type check 77 | */ 78 | document |> Document.createElement("div") 79 | |> Element.asNode 80 | |> Element.parentElement; /* inherited from Node, returns DomRe.element */ 81 | */ 82 | 83 | 84 | /* 85 | /* ideal, but requires piped setters */ 86 | switch (document |> body) { 87 | | Some body => 88 | document |> createElement("div") 89 | |> setInnerText("") 90 | |> setClassName("reason_tools_button") 91 | |> setOnClick(swap) 92 | |> (body |> appendChild); 93 | | None => 94 | ... 95 | } 96 | */ 97 | 98 | 99 | /* non-standard event-specific listener API - log screen coordinates of mouse cursor when moved */ 100 | document |> Document.createElement("div") 101 | |> Element.addMouseMoveEventListener(e => (MouseEvent.screenX(e), MouseEvent.screenY(e)) |> Js.log); 102 | -------------------------------------------------------------------------------- /examples/dune: -------------------------------------------------------------------------------- 1 | (melange.emit 2 | (target examples) 3 | (libraries webapi)) 4 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "nixpkgs": { 4 | "inputs": { 5 | "nixpkgs": "nixpkgs_2" 6 | }, 7 | "locked": { 8 | "lastModified": 1740353796, 9 | "narHash": "sha256-395SvQm4U8wlwe5ToE4jhPXEBF6Rb4J4dVDG3iKIWcI=", 10 | "owner": "nix-ocaml", 11 | "repo": "nix-overlays", 12 | "rev": "d4ac32c12590b5ce8a756374a20476af8769f839", 13 | "type": "github" 14 | }, 15 | "original": { 16 | "owner": "nix-ocaml", 17 | "repo": "nix-overlays", 18 | "type": "github" 19 | } 20 | }, 21 | "nixpkgs_2": { 22 | "locked": { 23 | "lastModified": 1740301968, 24 | "narHash": "sha256-eDAiNagpMExcLoSIgjdef2ZYyvjuy1VTF8r9OZXCMGc=", 25 | "owner": "NixOS", 26 | "repo": "nixpkgs", 27 | "rev": "b7fe81518095c48a8ba94fc7cfe5c0fc8370851b", 28 | "type": "github" 29 | }, 30 | "original": { 31 | "owner": "NixOS", 32 | "repo": "nixpkgs", 33 | "rev": "b7fe81518095c48a8ba94fc7cfe5c0fc8370851b", 34 | "type": "github" 35 | } 36 | }, 37 | "root": { 38 | "inputs": { 39 | "nixpkgs": "nixpkgs" 40 | } 41 | } 42 | }, 43 | "root": "root", 44 | "version": 7 45 | } 46 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | description = "melange-webapi Nix Flake"; 3 | 4 | inputs.nixpkgs.url = "github:nix-ocaml/nix-overlays"; 5 | 6 | outputs = { self, nixpkgs }: 7 | let 8 | forAllSystems = f: nixpkgs.lib.genAttrs nixpkgs.lib.systems.flakeExposed (system: 9 | let 10 | pkgs = nixpkgs.legacyPackages.${system}.extend (self: super: { 11 | ocamlPackages = super.ocaml-ng.ocamlPackages_5_3; 12 | }); 13 | in 14 | f pkgs); 15 | in 16 | { 17 | packages = forAllSystems (pkgs: 18 | let 19 | melange-webapi = with pkgs.ocamlPackages; buildDunePackage { 20 | pname = "melange-webapi"; 21 | version = "dev"; 22 | 23 | src = 24 | let fs = pkgs.lib.fileset; in 25 | fs.toSource { 26 | root = ./.; 27 | fileset = fs.unions [ 28 | ./dune-project 29 | ./melange-webapi.opam 30 | ./src 31 | ./tests 32 | ]; 33 | }; 34 | 35 | nativeBuildInputs = with pkgs.ocamlPackages; [ melange reason ]; 36 | propagatedBuildInputs = with pkgs.ocamlPackages; [ 37 | melange 38 | melange-fetch 39 | ]; 40 | }; 41 | in 42 | { 43 | inherit melange-webapi; 44 | default = melange-webapi; 45 | }); 46 | 47 | devShells = forAllSystems (pkgs: 48 | let 49 | mkShell = { buildInputs ? [ ] }: pkgs.mkShell { 50 | inputsFrom = [ self.packages.${pkgs.system}.melange-webapi ]; 51 | nativeBuildInputs = with pkgs; [ 52 | yarn 53 | nodejs_latest 54 | ] ++ (with pkgs.ocamlPackages; [ 55 | ocamlformat 56 | merlin 57 | ]); 58 | inherit buildInputs; 59 | }; 60 | 61 | in 62 | { 63 | default = mkShell { }; 64 | release = mkShell { 65 | buildInputs = with pkgs; [ cacert curl ocamlPackages.dune-release git ]; 66 | }; 67 | }); 68 | }; 69 | } 70 | -------------------------------------------------------------------------------- /melange-webapi.opam: -------------------------------------------------------------------------------- 1 | # This file is generated by dune, edit dune-project instead 2 | opam-version: "2.0" 3 | synopsis: "Melange bindings to the DOM" 4 | description: "Melange bindings to the DOM and other Web APIs." 5 | maintainer: [ 6 | "Javier Chávarri " 7 | "David Sancho " 8 | ] 9 | authors: ["Cheng Lou "] 10 | license: "MIT" 11 | homepage: "https://github.com/melange-community/melange-webapi" 12 | bug-reports: "https://github.com/melange-community/melange-webapi/issues" 13 | depends: [ 14 | "dune" {>= "3.8"} 15 | "ocaml" 16 | "melange" {>= "5.0.1"} 17 | "melange-fetch" 18 | "reason" {>= "3.10"} 19 | "ocaml-lsp-server" {with-test} 20 | "odoc" {with-doc} 21 | ] 22 | build: [ 23 | ["dune" "subst"] {dev} 24 | [ 25 | "dune" 26 | "build" 27 | "-p" 28 | name 29 | "-j" 30 | jobs 31 | "@install" 32 | "@runtest" {with-test} 33 | "@doc" {with-doc} 34 | ] 35 | ] 36 | dev-repo: "git+https://github.com/melange-community/melange-webapi.git" 37 | -------------------------------------------------------------------------------- /scripts/eventTemplate.re: -------------------------------------------------------------------------------- 1 | let typ = Node.Process.argv[2]; 2 | let name = Node.Process.argv[3]; 3 | let lname = name |> Js.String.toLowerCase; 4 | 5 | {j| 6 | [@mel.send] external add$(name)EventListener : ([@mel.as "$(lname)"] _, Dom.$(typ) => unit, [@mel.this] T.t) => unit = "addEventListener"; 7 | [@mel.send] external add$(name)EventListenerWithOptions : ([@mel.as "$(lname)"] _, Dom.$(typ) => unit, {. "capture": bool, "once": bool, "passive": bool}, [@mel.this] T.t) => unit = "addEventListener"; /* not widely supported */ 8 | [@mel.send] external add$(name)EventListenerUseCapture : ([@mel.as "$(lname)"] _, Dom.$(typ) => unit, [@mel.as {json|true|json}] _, [@mel.this] T.t) => unit = "addEventListener"; 9 | [@mel.send] external remove$(name)EventListener : ([@mel.as "$(lname)"] _, Dom.$(typ) => unit, [@mel.this] T.t) => unit = "removeEventListener"; 10 | [@mel.send] external remove$(name)EventListenerWithOptions : ([@mel.as "$(lname)"] _, Dom.$(typ) => unit, {. "capture": bool, "passive": bool}, [@mel.this] T.t) => unit = "removeEventListener"; /* not widely supported */ 11 | [@mel.send] external remove$(name)EventListenerUseCapture : ([@mel.as "$(lname)"] _, Dom.$(typ) => unit, [@mel.as {json|true|json}] _, [@mel.this] T.t) => unit = "removeEventListener"; 12 | |j} 13 | |> Js.log; 14 | -------------------------------------------------------------------------------- /sed.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var files = process.argv.slice(2); 3 | 4 | files.forEach(function(file) { 5 | var content = fs.readFileSync(file, {encoding: 'utf-8'}); 6 | content = content.replace(/t\[@@nonrec \]/g, 't'); 7 | if (file === 'src/fetch/fetchRe.ml') { 8 | content = content.replace('method =', '_method ='); 9 | } 10 | fs.writeFileSync(file, content, {encoding: 'utf-8'}); 11 | }); 12 | -------------------------------------------------------------------------------- /src/Webapi.re: -------------------------------------------------------------------------------- 1 | module Base64 = Webapi__Base64; 2 | 3 | /** @since 0.18.0 */ 4 | module Blob = Webapi__Blob; 5 | module Canvas = Webapi__Canvas; 6 | module Dom = Webapi__Dom; 7 | module File = Webapi__File; 8 | 9 | /** Re-export from [bs-fetch] for convenience. To use, you will also 10 | need to add the [bs-fetch] package as a dependency. 11 | 12 | To get the [FormData] of an HTML form, use 13 | [Webapi.Dom.HtmlFormElement.data]. 14 | 15 | @since 0.18.0 */ 16 | module FormData = { 17 | include Fetch.FormData; 18 | 19 | [@mel.new] 20 | external makeWithHtmlFormElement: (Dom.HtmlFormElement.t) => t = 21 | "FormData"; 22 | }; 23 | 24 | /** Re-export from [bs-fetch] for convenience. See also 25 | {!module:FormData}. 26 | 27 | @since 0.18.0 */ 28 | module Iterator = FormData.Iterator; 29 | 30 | module Performance = Webapi__Performance; 31 | 32 | /** @since 0.19.0 */ 33 | module ReadableStream = Webapi__ReadableStream; 34 | 35 | module ResizeObserver = Webapi__ResizeObserver; 36 | module Url = Webapi__Url; 37 | 38 | type rafId; 39 | 40 | external requestAnimationFrame: (float => unit) => unit = 41 | "requestAnimationFrame"; 42 | external requestCancellableAnimationFrame: (float => unit) => rafId = 43 | "requestAnimationFrame"; 44 | external cancelAnimationFrame: rafId => unit = "cancelAnimationFrame"; 45 | -------------------------------------------------------------------------------- /src/Webapi/Canvas/Webapi__Canvas__Canvas2d.re: -------------------------------------------------------------------------------- 1 | type t; /* Main type, representing the 2d canvas rendering context object */ 2 | type gradient; 3 | type pattern; 4 | type measureText; 5 | 6 | /* Sub-modules (and their interfaces) for string enum arguments: */ 7 | module type CompositeType = { 8 | type t = pri string; 9 | 10 | let sourceOver: t; 11 | let sourceIn: t; 12 | let sourceOut: t; 13 | let sourceAtop: t; 14 | let destinationOver: t; 15 | let destinationIn: t; 16 | let destinationOut: t; 17 | let destinationAtop: t; 18 | let lighter: t; 19 | let copy: t; 20 | let xor: t; 21 | }; 22 | 23 | module Composite: CompositeType = { 24 | type t = string; 25 | 26 | let sourceOver: t = "source-over"; 27 | let sourceIn: t = "source-in"; 28 | let sourceOut: t = "source-out"; 29 | let sourceAtop: t = "source-atop"; 30 | let destinationOver: t = "destination-over"; 31 | let destinationIn: t = "destination-in"; 32 | let destinationOut: t = "destination-out"; 33 | let destinationAtop: t = "destination-atop"; 34 | let lighter: t = "lighter"; 35 | let copy: t = "copy"; 36 | let xor: t = "xor"; 37 | }; 38 | 39 | module type LineCapType = { 40 | type t = pri string; 41 | 42 | let butt: t; 43 | let round: t; 44 | let square: t; 45 | }; 46 | 47 | module LineCap: LineCapType = { 48 | type t = string; 49 | 50 | let butt: t = "butt"; 51 | let round: t = "round"; 52 | let square: t = "square"; 53 | }; 54 | 55 | module type LineJoinType = { 56 | type t = pri string; 57 | 58 | let round: t; 59 | let bevel: t; 60 | let miter: t; 61 | }; 62 | 63 | module LineJoin: LineJoinType = { 64 | type t = string; 65 | 66 | let round: t = "round"; 67 | let bevel: t = "bevel"; 68 | let miter: t = "miter"; 69 | }; 70 | 71 | type image('a) = 72 | | Number: image(float) 73 | | ImageData: image(Webapi__Dom__Image.t); 74 | 75 | type style(_) = 76 | | String: style(string) 77 | | Gradient: style(gradient) 78 | | Pattern: style(pattern); 79 | 80 | /* 2d Canvas API, following https://simon.html5.org/dump/html5-canvas-cheat-sheet.html */ 81 | [@mel.send] external save: ([@mel.this] t) => unit = "save"; 82 | [@mel.send] external restore: ([@mel.this] t) => unit = "restore"; 83 | 84 | /* Transformation */ 85 | [@mel.send] 86 | external scale: (~x: float, ~y: float, [@mel.this] t) => unit = "scale"; 87 | [@mel.send] external rotate: (float, [@mel.this] t) => unit = "rotate"; 88 | [@mel.send] 89 | external translate: (~x: float, ~y: float, [@mel.this] t) => unit = 90 | "translate"; 91 | [@mel.send] 92 | external transform: 93 | ( 94 | ~m11: float, 95 | ~m12: float, 96 | ~m21: float, 97 | ~m22: float, 98 | ~dx: float, 99 | ~dy: float, 100 | [@mel.this] t 101 | ) => 102 | unit = 103 | "transform"; 104 | [@mel.send] 105 | external setTransform: 106 | ( 107 | ~m11: float, 108 | ~m12: float, 109 | ~m21: float, 110 | ~m22: float, 111 | ~dx: float, 112 | ~dy: float, 113 | [@mel.this] t 114 | ) => 115 | unit = 116 | "setTransform"; 117 | 118 | /* Compositing */ 119 | [@mel.set] external globalAlpha: (t, float) => unit = "globalAlpha"; 120 | [@mel.set] 121 | external globalCompositeOperation: (t, Composite.t) => unit = 122 | "globalCompositeOperation"; 123 | 124 | /* Line Styles */ 125 | [@mel.set] external lineWidth: (t, float) => unit = "lineWidth"; 126 | [@mel.set] external lineCap: (t, LineCap.t) => unit = "lineCap"; 127 | [@mel.set] external lineJoin: (t, LineJoin.t) => unit = "lineJoin"; 128 | [@mel.set] external miterLimit: (t, float) => unit = "miterLimit"; 129 | 130 | /* Colors, Styles, and Shadows */ 131 | [@mel.set] external setFillStyle: (t, 'a) => unit = "fillStyle"; 132 | [@mel.set] external setStrokeStyle: (t, 'a) => unit = "strokeStyle"; 133 | 134 | /* in re unused warnings 135 | awaiting release of https://github.com/bloomberg/bucklescript/issues/1656 136 | to just use [@@mel.set] directly with an ignored (style a) */ 137 | let setStrokeStyle = (type a, ctx: t, _: style(a), v: a) => 138 | setStrokeStyle(ctx, v); 139 | 140 | let setFillStyle = (type a, ctx: t, _: style(a), v: a) => 141 | setFillStyle(ctx, v); 142 | 143 | let reifyStyle = (type a, x: 'a): (style(a), a) => { 144 | module Internal = { 145 | type constructor; 146 | external canvasGradient: constructor = "CanvasGradient"; /* internal */ 147 | external canvasPattern: constructor = "CanvasPattern"; /* internal */ 148 | let instanceOf: ('a, constructor) => bool = [%mel.raw 149 | {|function(x,y) {return +(x instanceof y)}|} 150 | ]; /* internal */ 151 | }; 152 | 153 | ( 154 | if (Js.typeof(x) == "string") { 155 | Obj.magic(String); 156 | } else if (Internal.instanceOf(x, Internal.canvasGradient)) { 157 | Obj.magic(Gradient); 158 | } else if (Internal.instanceOf(x, Internal.canvasPattern)) { 159 | Obj.magic(Pattern); 160 | } else { 161 | raise( 162 | Invalid_argument( 163 | "Unknown canvas style kind. Known values are: String, CanvasGradient, CanvasPattern", 164 | ), 165 | ); 166 | }, 167 | Obj.magic(x), 168 | ); 169 | }; 170 | 171 | [@mel.get] external fillStyle: t => 'a = "fillStyle"; 172 | [@mel.get] external strokeStyle: t => 'a = "strokeStyle"; 173 | 174 | let fillStyle = (ctx: t) => ctx |> fillStyle |> reifyStyle; 175 | 176 | let strokeStyle = (ctx: t) => ctx |> strokeStyle |> reifyStyle; 177 | 178 | [@mel.set] external shadowOffsetX: (t, float) => unit = "shadowOffsetX"; 179 | [@mel.set] external shadowOffsetY: (t, float) => unit = "shadowOffsetY"; 180 | [@mel.set] external shadowBlur: (t, float) => unit = "shadowBlur"; 181 | [@mel.set] external shadowColor: (t, string) => unit = "shadowColor"; 182 | 183 | /* Gradients */ 184 | [@mel.send] 185 | external createLinearGradient: 186 | (~x0: float, ~y0: float, ~x1: float, ~y1: float, [@mel.this] t) => gradient = 187 | "createLinearGradient"; 188 | [@mel.send] 189 | external createRadialGradient: 190 | ( 191 | ~x0: float, 192 | ~y0: float, 193 | ~x1: float, 194 | ~y1: float, 195 | ~r0: float, 196 | ~r1: float, 197 | [@mel.this] t 198 | ) => 199 | gradient = 200 | "createRadialGradient"; 201 | [@mel.send] 202 | external addColorStop: (float, string, [@mel.this] gradient) => unit = 203 | "addColorStop"; 204 | 205 | external createPattern: 206 | ( 207 | t, 208 | Dom.element, 209 | [@mel.string] [ 210 | | `repeat 211 | | [@mel.as "repeat-x"] `repeatX 212 | | [@mel.as "repeat-y"] `repeatY 213 | | [@mel.as "no-repeat"] `noRepeat 214 | ] 215 | ) => 216 | pattern = 217 | "createPattern"; 218 | 219 | /* Paths */ 220 | [@mel.send] external beginPath: ([@mel.this] t) => unit = "beginPath"; 221 | [@mel.send] external closePath: ([@mel.this] t) => unit = "closePath"; 222 | [@mel.send] external fill: ([@mel.this] t) => unit = "fill"; 223 | [@mel.send] external stroke: ([@mel.this] t) => unit = "stroke"; 224 | [@mel.send] external clip: ([@mel.this] t) => unit = "clip"; 225 | [@mel.send] 226 | external moveTo: (~x: float, ~y: float, [@mel.this] t) => unit = "moveTo"; 227 | [@mel.send] 228 | external lineTo: (~x: float, ~y: float, [@mel.this] t) => unit = "lineTo"; 229 | [@mel.send] 230 | external quadraticCurveTo: 231 | (~cp1x: float, ~cp1y: float, ~x: float, ~y: float, [@mel.this] t) => unit = 232 | "quadraticCurveTo"; 233 | [@mel.send] 234 | external bezierCurveTo: 235 | ( 236 | ~cp1x: float, 237 | ~cp1y: float, 238 | ~cp2x: float, 239 | ~cp2y: float, 240 | ~x: float, 241 | ~y: float, 242 | [@mel.this] t 243 | ) => 244 | unit = 245 | "bezierCurveTo"; 246 | [@mel.send] 247 | external arcTo: 248 | (~x1: float, ~y1: float, ~x2: float, ~y2: float, ~r: float, [@mel.this] t) => 249 | unit = 250 | "arcTo"; 251 | [@mel.send] 252 | external arc: 253 | ( 254 | ~x: float, 255 | ~y: float, 256 | ~r: float, 257 | ~startAngle: float, 258 | ~endAngle: float, 259 | ~anticw: bool, 260 | [@mel.this] t 261 | ) => 262 | unit = 263 | "arc"; 264 | [@mel.send] 265 | external rect: 266 | (~x: float, ~y: float, ~w: float, ~h: float, [@mel.this] t) => unit = 267 | "rect"; 268 | [@mel.send] 269 | external isPointInPath: (~x: float, ~y: float, [@mel.this] t) => bool = 270 | "isPointInPath"; 271 | 272 | /* Text */ 273 | [@mel.set] external font: (t, string) => unit = "font"; 274 | [@mel.set] external textAlign: (t, string) => unit = "textAlign"; 275 | [@mel.set] external textBaseline: (t, string) => unit = "textBaseline"; 276 | [@mel.send] 277 | external fillText: 278 | (string, ~x: float, ~y: float, ~maxWidth: float=?, [@mel.this] t) => unit = 279 | "fillText"; 280 | [@mel.send] 281 | external strokeText: 282 | (string, ~x: float, ~y: float, ~maxWidth: float=?, [@mel.this] t) => unit = 283 | "strokeText"; 284 | [@mel.send] 285 | external measureText: (string, [@mel.this] t) => measureText = "measureText"; 286 | [@mel.get] external width: measureText => float = "width"; 287 | 288 | /* Rectangles */ 289 | [@mel.send] 290 | external fillRect: 291 | (~x: float, ~y: float, ~w: float, ~h: float, [@mel.this] t) => unit = 292 | "fillRect"; 293 | [@mel.send] 294 | external strokeRect: 295 | (~x: float, ~y: float, ~w: float, ~h: float, [@mel.this] t) => unit = 296 | "strokeRect"; 297 | [@mel.send] 298 | external clearRect: 299 | (~x: float, ~y: float, ~w: float, ~h: float, [@mel.this] t) => unit = 300 | "clearRect"; 301 | 302 | [@mel.send] 303 | external createImageDataCoords: 304 | (t, ~width: float, ~height: float) => Webapi__Dom__Image.t = 305 | "createImageData"; 306 | [@mel.send] 307 | external createImageDataFromImage: 308 | (t, Webapi__Dom__Image.t) => Webapi__Dom__Image.t = 309 | "createImageData"; 310 | 311 | [@mel.send] 312 | external getImageData: 313 | (t, ~sx: float, ~sy: float, ~sw: float, ~sh: float) => Webapi__Dom__Image.t = 314 | "getImageData"; 315 | 316 | [@mel.send] 317 | external putImageData: 318 | (t, ~imageData: Webapi__Dom__Image.t, ~dx: float, ~dy: float) => unit = 319 | "putImageData"; 320 | 321 | [@mel.send] 322 | external putImageDataWithDirtyRect: 323 | ( 324 | t, 325 | ~imageData: Webapi__Dom__Image.t, 326 | ~dx: float, 327 | ~dy: float, 328 | ~dirtyX: float, 329 | ~dirtyY: float, 330 | ~dirtyWidth: float, 331 | ~dirtyHeight: float 332 | ) => 333 | unit = 334 | "putImageData"; 335 | -------------------------------------------------------------------------------- /src/Webapi/Canvas/Webapi__Canvas__WebGl.re: -------------------------------------------------------------------------------- 1 | type glT; 2 | type programT; 3 | type shaderT; 4 | type bufferT; 5 | 6 | /* ClearBufferMask */ 7 | let _DEPTH_BUFFER_BIT: int = 256; 8 | let _STENCIL_BUFFER_BIT: int = 1024; 9 | let _COLOR_BUFFER_BIT: int = 16384; 10 | 11 | /* BeginMode */ 12 | let _POINTS: int = 0; 13 | let _LINES: int = 1; 14 | let _LINE_LOOP: int = 2; 15 | let _LINE_STRIP: int = 3; 16 | let _TRIANGLES: int = 4; 17 | let _TRIANGLE_STRIP: int = 5; 18 | let _TRIANGLE_FAN: int = 6; 19 | 20 | /* TEXTURE_2D */ 21 | let _CULL_FACE: int = 2884; 22 | let _BLEND: int = 3042; 23 | let _DITHER: int = 3024; 24 | let _STENCIL_TEST: int = 2960; 25 | let _DEPTH_TEST: int = 2929; 26 | let _SCISSOR_TEST: int = 3089; 27 | let _POLYGON_OFFSET_FILL: int = 32823; 28 | let _SAMPLE_ALPHA_TO_COVERAGE: int = 32926; 29 | let _SAMPLE_COVERAGE: int = 32928; 30 | 31 | /* BlendingFactorDest */ 32 | let _ZERO: int = 0; 33 | let _ONE: int = 1; 34 | let _SRC_COLOR: int = 768; 35 | let _ONE_MINUS_SRC_COLOR: int = 769; 36 | let _SRC_ALPHA: int = 770; 37 | let _ONE_MINUS_SRC_ALPHA: int = 771; 38 | let _DST_ALPHA: int = 772; 39 | let _ONE_MINUS_DST_ALPHA: int = 773; 40 | 41 | /* DataType */ 42 | let _BYTE: int = 5120; 43 | let _UNSIGNED_BYTE: int = 5121; 44 | let _SHORT: int = 5122; 45 | let _UNSIGNED_SHORT: int = 5123; 46 | let _INT: int = 5124; 47 | let _UNSIGNED_INT: int = 5125; 48 | let _FLOAT: int = 5126; 49 | 50 | /* CullFaceMode */ 51 | let _FRONT: int = 1028; 52 | let _BACK: int = 1029; 53 | let _FRONT_AND_BACK: int = 1032; 54 | 55 | /* Shaders */ 56 | let _FRAGMENT_SHADER: int = 35632; 57 | let _VERTEX_SHADER: int = 35633; 58 | 59 | /* Buffer Objects */ 60 | let _ARRAY_BUFFER: int = 34962; 61 | let _ELEMENT_ARRAY_BUFFER: int = 34963; 62 | let _ARRAY_BUFFER_BINDING: int = 34964; 63 | let _ELEMENT_ARRAY_BUFFER_BINDING: int = 34965; 64 | let _STREAM_DRAW: int = 35040; 65 | let _STATIC_DRAW: int = 35044; 66 | let _DYNAMIC_DRAW: int = 35048; 67 | 68 | /* void clear(GLbitfield mask); */ 69 | [@mel.send] external clear: (glT, int) => unit = "clear"; 70 | /* void clearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); */ 71 | [@mel.send] 72 | external clearColor: (glT, float, float, float, float) => unit = "clearColor"; 73 | /* void enable(GLenum cap); */ 74 | [@mel.send] external enable: (glT, int) => unit = "enable"; 75 | /* void disable(GLenum cap); */ 76 | [@mel.send] external disable: (glT, int) => unit = "disable"; 77 | /* void blendFunc(GLenum sfactor, GLenum dfactor); */ 78 | [@mel.send] external blendFunc: (glT, int, int) => unit = "blendFunc"; 79 | /* void cullFace(GLenum mode); */ 80 | [@mel.send] external cullFace: (glT, int) => unit = "cullFace"; 81 | [@mel.send] external createBuffer: glT => bufferT = "createBuffer"; 82 | [@mel.send] external deleteBuffer: (glT, bufferT) => unit = "deleteBuffer"; 83 | [@mel.send] external bindBuffer: (glT, int, bufferT) => unit = "bindBuffer"; 84 | [@mel.send] 85 | external bufferData: (glT, int, Js.Typed_array.Uint16Array.t, int) => unit = 86 | "bufferData"; 87 | [@mel.send] 88 | external bufferFloatData: 89 | (glT, int, Js.Typed_array.Float32Array.t, int) => unit = 90 | "bufferData"; 91 | [@mel.send] external createProgram: glT => programT = "createProgram"; 92 | [@mel.send] external linkProgram: (glT, programT) => unit = "linkProgram"; 93 | [@mel.send] external useProgram: (glT, programT) => unit = "useProgram"; 94 | [@mel.send] 95 | external getProgramInfoLog: (glT, programT) => string = "getProgramInfoLog"; 96 | [@mel.send] 97 | external bindAttribLocation: (glT, programT, int, string) => unit = 98 | "bindAttribLocation"; 99 | [@mel.send] external createShader: (glT, int) => shaderT = "createShader"; 100 | [@mel.send] 101 | external shaderSource: (glT, shaderT, string) => unit = "shaderSource"; 102 | [@mel.send] external compileShader: (glT, shaderT) => unit = "compileShader"; 103 | [@mel.send] 104 | external attachShader: (glT, programT, shaderT) => unit = "attachShader"; 105 | [@mel.send] 106 | external getShaderInfoLog: (glT, shaderT) => string = "getShaderInfoLog"; 107 | /* void drawElements(GLenum mode, GLsizei count, GLenum type, GLintptr offset); */ 108 | [@mel.send] 109 | external drawElements: (glT, int, int, int, int) => unit = "drawElements"; 110 | /* void enableVertexAttribArray(GLuint index); */ 111 | [@mel.send] 112 | external enableVertexAttribArray: (glT, int) => unit = 113 | "enableVertexAttribArray"; 114 | /* void vertexAttribPointer(GLuint indx, GLint size, GLenum type, 115 | GLboolean normalized, GLsizei stride, GLintptr offset); */ 116 | [@mel.send] 117 | external vertexAttribPointer: (glT, int, int, int, bool, int, int) => unit = 118 | "vertexAttribPointer"; 119 | /* GLint gl.getAttribLocation(program, name); */ 120 | [@mel.send] 121 | external getAttribLocation: (glT, programT, string) => int = 122 | "getAttribLocation"; 123 | /* void gl.drawArrays(mode, first, count); */ 124 | [@mel.send] external drawArrays: (glT, int, int, int) => unit = "drawArrays"; 125 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__AnimationEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.animationEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | 7 | [@mel.new] external make: string => t = "AnimationEvent"; 8 | [@mel.new] 9 | external makeWithOptions: (string, Js.t({..})) => t = "AnimationEvent"; 10 | 11 | [@mel.get] external animationName: t => string = "animationName"; 12 | [@mel.get] external elapsedTime: t => float = "elapsedTime"; 13 | [@mel.get] 14 | external pseudoElement: t => string /* enum-ish */ = "pseudoElement"; 15 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__Attr.re: -------------------------------------------------------------------------------- 1 | type t = Dom.attr; 2 | 3 | include Webapi__Dom__Node.Impl({ 4 | type nonrec t = t; 5 | }); 6 | include Webapi__Dom__EventTarget.Impl({ 7 | type nonrec t = t; 8 | }); 9 | 10 | [@mel.get] external namespaceURI: t => string = "namespaceURI"; 11 | [@mel.get] external prefix: t => string = "prefix"; 12 | [@mel.get] external localName: t => string = "localName"; 13 | [@mel.get] external name: t => string = "name"; 14 | [@mel.get] external value: t => string = "value"; 15 | [@mel.get] [@mel.return nullable] 16 | external ownerElement: t => option(Dom.element) = "ownerElement"; 17 | [@mel.get] external specified: t => bool = "specified"; /* useless; always returns true (exact wording from spec) */ 18 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__BeforeUnloadEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.beforeUnloadEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | 7 | [@mel.new] external make: string => t = "BeforeUnloadEvent"; 8 | [@mel.new] 9 | external makeWithOptions: (string, Js.t({..})) => t = "BeforeUnloadEvent"; 10 | 11 | [@mel.get] external returnValue: t => string = "returnValue"; 12 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__CdataSection.re: -------------------------------------------------------------------------------- 1 | type t = Dom.cdataSection; 2 | 3 | include Webapi__Dom__Node.Impl({ type nonrec t = t; }); 4 | include Webapi__Dom__EventTarget.Impl({ type nonrec t = t; }); 5 | include Webapi__Dom__CharacterData.Impl({ type nonrec t = t; }); 6 | include Webapi__Dom__NonDocumentTypeChildNode.Impl({ type nonrec t = t; }); 7 | include Webapi__Dom__ChildNode.Impl({ type nonrec t = t; }); 8 | include Webapi__Dom__Slotable.Impl({ type nonrec t = t; }); 9 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__CharacterData.re: -------------------------------------------------------------------------------- 1 | module Impl = (T: { 2 | type t; 3 | }) => { 4 | [@mel.get] external data: T.t => string = "data"; 5 | [@mel.get] external length: T.t => int = "length"; 6 | 7 | [@mel.send] 8 | external substringData: 9 | (~offset: int, ~count: int, [@mel.this] T.t) => string = 10 | "substringData"; 11 | [@mel.send] 12 | external appendData: (string, [@mel.this] T.t) => unit = "appendData"; 13 | [@mel.send] 14 | external insertData: (~offset: int, string, [@mel.this] T.t) => unit = 15 | "insertData"; 16 | [@mel.send] 17 | external deleteData: (~offset: int, ~count: int, [@mel.this] T.t) => unit = 18 | "deleteData"; 19 | [@mel.send] 20 | external replaceData: 21 | (~offset: int, ~count: int, string, [@mel.this] T.t) => unit = 22 | "replaceData"; 23 | }; 24 | 25 | type t = Dom.characterData; 26 | 27 | include Webapi__Dom__Node.Impl({ 28 | type nonrec t = t; 29 | }); 30 | include Webapi__Dom__EventTarget.Impl({ 31 | type nonrec t = t; 32 | }); 33 | include Webapi__Dom__NonDocumentTypeChildNode.Impl({ 34 | type nonrec t = t; 35 | }); 36 | include Webapi__Dom__ChildNode.Impl({ 37 | type nonrec t = t; 38 | }); 39 | include Impl({ 40 | type nonrec t = t; 41 | }); 42 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__ChildNode.re: -------------------------------------------------------------------------------- 1 | /* Mixin */ 2 | module Impl = (T: { 3 | type t; 4 | }) => { 5 | [@mel.send] external remove: ([@mel.this] T.t) => unit = "remove"; 6 | }; 7 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__ClipboardEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.clipboardEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | 7 | [@mel.new] external make: string => t = "ClipboardEvent"; 8 | [@mel.new] 9 | external makeWithOptions: (string, Js.t({..})) => t = "ClipboardEvent"; 10 | 11 | [@mel.get] external clipboardData: t => Dom.dataTransfer = "clipboardData"; 12 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__CloseEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.closeEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | 7 | [@mel.new] external make: string => t = "CloseEvent"; 8 | [@mel.new] external makeWithOptions: (string, Js.t({..})) => t = "CloseEvent"; 9 | 10 | [@mel.get] external wasClean: t => bool = "wasClean"; 11 | [@mel.get] external code: t => int = "code"; 12 | [@mel.get] external reason: t => string = "reason"; 13 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__Comment.re: -------------------------------------------------------------------------------- 1 | type t = Dom.comment; 2 | 3 | include Webapi__Dom__Node.Impl({ type nonrec t = t; }); 4 | include Webapi__Dom__EventTarget.Impl({ type nonrec t = t; }); 5 | include Webapi__Dom__CharacterData.Impl({ type nonrec t = t; }); 6 | include Webapi__Dom__NonDocumentTypeChildNode.Impl({ type nonrec t = t; }); 7 | include Webapi__Dom__ChildNode.Impl({ type nonrec t = t; }); 8 | include Webapi__Dom__Slotable.Impl({ type nonrec t = t; }); 9 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__CompositionEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.compositionEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | include Webapi__Dom__UiEvent.Impl({ 7 | type nonrec t = t; 8 | }); 9 | 10 | [@mel.new] external make: string => t = "CompositionEvent"; 11 | [@mel.new] 12 | external makeWithOptions: (string, Js.t({..})) => t = "CompositionEvent"; 13 | 14 | [@mel.get] external data: t => string = "data"; 15 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__CssStyleDeclaration.re: -------------------------------------------------------------------------------- 1 | type t = Dom.cssStyleDeclaration; 2 | type cssRule; /* TODO: Move to Webapi__Dom */ 3 | 4 | [@mel.get] external cssText: t => string = "cssText"; 5 | [@mel.set] external setCssText: (t, string) => unit = "cssText"; 6 | [@mel.get] external length: t => int = "length"; 7 | [@mel.get] external parentRule: t => cssRule = "parentRule"; 8 | 9 | [@mel.send] 10 | external getPropertyPriority: (string, [@mel.this] t) => string = 11 | "getPropertyPriority"; 12 | [@mel.send] 13 | external getPropertyValue: (string, [@mel.this] t) => string = 14 | "getPropertyValue"; 15 | [@mel.send] external item: (int, [@mel.this] t) => string = "item"; 16 | [@mel.send] 17 | external removeProperty: (string, [@mel.this] t) => string = "removeProperty"; 18 | [@mel.send] 19 | external setProperty: (string, string, string, [@mel.this] t) => unit = 20 | "setProperty" /* [@mel.send] external setPropertyValue : (string, string) => ([@mel.this] t) => unit = "setPropertyValue";*/; /* not mentioned by MDN and not implemented by chrome, but in the CSSOM spec: https://drafts.csswg.org/cssom/#the-cssstyledeclaration-interface */ 21 | 22 | /* CSS2Properties */ 23 | 24 | [@mel.get] external azimuth: t => string = "azimuth"; 25 | [@mel.get] external background: t => string = "background"; 26 | [@mel.get] external backgroundAttachment: t => string = "backgroundAttachment"; 27 | [@mel.get] external backgroundColor: t => string = "backgroundColor"; 28 | [@mel.get] external backgroundImage: t => string = "backgroundImage"; 29 | [@mel.get] external backgroundPosition: t => string = "backgroundPosition"; 30 | [@mel.get] external backgroundRepeat: t => string = "backgroundRepeat"; 31 | [@mel.get] external border: t => string = "border"; 32 | [@mel.get] external borderCollapse: t => string = "borderCollapse"; 33 | [@mel.get] external borderColor: t => string = "borderColor"; 34 | [@mel.get] external borderSpacing: t => string = "borderSpacing"; 35 | [@mel.get] external borderStyle: t => string = "borderStyle"; 36 | [@mel.get] external borderTop: t => string = "borderTop"; 37 | [@mel.get] external borderRight: t => string = "borderRight"; 38 | [@mel.get] external borderBottom: t => string = "borderBottom"; 39 | [@mel.get] external borderLeft: t => string = "borderLeft"; 40 | [@mel.get] external borderTopColor: t => string = "borderTopColor"; 41 | [@mel.get] external borderRightColor: t => string = "borderRightColor"; 42 | [@mel.get] external borderBottomColor: t => string = "borderBottomColor"; 43 | [@mel.get] external borderLeftColor: t => string = "borderLeftColor"; 44 | [@mel.get] external borderTopStyle: t => string = "borderTopStyle"; 45 | [@mel.get] external borderRightStyle: t => string = "borderRightStyle"; 46 | [@mel.get] external borderBottomStyle: t => string = "borderBottomStyle"; 47 | [@mel.get] external borderLeftStyle: t => string = "borderLeftStyle"; 48 | [@mel.get] external borderTopWidth: t => string = "borderTopWidth"; 49 | [@mel.get] external borderRightWidth: t => string = "borderRightWidth"; 50 | [@mel.get] external borderBottomWidth: t => string = "borderBottomWidth"; 51 | [@mel.get] external borderLeftWidth: t => string = "borderLeftWidth"; 52 | [@mel.get] external borderWidth: t => string = "borderWidth"; 53 | [@mel.get] external bottom: t => string = "bottom"; 54 | [@mel.get] external captionSide: t => string = "captionSide"; 55 | [@mel.get] external clear: t => string = "clear"; 56 | [@mel.get] external clip: t => string = "clip"; 57 | [@mel.get] external color: t => string = "color"; 58 | [@mel.get] external content: t => string = "content"; 59 | [@mel.get] external counterIncrement: t => string = "counterIncrement"; 60 | [@mel.get] external counterReset: t => string = "counterReset"; 61 | [@mel.get] external cue: t => string = "cue"; 62 | [@mel.get] external cueAfter: t => string = "cueAfter"; 63 | [@mel.get] external cueBefore: t => string = "cueBefore"; 64 | [@mel.get] external cursor: t => string = "cursor"; 65 | [@mel.get] external direction: t => string = "direction"; 66 | [@mel.get] external display: t => string = "display"; 67 | [@mel.get] external elevation: t => string = "elevation"; 68 | [@mel.get] external emptyCells: t => string = "emptyCells"; 69 | [@mel.get] external cssFloat: t => string = "cssFloat"; 70 | [@mel.get] external font: t => string = "font"; 71 | [@mel.get] external fontFamily: t => string = "fontFamily"; 72 | [@mel.get] external fontSize: t => string = "fontSize"; 73 | [@mel.get] external fontSizeAdjust: t => string = "fontSizeAdjust"; 74 | [@mel.get] external fontStretch: t => string = "fontStretch"; 75 | [@mel.get] external fontStyle: t => string = "fontStyle"; 76 | [@mel.get] external fontVariant: t => string = "fontVariant"; 77 | [@mel.get] external fontWeight: t => string = "fontWeight"; 78 | [@mel.get] external height: t => string = "height"; 79 | [@mel.get] external left: t => string = "left"; 80 | [@mel.get] external letterSpacing: t => string = "letterSpacing"; 81 | [@mel.get] external lineHeight: t => string = "lineHeight"; 82 | [@mel.get] external listStyle: t => string = "listStyle"; 83 | [@mel.get] external listStyleImage: t => string = "listStyleImage"; 84 | [@mel.get] external listStylePosition: t => string = "listStylePosition"; 85 | [@mel.get] external listStyleType: t => string = "listStyleType"; 86 | [@mel.get] external margin: t => string = "margin"; 87 | [@mel.get] external marginTop: t => string = "marginTop"; 88 | [@mel.get] external marginRight: t => string = "marginRight"; 89 | [@mel.get] external marginBottom: t => string = "marginBottom"; 90 | [@mel.get] external marginLeft: t => string = "marginLeft"; 91 | [@mel.get] external markerOffset: t => string = "markerOffset"; 92 | [@mel.get] external marks: t => string = "marks"; 93 | [@mel.get] external maxHeight: t => string = "maxHeight"; 94 | [@mel.get] external maxWidth: t => string = "maxWidth"; 95 | [@mel.get] external minHeight: t => string = "minHeight"; 96 | [@mel.get] external minWidth: t => string = "minWidth"; 97 | [@mel.get] external orphans: t => string = "orphans"; 98 | [@mel.get] external outline: t => string = "outline"; 99 | [@mel.get] external outlineColor: t => string = "outlineColor"; 100 | [@mel.get] external outlineStyle: t => string = "outlineStyle"; 101 | [@mel.get] external outlineWidth: t => string = "outlineWidth"; 102 | [@mel.get] external overflow: t => string = "overflow"; 103 | [@mel.get] external padding: t => string = "padding"; 104 | [@mel.get] external paddingTop: t => string = "paddingTop"; 105 | [@mel.get] external paddingRight: t => string = "paddingRight"; 106 | [@mel.get] external paddingBottom: t => string = "paddingBottom"; 107 | [@mel.get] external paddingLeft: t => string = "paddingLeft"; 108 | [@mel.get] external page: t => string = "page"; 109 | [@mel.get] external pageBreakAfter: t => string = "pageBreakAfter"; 110 | [@mel.get] external pageBreakBefore: t => string = "pageBreakBefore"; 111 | [@mel.get] external pageBreakInside: t => string = "pageBreakInside"; 112 | [@mel.get] external pause: t => string = "pause"; 113 | [@mel.get] external pauseAfter: t => string = "pauseAfter"; 114 | [@mel.get] external pauseBefore: t => string = "pauseBefore"; 115 | [@mel.get] external pitch: t => string = "pitch"; 116 | [@mel.get] external pitchRange: t => string = "pitchRange"; 117 | [@mel.get] external playDuring: t => string = "playDuring"; 118 | [@mel.get] external position: t => string = "position"; 119 | [@mel.get] external quotes: t => string = "quotes"; 120 | [@mel.get] external richness: t => string = "richness"; 121 | [@mel.get] external right: t => string = "right"; 122 | [@mel.get] external size: t => string = "size"; 123 | [@mel.get] external speak: t => string = "speak"; 124 | [@mel.get] external speakHeader: t => string = "speakHeader"; 125 | [@mel.get] external speakNumeral: t => string = "speakNumeral"; 126 | [@mel.get] external speakPunctuation: t => string = "speakPunctuation"; 127 | [@mel.get] external speechRate: t => string = "speechRate"; 128 | [@mel.get] external stress: t => string = "stress"; 129 | [@mel.get] external tableLayout: t => string = "tableLayout"; 130 | [@mel.get] external textAlign: t => string = "textAlign"; 131 | [@mel.get] external textDecoration: t => string = "textDecoration"; 132 | [@mel.get] external textIndent: t => string = "textIndent"; 133 | [@mel.get] external textShadow: t => string = "textShadow"; 134 | [@mel.get] external textTransform: t => string = "textTransform"; 135 | [@mel.get] external top: t => string = "top"; 136 | [@mel.get] external unicodeBidi: t => string = "unicodeBidi"; 137 | [@mel.get] external verticalAlign: t => string = "verticalAlign"; 138 | [@mel.get] external visibility: t => string = "visibility"; 139 | [@mel.get] external voiceFamily: t => string = "voiceFamily"; 140 | [@mel.get] external volume: t => string = "volume"; 141 | [@mel.get] external whiteSpace: t => string = "whiteSpace"; 142 | [@mel.get] external widows: t => string = "widows"; 143 | [@mel.get] external width: t => string = "width"; 144 | [@mel.get] external wordSpacing: t => string = "wordSpacing"; 145 | [@mel.get] external zIndex: t => string = "zIndex"; 146 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__CustomEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.customEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | 7 | [@mel.new] external make: string => t = "CustomEvent"; 8 | [@mel.new] 9 | external makeWithOptions: (string, Js.t({..})) => t = "CustomEvent"; 10 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__Document.re: -------------------------------------------------------------------------------- 1 | module Impl = (T: { 2 | type t; 3 | }) => { 4 | external asDocument: T.t => Dom.document = "%identity"; 5 | 6 | let asHtmlDocument: T.t => Js.null(Dom.htmlDocument) = [%raw 7 | {| 8 | function (document) { 9 | if (document.doctype) { 10 | return document.doctype.name === "html" ? document : null; 11 | } else { 12 | return null 13 | } 14 | } 15 | |} 16 | ]; 17 | [@deprecated 18 | "Will fail if no doctype is defined, consider using unsafeAsHtmlDocument instead" 19 | ] 20 | let asHtmlDocument: T.t => option(Dom.htmlDocument) = 21 | self => Js.Null.toOption(asHtmlDocument(self)); 22 | 23 | external unsafeAsHtmlDocument: T.t => Dom.htmlDocument = "%identity"; 24 | 25 | let ofNode = (node: Dom.node): option(T.t) => 26 | Webapi__Dom__Node.nodeType(node) == Webapi__Dom__Types.Document 27 | ? Some(Obj.magic(node)) : None; 28 | 29 | [@mel.get] external characterSet: T.t => string = "characterSet"; 30 | [@mel.get] 31 | external compatMode: T.t => string /* compatMode enum */ = "compatMode"; /* experimental */ 32 | let compatMode: T.t => Webapi__Dom__Types.compatMode = 33 | self => Webapi__Dom__Types.decodeCompatMode(compatMode(self)); 34 | [@mel.get] external doctype: T.t => Dom.documentType = "doctype"; 35 | [@mel.get] external documentElement: T.t => Dom.element = "documentElement"; 36 | [@mel.get] external documentURI: T.t => string = "documentURI"; 37 | [@mel.get] external hidden: T.t => bool = "hidden"; 38 | [@mel.get] 39 | external implementation: T.t => Dom.domImplementation = "implementation"; 40 | [@mel.get] external lastStyleSheetSet: T.t => string = "lastStyleSheetSet"; 41 | [@mel.get] [@mel.return nullable] 42 | external pointerLockElement: T.t => option(Dom.element) = 43 | "pointerLockElement"; /* experimental */ 44 | 45 | [@mel.get] 46 | external preferredStyleSheetSet: T.t => string = "preferredStyleSheetSet"; 47 | [@mel.get] [@mel.return nullable] 48 | external scrollingElement: T.t => option(Dom.element) = "scrollingElement"; 49 | [@mel.get] 50 | external selectedStyleSheetSet: T.t => string = "selectedStyleSheetSet"; 51 | [@mel.set] 52 | external setSelectedStyleSheetSet: (T.t, string) => unit = 53 | "selectedStyleSheetSet"; 54 | [@mel.get] 55 | external styleSheets: T.t => array(Dom.cssStyleSheet) = "styleSheets"; /* return StyleSheetList, not array */ 56 | [@mel.get] external styleSheetSets: T.t => array(string) = "styleSheetSets"; 57 | [@mel.get] 58 | external visibilityState: T.t => string /* visibilityState enum */ = 59 | "visibilityState"; 60 | let visibilityState: T.t => Webapi__Dom__Types.visibilityState = 61 | self => Webapi__Dom__Types.decodeVisibilityState(visibilityState(self)); 62 | 63 | [@mel.send] 64 | external adoptNode: 65 | (Dom.element_like('a), [@mel.this] T.t) => Dom.element_like('a) = 66 | "adoptNode"; 67 | [@mel.send] 68 | external createAttribute: (string, [@mel.this] T.t) => Dom.attr = 69 | "createAttribute"; 70 | [@mel.send] 71 | external createAttributeNS: (string, string, [@mel.this] T.t) => Dom.attr = 72 | "createAttributeNS"; 73 | [@mel.send] 74 | external createComment: (string, [@mel.this] T.t) => Dom.comment = 75 | "createComment"; 76 | [@mel.send] 77 | external createDocumentFragment: ([@mel.this] T.t) => Dom.documentFragment = 78 | "createDocumentFragment"; 79 | [@mel.send] 80 | external createElement: (string, [@mel.this] T.t) => Dom.element = 81 | "createElement"; 82 | [@mel.send] 83 | external createElementWithOptions: 84 | (string, Js.t({..}), [@mel.this] T.t) => Dom.element = 85 | "createElement"; /* not widely supported */ 86 | [@mel.send] 87 | external createElementNS: (string, string, [@mel.this] T.t) => Dom.element = 88 | "createElementNS"; 89 | [@mel.send] 90 | external createElementNSWithOptions: 91 | (string, string, Js.t({..}), [@mel.this] T.t) => Dom.element = 92 | "createElementNS"; /* not widely supported */ 93 | [@mel.send] 94 | external createEvent: (string /* large enum */, [@mel.this] T.t) => Dom.event = 95 | "createEvent"; /* discouraged (but not deprecated) in favor of Event constructors */ 96 | [@mel.send] 97 | external createNodeIterator: 98 | (Dom.node_like('a), [@mel.this] T.t) => Dom.nodeIterator = 99 | "createNodeIterator"; 100 | [@mel.send] 101 | external createNodeIteratorWithWhatToShow: 102 | (Dom.node_like('a), Webapi__Dom__Types.WhatToShow.t, [@mel.this] T.t) => 103 | Dom.nodeIterator = 104 | "createNodeIterator"; 105 | [@mel.send] 106 | external createNodeIteratorWithWhatToShowFilter: 107 | ( 108 | Dom.node_like('a), 109 | Webapi__Dom__Types.WhatToShow.t, 110 | Dom.nodeFilter, 111 | [@mel.this] T.t 112 | ) => 113 | Dom.nodeIterator = 114 | "createNodeIterator"; /* createProcessingInstruction */ 115 | [@mel.send] 116 | external createRange: ([@mel.this] T.t) => Dom.range = "createRange"; 117 | [@mel.send] 118 | external createTextNode: (string, [@mel.this] T.t) => Dom.text = 119 | "createTextNode"; 120 | [@mel.send] 121 | external createTreeWalker: 122 | (Dom.element_like('a), [@mel.this] T.t) => Dom.treeWalker = 123 | "createTreeWalker"; 124 | [@mel.send] 125 | external createTreeWalkerWithWhatToShow: 126 | ( 127 | Dom.element_like('a), 128 | Webapi__Dom__Types.WhatToShow.t, 129 | [@mel.this] T.t 130 | ) => 131 | Dom.treeWalker = 132 | "createTreeWalker"; 133 | [@mel.send] 134 | external createTreeWalkerWithWhatToShowFilter: 135 | ( 136 | Dom.element_like('a), 137 | Webapi__Dom__Types.WhatToShow.t, 138 | Dom.nodeFilter, 139 | [@mel.this] T.t 140 | ) => 141 | Dom.treeWalker = 142 | "createTreeWalker"; 143 | [@mel.send] 144 | external elementFromPoint: (int, int, [@mel.this] T.t) => Dom.element = 145 | "elementFromPoint"; /* experimental, but widely supported */ 146 | [@mel.send] 147 | external elementsFromPoint: 148 | (int, int, [@mel.this] T.t) => array(Dom.element) = 149 | "elementsFromPoint"; /* experimental */ 150 | [@mel.send] 151 | external enableStyleSheetsForSet: (string, [@mel.this] T.t) => unit = 152 | "enableStyleSheetsForSet"; 153 | [@mel.send] 154 | external exitPointerLock: ([@mel.this] T.t) => unit = "exitPointerLock"; /* experimental */ 155 | [@mel.send] 156 | external getAnimations: ([@mel.this] T.t) => array(Dom.animation) = 157 | "getAnimations"; /* experimental */ 158 | [@mel.send] 159 | external getElementsByClassName: 160 | (string, [@mel.this] T.t) => Dom.htmlCollection = 161 | "getElementsByClassName"; 162 | [@mel.send] 163 | external getElementsByTagName: 164 | (string, [@mel.this] T.t) => Dom.htmlCollection = 165 | "getElementsByTagName"; 166 | [@mel.send] 167 | external getElementsByTagNameNS: 168 | (string, string, [@mel.this] T.t) => Dom.htmlCollection = 169 | "getElementsByTagNameNS"; 170 | [@mel.send] 171 | external importNode: 172 | (Dom.element_like('a), [@mel.this] T.t) => Dom.element_like('a) = 173 | "importNode"; 174 | [@mel.send] 175 | external importNodeDeep: 176 | (Dom.element_like('a), [@mel.as {json|true|json}] _, [@mel.this] T.t) => 177 | Dom.element_like('a) = 178 | "importNode"; 179 | [@mel.send] 180 | external registerElement: (string, unit, [@mel.this] T.t) => Dom.element = 181 | "registerElement"; /* experimental and deprecated in favor of customElements.define() */ 182 | [@mel.send] 183 | external registerElementWithOptions: 184 | (string, Js.t({..}), unit, [@mel.this] T.t) => Dom.element = 185 | "registerElement"; /* experimental and deprecated in favor of customElements.define() */ 186 | 187 | /** XPath stuff */; 188 | /* createExpression */ 189 | /* createNSResolver */ 190 | /* evaluate */ 191 | /* GlobalEventHandlers interface */ 192 | }; 193 | 194 | type t = Dom.document; 195 | 196 | include Webapi__Dom__Node.Impl({ 197 | type nonrec t = t; 198 | }); 199 | include Webapi__Dom__EventTarget.Impl({ 200 | type nonrec t = t; 201 | }); 202 | include Webapi__Dom__NonElementParentNode.Impl({ 203 | type nonrec t = t; 204 | }); 205 | include Webapi__Dom__DocumentOrShadowRoot.Impl({ 206 | (); 207 | }); 208 | include Webapi__Dom__ParentNode.Impl({ 209 | type nonrec t = t; 210 | }); 211 | include Impl({ 212 | type nonrec t = t; 213 | }); 214 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__DocumentFragment.re: -------------------------------------------------------------------------------- 1 | type t = Dom.documentFragment; 2 | 3 | include Webapi__Dom__Node.Impl({ type nonrec t = t; }); 4 | include Webapi__Dom__EventTarget.Impl({ type nonrec t = t; }); 5 | include Webapi__Dom__NonElementParentNode.Impl({ type nonrec t = t; }); 6 | include Webapi__Dom__ParentNode.Impl({ type nonrec t = t; }); 7 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__DocumentOrShadowRoot.re: -------------------------------------------------------------------------------- 1 | /* Mixin */ 2 | module Impl = (T: {}) => {/* TODO: Implemented in Shadow DOM spec */}; 3 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__DocumentType.re: -------------------------------------------------------------------------------- 1 | type t = Dom.documentType; 2 | 3 | include Webapi__Dom__Node.Impl({ 4 | type nonrec t = t; 5 | }); 6 | include Webapi__Dom__EventTarget.Impl({ 7 | type nonrec t = t; 8 | }); 9 | include Webapi__Dom__ChildNode.Impl({ 10 | type nonrec t = t; 11 | }); 12 | 13 | [@mel.get] external name: t => string = "name"; 14 | [@mel.get] external publicId: t => string = "publicId"; 15 | [@mel.get] external systemId: t => string = "systemId"; 16 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__DomImplementation.re: -------------------------------------------------------------------------------- 1 | type t = Dom.domImplementation; 2 | 3 | [@mel.send] 4 | external createDocumentType: 5 | ( 6 | ~qualifiedName: string, 7 | ~publicId: string, 8 | ~systemId: string, 9 | [@mel.this] t 10 | ) => 11 | Dom.documentType = 12 | "createDocumentType"; 13 | [@mel.send] 14 | external createDocument: 15 | (Js.null(string), string, Js.null(Dom.documentType), [@mel.this] t) => 16 | Dom.xmlDocument = 17 | "createDocument"; 18 | let createDocument = 19 | ( 20 | ~namespace: option(string)=?, 21 | ~qualifiedName: string, 22 | ~docType: option(Dom.documentType)=?, 23 | ) => 24 | createDocument( 25 | Js.Null.fromOption(namespace), 26 | qualifiedName, 27 | Js.Null.fromOption(docType), 28 | ); 29 | [@mel.send] 30 | external createHTMLDocument: ([@mel.this] t) => Dom.htmlDocument = 31 | "createHTMLDocument"; 32 | [@mel.send] 33 | external createHTMLDocumentWithTitle: 34 | (string, [@mel.this] t) => Dom.htmlDocument = 35 | "createHTMLDocument"; 36 | [@mel.send] external hasFeature: ([@mel.this] t) => bool = "hasFeature"; /* useless; always returns true (this is exact wording from the actual spec) */ 37 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__DomRect.re: -------------------------------------------------------------------------------- 1 | type t = Dom.domRect; 2 | 3 | [@mel.new] 4 | external make: (~x: float, ~y: float, ~width: float, ~height: float) => t = 5 | "DOMRect"; /* experimental */ 6 | 7 | [@mel.get] external top: t => float = "top"; 8 | [@mel.get] external bottom: t => float = "bottom"; 9 | [@mel.get] external left: t => float = "left"; 10 | [@mel.get] external right: t => float = "right"; 11 | [@mel.get] external height: t => float = "height"; 12 | [@mel.get] external width: t => float = "width"; 13 | [@mel.get] external x: t => float = "x"; 14 | [@mel.get] external y: t => float = "y"; 15 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__DomStringMap.re: -------------------------------------------------------------------------------- 1 | type t = Dom.domStringMap; 2 | 3 | type key = string; 4 | 5 | [@mel.get_index] [@mel.return nullable] 6 | external get: (t, key) => option(string); 7 | let get = (key, map) => get(map, key); 8 | [@mel.set_index] external set: (t, key, string) => unit; 9 | let set = (key, value, map) => set(map, key, value); 10 | let unsafeDeleteKey: (key, t) => unit = [%raw 11 | "function(key, map) { delete map[key] }" 12 | ]; 13 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__DomTokenList.re: -------------------------------------------------------------------------------- 1 | type t = Dom.domTokenList; 2 | 3 | [@mel.get] external length: t => int = "length"; 4 | 5 | [@mel.send] [@mel.return nullable] 6 | external item: (int, [@mel.this] t) => option(string) = "item"; 7 | [@mel.send] external add: (string, [@mel.this] t) => unit = "add"; 8 | [@mel.send] [@mel.variadic] 9 | external addMany: (array(string), [@mel.this] t) => unit = "add"; 10 | [@mel.send] external contains: (string, [@mel.this] t) => bool = "contains"; 11 | /* entries: iterator API, should have language support */ 12 | [@mel.send] 13 | external forEach: ((string, int) => unit, [@mel.this] t) => unit = "forEach"; 14 | /* keys: iterator API, should have language support */ 15 | [@mel.send] external remove: (string, [@mel.this] t) => unit = "remove"; 16 | [@mel.send] [@mel.variadic] 17 | external removeMany: (array(string), [@mel.this] t) => unit = "remove"; 18 | [@mel.send] 19 | external replace: (string, string, [@mel.this] t) => unit = "replace"; /* experimental */ 20 | [@mel.send] external supports: (string, [@mel.this] t) => bool = "supports"; /* experimental, Content Management Level 1 */ 21 | [@mel.send] external toggle: (string, [@mel.this] t) => bool = "toggle"; 22 | [@mel.send] 23 | external toggleForced: 24 | (string, [@mel.as {json|true|json}] _, [@mel.this] t) => bool = 25 | "toggle"; 26 | [@mel.send] external toString: ([@mel.this] t) => string = "toString"; 27 | /* values: iterator API, should have language support */ 28 | 29 | [@mel.get] external value: t => string = "value"; /* experimental, from being merged with domSettableTokenList */ 30 | [@mel.set] external setValue: (t, string) => unit = "value"; /* experimental, from being merged with domSettableTokenList */ 31 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__DragEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.dragEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | include Webapi__Dom__UiEvent.Impl({ 7 | type nonrec t = t; 8 | }); 9 | include Webapi__Dom__MouseEvent.Impl({ 10 | type nonrec t = t; 11 | }); 12 | 13 | [@mel.new] external make: string => t = "DragEvent"; 14 | [@mel.new] external makeWithOptions: (string, Js.t({..})) => t = "DragEvent"; 15 | 16 | [@mel.get] external dataTransfer: t => Dom.dataTransfer = "dataTransfer"; 17 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__ErrorEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.errorEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | 7 | [@mel.new] external make: string => t = "ErrorEvent"; 8 | [@mel.new] external makeWithOptions: (string, Js.t({..})) => t = "ErrorEvent"; 9 | 10 | [@mel.get] external message: t => string = "message"; 11 | [@mel.get] external filename: t => string = "filename"; 12 | [@mel.get] external lineno: t => int = "lineno"; 13 | [@mel.get] external colno: t => int = "colno"; 14 | [@mel.get] external error: t => Js.t({..}) = "error"; 15 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__Event.re: -------------------------------------------------------------------------------- 1 | module Impl = (T: { 2 | type t; 3 | }) => { 4 | [@mel.get] external bubbles: T.t => bool = "bubbles"; 5 | [@mel.get] external cancelable: T.t => bool = "cancelable"; 6 | [@mel.get] external composed: T.t => bool = "composed"; 7 | [@mel.get] external currentTarget: T.t => Dom.eventTarget = "currentTarget"; 8 | [@mel.get] external defaultPrevented: T.t => bool = "defaultPrevented"; 9 | [@mel.get] 10 | external eventPhase: T.t => int /* eventPhase enum */ = "eventPhase"; 11 | 12 | let eventPhase: T.t => Webapi__Dom__Types.EventPhase.t = 13 | self => Webapi__Dom__Types.EventPhase.decode(eventPhase(self)); 14 | 15 | [@mel.get] external target: T.t => Dom.eventTarget = "target"; 16 | [@mel.get] external timeStamp: T.t => float = "timeStamp"; 17 | [@mel.get] external type_: T.t => string = "type"; 18 | [@mel.get] external isTrusted: T.t => bool = "isTrusted"; 19 | 20 | [@mel.send] 21 | external preventDefault: ([@mel.this] T.t) => unit = "preventDefault"; 22 | [@mel.send] 23 | external stopImmediatePropagation: ([@mel.this] T.t) => unit = 24 | "stopImmediatePropagation"; 25 | [@mel.send] 26 | external stopPropagation: ([@mel.this] T.t) => unit = "stopPropagation"; 27 | }; 28 | 29 | type t = Dom.event; 30 | 31 | include Impl({ 32 | type nonrec t = t; 33 | }); 34 | 35 | [@mel.new] external make: string => t = "Event"; 36 | [@mel.new] external makeWithOptions: (string, Js.t({..})) => t = "Event"; 37 | 38 | /* 39 | Unimplemented Event interfaces 40 | 41 | AudioProcessingEvent /* deprecated */ 42 | BeforeInputEvent /* experimental? Looks like it might just be an InputEvent */ 43 | BlobEvent /* experimental, MediaStream recording */ 44 | CSSFontFaceLoadEvent /* experimental - https://www.w3.org/TR/css-font-loading-3/#dom-cssfontfaceloadevent */ 45 | DeviceLightEvent /* experimenta, Ambient Light */ 46 | DeviceMotionEvent /* experimental, Device Orientation */ 47 | DeviceOrientationEvent /* experimental, Device Orientation */ 48 | DeviceProximityEvent /* experimental, Device Orientation */ 49 | DOMTransactionEvent /* very experimental - https://dvcs.w3.org/hg/undomanager/raw-file/tip/undomanager.html#the-domtransactionevent-interface */ 50 | EditingBeforeInputEvent /* deprecated? - https://dvcs.w3.org/hg/editing/raw-file/57abe6d3cb60/editing.html#editingbeforeinputevent */ 51 | FetchEvent /* experimental, Service Workers */ 52 | GamepadEvent /* experimental, Gamepad */ 53 | HashChangeEvent /* https://www.w3.org/TR/html51/browsers.html#the-hashchangeevent-interface */ 54 | MediaStreamEvent /* experimental, WebRTC */ 55 | MessageEvent /* experimental, Websocket/WebRTC */ 56 | MutationEvent /* deprecated */ 57 | OfflineAudioCompletionEvent /* experimental, Web Audio */ 58 | RTCDataChannelEvent /* experimental, WebRTC */ 59 | RTCIdentityErrorEventA /* experimental, WebRTC */ 60 | RTCIdentityEvent /* experimental, WebRTC */ 61 | RTCPeerConnectionIceEvent /* experimental, WebRTC */ 62 | SensorEvent /* deprecated? */ 63 | SVGEvent /* deprecated */ 64 | UserProximityEvent /* experimental, Proximity Events */ 65 | */ 66 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__FocusEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.focusEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | include Webapi__Dom__UiEvent.Impl({ 7 | type nonrec t = t; 8 | }); 9 | 10 | [@mel.new] external make: string => t = "FocusEvent"; 11 | [@mel.new] external makeWithOptions: (string, Js.t({..})) => t = "FocusEvent"; 12 | 13 | [@mel.get] [@mel.return nullable] 14 | external relatedTarget: t => option(Dom.eventTarget) = "relatedTarget"; 15 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__GlobalEventHandlers.re: -------------------------------------------------------------------------------- 1 | /* Mixin */ 2 | module Impl = (T: { 3 | type t; 4 | }) => { 5 | [@mel.send] 6 | external addSelectionChangeEventListener: 7 | ([@mel.as "selectionchange"] _, Dom.focusEvent => unit, [@mel.this] T.t) => 8 | unit = 9 | "addEventListener"; 10 | [@mel.send] 11 | external addSelectionChangeEventListenerWithOptions: 12 | ( 13 | [@mel.as "selectionchange"] _, 14 | Dom.focusEvent => unit, 15 | { 16 | . 17 | "capture": bool, 18 | "once": bool, 19 | "passive": bool, 20 | }, 21 | [@mel.this] T.t 22 | ) => 23 | unit = 24 | "addEventListener"; /* not widely supported */ 25 | [@mel.send] 26 | external addSelectionChangeEventListenerUseCapture: 27 | ( 28 | [@mel.as "selectionchange"] _, 29 | Dom.focusEvent => unit, 30 | [@mel.as {json|true|json}] _, 31 | [@mel.this] T.t 32 | ) => 33 | unit = 34 | "addEventListener"; 35 | [@mel.send] 36 | external removeSelectionChangeEventListener: 37 | ([@mel.as "selectionchange"] _, Dom.focusEvent => unit, [@mel.this] T.t) => 38 | unit = 39 | "removeEventListener"; 40 | [@mel.send] 41 | external removeSelectionChangeEventListenerWithOptions: 42 | ( 43 | [@mel.as "selectionchange"] _, 44 | Dom.focusEvent => unit, 45 | { 46 | . 47 | "capture": bool, 48 | "passive": bool, 49 | }, 50 | [@mel.this] T.t 51 | ) => 52 | unit = 53 | "removeEventListener"; /* not widely supported */ 54 | [@mel.send] 55 | external removeSelectionChangeEventListenerUseCapture: 56 | ( 57 | [@mel.as "selectionchange"] _, 58 | Dom.focusEvent => unit, 59 | [@mel.as {json|true|json}] _, 60 | [@mel.this] T.t 61 | ) => 62 | unit = 63 | "removeEventListener"; 64 | }; 65 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__History.re: -------------------------------------------------------------------------------- 1 | type t = Dom.history; 2 | type state; /* TODO: should be "anything that can be serializable" apparently */ 3 | 4 | [@mel.get] external length: t => int = "length"; 5 | [@mel.get] external scrollRestoration: t => bool = "scrollRestoration"; /* experimental */ 6 | [@mel.set] 7 | external setScrollRestoration: (t, bool) => unit = "scrollRestoration"; /* experimental */ 8 | [@mel.get] external state: t => state = "state"; 9 | 10 | [@mel.send] external back: ([@mel.this] t) => unit = "back"; 11 | [@mel.send] external forward: ([@mel.this] t) => unit = "forward"; 12 | [@mel.send] external go: (int, [@mel.this] t) => unit = "go"; 13 | [@mel.send] 14 | external pushState: (state, string, string, [@mel.this] t) => unit = 15 | "pushState"; 16 | [@mel.send] 17 | external replaceState: (state, string, string, [@mel.this] t) => unit = 18 | "replaceState"; 19 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__HtmlCollection.re: -------------------------------------------------------------------------------- 1 | type t = Dom.htmlCollection; 2 | 3 | [@mel.scope ("Array", "prototype", "slice")] 4 | external toArray: t => array(Dom.element) = "call"; 5 | 6 | [@mel.get] external length: t => int = "length"; 7 | [@mel.send] [@mel.return nullable] 8 | external item: (int, [@mel.this] t) => option(Dom.element) = "item"; 9 | [@mel.send] [@mel.return nullable] 10 | external namedItem: (string, [@mel.this] t) => option(Dom.element) = 11 | "namedItem"; 12 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__HtmlDocument.re: -------------------------------------------------------------------------------- 1 | module Impl = (T: { 2 | type t; 3 | }) => { 4 | type t_htmlDocument = T.t; 5 | 6 | [@mel.get] [@mel.return nullable] 7 | external activeElement: t_htmlDocument => option(Dom.element) = 8 | "activeElement"; 9 | [@mel.get] [@mel.return nullable] 10 | external body: t_htmlDocument => option(Dom.element) = "body"; /* returns option HTMLBodyElement */ 11 | [@mel.set] external setBody: (t_htmlDocument, Dom.element) => unit = "body"; /* accepth HTMLBodyElement */ 12 | [@mel.get] external cookie: t_htmlDocument => string = "cookie"; 13 | [@mel.set] external setCookie: (t_htmlDocument, string) => unit = "cookie"; 14 | [@mel.get] [@mel.return nullable] 15 | external defaultView: t_htmlDocument => option(Dom.window) = "defaultView"; 16 | [@mel.get] 17 | external designMode: t_htmlDocument => string /* designMode enum */ = 18 | "designMode"; 19 | let designMode: t_htmlDocument => Webapi__Dom__Types.designMode = 20 | self => Webapi__Dom__Types.decodeDesignMode(designMode(self)); 21 | [@mel.set] 22 | external setDesignMode: 23 | (t_htmlDocument, string /* designMode enum */) => unit = 24 | "designMode"; 25 | let setDesignMode: (t_htmlDocument, Webapi__Dom__Types.designMode) => unit = 26 | (self, value) => 27 | setDesignMode(self, Webapi__Dom__Types.encodeDesignMode(value)); 28 | [@mel.get] external dir: t_htmlDocument => string /* dir enum */ = "dir"; 29 | let dir: t_htmlDocument => Webapi__Dom__Types.dir = 30 | self => Webapi__Dom__Types.decodeDir(dir(self)); 31 | [@mel.set] 32 | external setDir: (t_htmlDocument, string /* dir enum */) => unit = "dir"; 33 | let setDir: (t_htmlDocument, Webapi__Dom__Types.dir) => unit = 34 | (self, value) => setDir(self, Webapi__Dom__Types.encodeDir(value)); 35 | [@mel.get] [@mel.return nullable] 36 | external domain: t_htmlDocument => option(string) = "domain"; 37 | [@mel.set] external setDomain: (t_htmlDocument, string) => unit = "domain"; 38 | [@mel.get] external embeds: t_htmlDocument => Dom.nodeList = "embeds"; 39 | [@mel.get] external forms: t_htmlDocument => Dom.htmlCollection = "forms"; 40 | [@mel.get] external head: t_htmlDocument => Dom.element = "head"; /* returns HTMLHeadElement */ 41 | [@mel.get] external images: t_htmlDocument => Dom.htmlCollection = "images"; 42 | [@mel.get] external lastModified: t_htmlDocument => string = "lastModified"; 43 | [@mel.get] external links: t_htmlDocument => Dom.nodeList = "links"; 44 | [@mel.get] external location: t_htmlDocument => Dom.location = "location"; 45 | [@mel.set] 46 | external setLocation: (t_htmlDocument, string) => unit = "location"; 47 | [@mel.get] 48 | external plugins: t_htmlDocument => Dom.htmlCollection = "plugins"; 49 | [@mel.get] 50 | external readyState: t_htmlDocument => string /* enum */ = "readyState"; 51 | let readyState: t_htmlDocument => Webapi__Dom__Types.readyState = 52 | self => Webapi__Dom__Types.decodeReadyState(readyState(self)); 53 | [@mel.get] external referrer: t_htmlDocument => string = "referrer"; 54 | [@mel.get] 55 | external scripts: t_htmlDocument => Dom.htmlCollection = "scripts"; 56 | [@mel.get] external title: t_htmlDocument => string = "title"; 57 | [@mel.set] external setTitle: (t_htmlDocument, string) => unit = "title"; 58 | [@mel.get] external url: t_htmlDocument => string = "URL"; 59 | 60 | [@mel.send] external close: ([@mel.this] t_htmlDocument) => unit = "close"; 61 | [@mel.send] 62 | external execCommand: 63 | (string, bool, Js.null(string), [@mel.this] t_htmlDocument) => bool = 64 | "execCommand"; 65 | let execCommand: (string, bool, option(string), t_htmlDocument) => bool = 66 | (command, show, value, self) => 67 | execCommand(command, show, Js.Null.fromOption(value), self); 68 | [@mel.send] 69 | external getElementsByName: 70 | (string, [@mel.this] t_htmlDocument) => Dom.nodeList = 71 | "getElementsByName"; 72 | [@mel.send] 73 | external getSelection: ([@mel.this] t_htmlDocument) => Dom.selection = 74 | "getSelection"; 75 | [@mel.send] 76 | external hasFocus: ([@mel.this] t_htmlDocument) => bool = "hasFocus"; 77 | [@mel.send] external open_: ([@mel.this] t_htmlDocument) => unit = "open"; 78 | [@mel.send] 79 | external queryCommandEnabled: (string, [@mel.this] t_htmlDocument) => bool = 80 | "queryCommandEnabled"; 81 | [@mel.send] 82 | external queryCommandIndeterm: (string, [@mel.this] t_htmlDocument) => bool = 83 | "queryCommandIndeterm"; 84 | [@mel.send] 85 | external queryCommandSupported: (string, [@mel.this] t_htmlDocument) => bool = 86 | "queryCommandSupported"; 87 | [@mel.send] 88 | external queryCommandValue: (string, [@mel.this] t_htmlDocument) => string = 89 | "queryCommandValue"; 90 | [@mel.send] 91 | external write: (string, [@mel.this] t_htmlDocument) => unit = "write"; 92 | [@mel.send] 93 | external writeln: (string, [@mel.this] t_htmlDocument) => unit = "writeln"; 94 | }; 95 | 96 | type t = Dom.htmlDocument; 97 | 98 | include Webapi__Dom__Node.Impl({ 99 | type nonrec t = t; 100 | }); 101 | include Webapi__Dom__EventTarget.Impl({ 102 | type nonrec t = t; 103 | }); 104 | include Webapi__Dom__GlobalEventHandlers.Impl({ 105 | type nonrec t = t; 106 | }); 107 | include Webapi__Dom__Document.Impl({ 108 | type nonrec t = t; 109 | }); 110 | include Impl({ 111 | type nonrec t = t; 112 | }); 113 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__HtmlElement.re: -------------------------------------------------------------------------------- 1 | module Impl = (T: { 2 | type t; 3 | }) => { 4 | type t_htmlElement = T.t; 5 | 6 | let ofElement: Dom.element => Js.null(t_htmlElement) = [%mel.raw 7 | {| 8 | function (element) { 9 | // BEWARE: Assumes "contentEditable" uniquely identifies an HTMLELement 10 | return element.contentEditable !== undefined ? element : null; 11 | } 12 | |} 13 | ]; 14 | [@deprecated 15 | "Consider using Element.asHtmlElement or Element.unsafeAsHtmlElement instead" 16 | ] 17 | let ofElement: Dom.element => option(t_htmlElement) = 18 | self => Js.Null.toOption(ofElement(self)); 19 | 20 | [@mel.get] external accessKey: t_htmlElement => string = "accessKey"; 21 | [@mel.set] 22 | external setAccessKey: (t_htmlElement, string) => unit = "accessKey"; 23 | [@mel.get] 24 | external accessKeyLabel: t_htmlElement => string = "accessKeyLabel"; 25 | [@mel.get] 26 | external contentEditable: t_htmlElement => string /* enum */ = 27 | "contentEditable"; 28 | let contentEditable: t_htmlElement => Webapi__Dom__Types.contentEditable = 29 | self => Webapi__Dom__Types.decodeContentEditable(contentEditable(self)); 30 | [@mel.set] 31 | external setContentEditable: (t_htmlElement, string /* enum */) => unit = 32 | "contentEditable"; 33 | let setContentEditable: 34 | (t_htmlElement, Webapi__Dom__Types.contentEditable) => unit = 35 | (self, value) => 36 | setContentEditable( 37 | self, 38 | Webapi__Dom__Types.encodeContentEditable(value), 39 | ); 40 | [@mel.get] 41 | external isContentEditable: t_htmlElement => bool = "isContentEditable"; 42 | [@mel.get] 43 | external contextMenu: t_htmlElement => Dom.htmlElement = "contextMenu"; /* returns HTMLMenuElement */ 44 | [@mel.set] 45 | external setContextMenu: (t_htmlElement, Dom.htmlElement) => unit = 46 | "contextMenu"; /* accepts and returns HTMLMenuElement */ 47 | [@mel.get] external dataset: t_htmlElement => Dom.domStringMap = "dataset"; 48 | [@mel.get] external dir: t_htmlElement => string /* enum */ = "dir"; 49 | let dir: t_htmlElement => Webapi__Dom__Types.dir = 50 | self => Webapi__Dom__Types.decodeDir(dir(self)); 51 | [@mel.set] 52 | external setDir: (t_htmlElement, string /* enum */) => unit = "dir"; 53 | let setDir: (t_htmlElement, Webapi__Dom__Types.dir) => unit = 54 | (self, value) => setDir(self, Webapi__Dom__Types.encodeDir(value)); 55 | [@mel.get] external draggable: t_htmlElement => bool = "draggable"; 56 | [@mel.set] external setDraggable: (t_htmlElement, bool) => unit = "draggable" /*let setDraggable : t_htmlElement => bool => unit = fun self value => setDraggable self (Js.Boolean.to_js_boolean value);*/; /* temproarily removed to reduce codegen size */ 57 | [@mel.get] 58 | external dropzone: t_htmlElement => Dom.domSettableTokenList = "dropzone"; 59 | [@mel.get] external hidden: t_htmlElement => bool = "hidden"; 60 | [@mel.set] external setHidden: (t_htmlElement, bool) => unit = "hidden" /*let setHidden : t_htmlElement => bool => unit = fun self value => setHidden self (Js.Boolean.to_js_boolean value);*/; /* temproarily removed to reduce codegen size */ 61 | [@mel.get] external itemScope: t_htmlElement => bool = "itemScope"; /* experimental */ 62 | [@mel.set] external setItemScope: (t_htmlElement, bool) => unit = "itemScope" /*let setItemScope : t_htmlElement => bool => unit = fun self value => setItemScope self (Js.Boolean.to_js_boolean value);*/; /* experimental */ /* temproarily removed to reduce codegen size */ 63 | [@mel.get] 64 | external itemType: t_htmlElement => Dom.domSettableTokenList = "itemType"; /* experimental */ 65 | [@mel.get] external itemId: t_htmlElement => string = "itemId"; /* experimental */ 66 | [@mel.set] external setItemId: (t_htmlElement, string) => unit = "itemId"; /* experimental */ 67 | [@mel.get] 68 | external itemRef: t_htmlElement => Dom.domSettableTokenList = "itemRef"; /* experimental */ 69 | [@mel.get] 70 | external itemProp: t_htmlElement => Dom.domSettableTokenList = "itemProp"; /* experimental */ 71 | [@mel.get] external itemValue: t_htmlElement => Js.t({..}) = "itemValue"; /* experimental */ 72 | [@mel.set] 73 | external setItemValue: (t_htmlElement, Js.t({..})) => unit = "itemValue"; /* experimental */ 74 | [@mel.get] external lang: t_htmlElement => string = "lang"; 75 | [@mel.set] external setLang: (t_htmlElement, string) => unit = "lang"; 76 | [@mel.get] external offsetHeight: t_htmlElement => int = "offsetHeight"; /* experimental */ 77 | [@mel.get] external offsetLeft: t_htmlElement => int = "offsetLeft"; /* experimental */ 78 | [@mel.get] [@mel.return nullable] 79 | external offsetParent: t_htmlElement => option(Dom.element) = 80 | "offsetParent"; /* experimental */ 81 | [@mel.get] external offsetTop: t_htmlElement => int = "offsetTop"; /* experimental, but widely supported */ 82 | [@mel.get] external offsetWidth: t_htmlElement => int = "offsetWidth"; /* experimental */ 83 | /*external properties : r => HTMLPropertiesCollection.t = "properties" [@@mel.get]; /* experimental */*/ 84 | [@mel.get] external spellcheck: t_htmlElement => bool = "spellcheck"; 85 | [@mel.set] 86 | external setSpellcheck: (t_htmlElement, bool) => unit = "spellcheck" /*let setSpellcheck : t_htmlElement => bool => unit = fun self value => setSpellcheck self (Js.Boolean.to_js_boolean value);*/; /* temproarily removed to reduce codegen size */ 87 | [@mel.get] 88 | external style: t_htmlElement => Dom.cssStyleDeclaration = "style"; 89 | [@mel.set] 90 | external setStyle: (t_htmlElement, Dom.cssStyleDeclaration) => unit = 91 | "style"; 92 | [@mel.get] external tabIndex: t_htmlElement => int = "tabIndex"; 93 | [@mel.set] external setTabIndex: (t_htmlElement, int) => unit = "tabIndex"; 94 | [@mel.get] external title: t_htmlElement => string = "title"; 95 | [@mel.set] external setTitle: (t_htmlElement, string) => unit = "title"; 96 | [@mel.get] external translate: t_htmlElement => bool = "translate"; /* experimental */ 97 | [@mel.set] external setTranslate: (t_htmlElement, bool) => unit = "translate" /*let setTranslate : t_htmlElement => bool => unit = fun self value => setTranslate self (Js.Boolean.to_js_boolean value);*/; /* experimental */ /* temproarily removed to reduce codegen size */ 98 | [@mel.send] external blur: ([@mel.this] t_htmlElement) => unit = "blur"; 99 | [@mel.send] external click: ([@mel.this] t_htmlElement) => unit = "click"; 100 | [@mel.send] external focus: ([@mel.this] t_htmlElement) => unit = "focus"; 101 | [@mel.send] 102 | external focusPreventScroll: 103 | ( 104 | [@mel.as {json|{ "preventScroll": true }|json}] _, 105 | [@mel.this] t_htmlElement 106 | ) => 107 | unit = 108 | "focus"; 109 | [@mel.send] 110 | external forceSpellCheck: ([@mel.this] t_htmlElement) => unit = 111 | "forceSpellCheck"; /* experimental */ 112 | 113 | /* TODO: element-spcific, should be pulled out */ 114 | [@mel.get] external value: t_htmlElement => string = "value"; /* HTMLInputElement */ 115 | [@mel.get] external checked: t_htmlElement => bool = "checked"; /* HTMLInputElement */ 116 | [@mel.get] external type_: t_htmlElement => string = "type"; /* HTMLStyleElement */ 117 | [@mel.set] external setType: (t_htmlElement, string) => unit = "type"; /* HTMLStyleElement */ 118 | [@mel.get] external rel: t_htmlElement => string = "rel"; /* HTMLLinkElement */ 119 | [@mel.set] external setRel: (t_htmlElement, string) => unit = "rel"; /* HTMLLinkElement */ 120 | [@mel.get] external href: t_htmlElement => string = "href"; /* HTMLLinkElement, HTMLAnchorElement */ 121 | [@mel.set] external setHref: (t_htmlElement, string) => unit = "href"; /* HTMLLinkElement, HTMLAnchorElement */ 122 | }; 123 | 124 | /* TODO 125 | module Tree (T: { type t; }) => { 126 | include ElementRe.Tree { type t = Type }; 127 | include Impl { type t = Type }; 128 | }; 129 | 130 | include Tree { type t = Dom.htmlElement }; 131 | */ 132 | 133 | type t = Dom.htmlElement; 134 | 135 | include Webapi__Dom__Node.Impl({ 136 | type nonrec t = t; 137 | }); 138 | include Webapi__Dom__EventTarget.Impl({ 139 | type nonrec t = t; 140 | }); 141 | include Webapi__Dom__GlobalEventHandlers.Impl({ 142 | type nonrec t = t; 143 | }); 144 | include Webapi__Dom__Element.Impl({ 145 | type nonrec t = t; 146 | }); 147 | include Impl({ 148 | type nonrec t = t; 149 | }); 150 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__HtmlFormElement.re: -------------------------------------------------------------------------------- 1 | /* 2 | * Spec: https://html.spec.whatwg.org/multipage/forms.html#the-form-element 3 | * MDN: https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement 4 | */ 5 | 6 | module Impl = (T: { 7 | type t; 8 | }) => { 9 | type t_htmlFormElement = T.t; 10 | 11 | /* TODO: elements: HTMLFormControlsCollection */ 12 | [@mel.get] external length: t_htmlFormElement => int = "length"; 13 | [@mel.get] external name: t_htmlFormElement => string = "name"; 14 | [@mel.set] external setName: (t_htmlFormElement, string) => unit = "name"; 15 | [@mel.get] external method: t_htmlFormElement => string = "method"; 16 | [@mel.set] 17 | external setMethod: (t_htmlFormElement, string) => unit = "method"; 18 | [@mel.get] external target: t_htmlFormElement => string = "target"; 19 | [@mel.set] 20 | external setTarget: (t_htmlFormElement, string) => unit = "target"; 21 | [@mel.get] external action: t_htmlFormElement => string = "action"; 22 | [@mel.set] 23 | external setAction: (t_htmlFormElement, string) => unit = "action"; 24 | [@mel.get] 25 | external acceptCharset: t_htmlFormElement => string = "acceptCharset"; 26 | [@mel.set] 27 | external setAcceptCharset: (t_htmlFormElement, string) => unit = 28 | "acceptCharset"; 29 | [@mel.get] 30 | external autocomplete: t_htmlFormElement => string = "autocomplete"; 31 | [@mel.set] 32 | external setAutocomplete: (t_htmlFormElement, string) => unit = 33 | "autocomplete"; 34 | [@mel.get] external noValidate: t_htmlFormElement => bool = "noValidate"; 35 | [@mel.set] 36 | external setNoValidate: (t_htmlFormElement, bool) => unit = "noValidate"; 37 | [@mel.get] external enctype: t_htmlFormElement => string = "enctype"; 38 | [@mel.set] 39 | external setEnctype: (t_htmlFormElement, string) => unit = "enctype"; 40 | [@mel.get] external encoding: t_htmlFormElement => string = "encoding"; 41 | [@mel.set] 42 | external setEncoding: (t_htmlFormElement, string) => unit = "encoding"; 43 | 44 | [@mel.send] 45 | external submit: ([@mel.this] t_htmlFormElement) => unit = "submit"; 46 | [@mel.send] 47 | external reset: ([@mel.this] t_htmlFormElement) => unit = "reset"; 48 | [@mel.send] 49 | external checkValidity: ([@mel.this] t_htmlFormElement) => bool = 50 | "checkValidity"; 51 | [@mel.send] 52 | external reportValidity: ([@mel.this] t_htmlFormElement) => bool = 53 | "reportValidity"; 54 | 55 | /** @since 0.18.0 */ 56 | [@mel.new] 57 | external data: T.t => Fetch.FormData.t = "FormData"; 58 | }; 59 | 60 | type t = Dom.htmlFormElement; 61 | 62 | include Webapi__Dom__EventTarget.Impl({ 63 | type nonrec t = t; 64 | }); 65 | include Webapi__Dom__Node.Impl({ 66 | type nonrec t = t; 67 | }); 68 | include Webapi__Dom__Element.Impl({ 69 | type nonrec t = t; 70 | }); 71 | include Webapi__Dom__HtmlElement.Impl({ 72 | type nonrec t = t; 73 | }); 74 | include Impl({ 75 | type nonrec t = t; 76 | }); 77 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__HtmlImageElement.re: -------------------------------------------------------------------------------- 1 | type t; 2 | 3 | [@mel.new] external make: unit => t = "Image"; 4 | [@mel.new] external makeWithSize: (int, int) => t = "Image"; 5 | 6 | [@mel.get] external alt: t => string = "alt"; 7 | [@mel.set] external setAlt: (t, string) => unit = "alt"; 8 | [@mel.get] external src: t => string = "src"; 9 | [@mel.set] external setSrc: (t, string) => unit = "src"; 10 | [@mel.get] external srcset: t => string = "srcset"; 11 | [@mel.set] external setSrcset: (t, string) => unit = "srcset"; 12 | [@mel.get] external sizes: t => string = "sizes"; 13 | [@mel.set] external setSizes: (t, string) => unit = "sizes"; 14 | [@mel.get] [@mel.return nullable] 15 | external crossOrigin: t => option(string) = "crossOrigin"; 16 | [@mel.set] 17 | external setCrossOrigin: (t, Js.null(string)) => unit = "crossOrigin"; 18 | let setCrossOrigin = (self, value) => 19 | setCrossOrigin(self, Js.Null.fromOption(value)); 20 | [@mel.get] external useMap: t => string = "useMap"; 21 | [@mel.set] external setUseMap: (t, string) => unit = "useMap"; 22 | [@mel.get] external isMap: t => bool = "isMap"; 23 | [@mel.set] external setIsMap: (t, bool) => unit = "isMap"; 24 | [@mel.get] external height: t => int = "height"; 25 | [@mel.set] external setHeight: (t, int) => unit = "height"; 26 | [@mel.get] external width: t => int = "width"; 27 | [@mel.set] external setWidth: (t, int) => unit = "width"; 28 | [@mel.get] external naturalHeight: t => int = "naturalHeight"; 29 | [@mel.get] external naturalWidth: t => int = "naturalWidth"; 30 | [@mel.get] external complete: t => bool = "complete"; 31 | [@mel.get] external currentSrc: t => string = "currentSrc"; 32 | [@mel.get] external referrerPolicy: t => string = "referrerPolicy"; 33 | [@mel.set] external setReferrerPolicy: (t, string) => unit = "referrerPolicy"; 34 | [@mel.get] external decoding: t => string = "decoding"; 35 | [@mel.set] external setDecoding: (t, string) => unit = "decoding"; 36 | 37 | [@mel.send] external decode: ([@mel.this] t) => Js.Promise.t(unit) = "decode"; 38 | 39 | include Webapi__Dom__Node.Impl({ 40 | type nonrec t = t; 41 | }); 42 | include Webapi__Dom__EventTarget.Impl({ 43 | type nonrec t = t; 44 | }); 45 | include Webapi__Dom__Element.Impl({ 46 | type nonrec t = t; 47 | }); 48 | include Webapi__Dom__HtmlElement.Impl({ 49 | type nonrec t = t; 50 | }); 51 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__IdbVersionChangeEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.idbVersionChangeEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | 7 | [@mel.new] external make: string => t = "IDBVersionChangeEvent"; 8 | [@mel.new] 9 | external makeWithOptions: (string, Js.t({..})) => t = "IDBVersionChangeEvent"; 10 | 11 | [@mel.get] external oldVersion: t => int = "oldVersion"; 12 | [@mel.get] external newVersion: t => int = "newVersion"; 13 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__Image.re: -------------------------------------------------------------------------------- 1 | type t; 2 | 3 | [@mel.new] 4 | external makeWithData: 5 | ( 6 | ~array: Js.Typed_array.Uint8ClampedArray.t, 7 | ~width: float, 8 | ~height: float 9 | ) => 10 | t = 11 | "ImageData"; 12 | 13 | [@mel.new] external make: (~width: float, ~height: float) => t = "ImageData"; 14 | 15 | [@mel.get] external data: t => Js.Typed_array.Uint8ClampedArray.t = "data"; 16 | [@mel.get] external height: t => float = "height"; 17 | [@mel.get] external width: t => float = "width"; 18 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__InputEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.inputEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | include Webapi__Dom__UiEvent.Impl({ 7 | type nonrec t = t; 8 | }); 9 | 10 | [@mel.new] external make: string => t = "InputEvent"; 11 | [@mel.new] external makeWithOptions: (string, Js.t({..})) => t = "InputEvent"; 12 | 13 | [@mel.get] external data: t => string = "data"; 14 | [@mel.get] external isComposing: t => bool = "isComposing"; 15 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__KeyboardEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.keyboardEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | include Webapi__Dom__UiEvent.Impl({ 7 | type nonrec t = t; 8 | }); 9 | 10 | [@mel.new] external make: string => t = "KeyboardEvent"; 11 | [@mel.new] 12 | external makeWithOptions: (string, Js.t({..})) => t = "KeyboardEvent"; 13 | 14 | [@mel.get] external altKey: t => bool = "altKey"; 15 | [@mel.get] external code: t => string = "code"; 16 | [@mel.get] external ctrlKey: t => bool = "ctrlKey"; 17 | [@mel.get] external isComposing: t => bool = "isComposing"; 18 | [@mel.get] external key: t => string = "key"; 19 | [@mel.get] external locale: t => string = "locale"; 20 | [@mel.get] external location: t => int = "location"; 21 | [@mel.get] external metaKey: t => bool = "metaKey"; 22 | [@mel.get] external repeat: t => bool = "repeat"; 23 | [@mel.get] external shiftKey: t => bool = "shiftKey"; 24 | 25 | [@mel.send] 26 | external getModifierState: 27 | (string /* modifierKey enum */, [@mel.this] t) => bool = 28 | "getModifierState"; 29 | let getModifierState: (Webapi__Dom__Types.modifierKey, t) => bool = 30 | (key, self) => 31 | getModifierState(Webapi__Dom__Types.encodeModifierKey(key), self); 32 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__Location.re: -------------------------------------------------------------------------------- 1 | type t = Dom.location; 2 | 3 | /* a more ergonomic API would perhaps accept a Window.t directly instead of Location.t */ 4 | [@mel.get] external href: t => string = "href"; 5 | [@mel.set] external setHref: (t, string) => unit = "href"; 6 | [@mel.get] external protocol: t => string = "protocol"; 7 | [@mel.set] external setProtocol: (t, string) => unit = "protocol"; 8 | [@mel.get] external host: t => string = "host"; 9 | [@mel.set] external setHost: (t, string) => unit = "host"; 10 | [@mel.get] external hostname: t => string = "hostname"; 11 | [@mel.set] external setHostname: (t, string) => unit = "hostname"; 12 | [@mel.get] external port: t => string = "port"; 13 | [@mel.set] external setPort: (t, string) => unit = "port"; 14 | [@mel.get] external pathname: t => string = "pathname"; 15 | [@mel.set] external setPathname: (t, string) => unit = "pathname"; 16 | [@mel.get] external search: t => string = "search"; 17 | [@mel.set] external setSearch: (t, string) => unit = "search"; 18 | [@mel.get] external hash: t => string = "hash"; 19 | [@mel.set] external setHash: (t, string) => unit = "hash"; 20 | [@mel.get] external username: t => string = "username"; 21 | [@mel.set] external setUsername: (t, string) => unit = "username"; 22 | [@mel.get] external password: t => string = "password"; 23 | [@mel.set] external setPassword: (t, string) => unit = "password"; 24 | [@mel.get] external origin: t => string = "origin"; 25 | 26 | [@mel.send] external assign: (string, [@mel.this] t) => unit = "assign"; 27 | [@mel.send] external reload: ([@mel.this] t) => unit = "reload"; 28 | [@mel.send] 29 | external reloadWithForce: ([@mel.as {json|true|json}] _, [@mel.this] t) => unit = 30 | "reload"; 31 | [@mel.send] external replace: (string, [@mel.this] t) => unit = "replace"; 32 | [@mel.send] external toString: ([@mel.this] t) => string = "toString"; 33 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__MouseEvent.re: -------------------------------------------------------------------------------- 1 | module Impl = (T: { 2 | type t; 3 | }) => { 4 | [@mel.get] external altKey: T.t => bool = "altKey"; 5 | [@mel.get] external button: T.t => int = "button"; 6 | [@mel.get] external buttons: T.t => int /* bitmask */ = "buttons"; 7 | [@mel.get] external clientX: T.t => int = "clientX"; 8 | [@mel.get] external clientY: T.t => int = "clientY"; 9 | [@mel.get] external ctrlKey: T.t => bool = "ctrlKey"; 10 | [@mel.get] external metaKey: T.t => bool = "metaKey"; 11 | [@mel.get] external movementX: T.t => int = "movementX"; 12 | [@mel.get] external movementY: T.t => int = "movementY"; 13 | [@mel.get] external offsetX: T.t => int = "offsetX"; /* experimental, but widely supported */ 14 | [@mel.get] external offsetY: T.t => int = "offsetY"; /* experimental, but widely supported */ 15 | [@mel.get] external pageX: T.t => int = "pageX"; /* experimental, but widely supported */ 16 | [@mel.get] external pageY: T.t => int = "pageY"; /* experimental, but widely supported */ 17 | [@mel.get] [@mel.return nullable] 18 | external region: T.t => option(string) = "region"; 19 | [@mel.get] [@mel.return nullable] 20 | external relatedTarget: T.t => option(Dom.eventTarget) = "relatedTarget"; 21 | [@mel.get] external screenX: T.t => int = "screenX"; 22 | [@mel.get] external screenY: T.t => int = "screenY"; 23 | [@mel.get] external shiftKey: T.t => bool = "shiftKey"; 24 | [@mel.get] external x: T.t => int = "x"; /* experimental */ 25 | [@mel.get] external y: T.t => int = "y"; /* experimental */ 26 | [@mel.send] 27 | external getModifierState: 28 | (string /* modifierKey enum */, [@mel.this] T.t) => bool = 29 | "getModifierState"; 30 | let getModifierState: (Webapi__Dom__Types.modifierKey, T.t) => bool = 31 | (key, self) => 32 | getModifierState(Webapi__Dom__Types.encodeModifierKey(key), self); 33 | }; 34 | 35 | type t = Dom.mouseEvent; 36 | 37 | include Webapi__Dom__Event.Impl({ 38 | type nonrec t = t; 39 | }); 40 | include Webapi__Dom__UiEvent.Impl({ 41 | type nonrec t = t; 42 | }); 43 | include Impl({ 44 | type nonrec t = t; 45 | }); 46 | 47 | [@mel.new] external make: string => t = "MouseEvent"; 48 | [@mel.new] external makeWithOptions: (string, Js.t({..})) => t = "MouseEvent"; 49 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__MutationObserver.re: -------------------------------------------------------------------------------- 1 | type t = Dom.mutationObserver; 2 | 3 | [@mel.new] 4 | external make: ((array(Dom.mutationRecord), t) => unit) => t = 5 | "MutationObserver"; 6 | 7 | [@mel.send] 8 | external observe: (Dom.node_like('a), Js.t({..}), [@mel.this] t) => unit = 9 | "observe"; 10 | [@mel.send] external disconnect: ([@mel.this] t) => unit = "disconnect"; 11 | [@mel.send] 12 | external takeRecords: ([@mel.this] t) => array(Dom.mutationRecord) = 13 | "takeRecords"; 14 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__MutationRecord.re: -------------------------------------------------------------------------------- 1 | type t = Dom.mutationRecord; 2 | 3 | [@mel.get] external type_: t => string = "type"; 4 | [@mel.get] external target: t => Dom.node = "target"; 5 | [@mel.get] external addedNodes: t => Dom.nodeList = "addedNodes"; 6 | [@mel.get] external removedNodes: t => Dom.nodeList = "removedNodes"; 7 | [@mel.get] [@mel.return nullable] 8 | external previousSibling: t => option(Dom.node) = "previousSibling"; 9 | [@mel.get] [@mel.return nullable] 10 | external nextSibling: t => option(Dom.node) = "nextSibling"; 11 | [@mel.get] external attributeName: t => string = "attributeName"; 12 | [@mel.get] external attributeNamespace: t => string = "attributeNamespace"; 13 | [@mel.get] external oldValue: t => string = "oldValue"; 14 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__NamedNodeMap.re: -------------------------------------------------------------------------------- 1 | type t = Dom.namedNodeMap; 2 | 3 | [@mel.get] external length: t => int = "length"; 4 | 5 | [@mel.send] [@mel.return nullable] 6 | external item: (int, [@mel.this] t) => option(Dom.attr) = "item"; 7 | [@mel.send] [@mel.return nullable] 8 | external getNamedItem: (string, [@mel.this] t) => option(Dom.attr) = 9 | "getNamedItem"; 10 | [@mel.send] [@mel.return nullable] 11 | external getNamedItemNS: (string, string, [@mel.this] t) => option(Dom.attr) = 12 | "getNamedItemNS"; 13 | [@mel.send] 14 | external setNamedItem: (Dom.attr, [@mel.this] t) => unit = "setNamedItem"; 15 | [@mel.send] 16 | external setNamedItemNS: (Dom.attr, [@mel.this] t) => unit = "setNamedItemNS"; 17 | [@mel.send] 18 | external removeNamedItem: (string, [@mel.this] t) => Dom.attr = 19 | "removeNamedItem"; 20 | [@mel.send] 21 | external removeNamedItemNS: (string, string, [@mel.this] t) => Dom.attr = 22 | "removeNamedItemNS"; 23 | 24 | [@mel.scope ("Array", "prototype", "slice")] 25 | external toArray: t => array(Dom.attr) = "call"; 26 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__Node.re: -------------------------------------------------------------------------------- 1 | module Impl = (T: { 2 | type t; 3 | }) => { 4 | external asNode: T.t => Dom.node = "%identity"; 5 | 6 | /* baseURI */ 7 | [@mel.get] external childNodes: T.t => Dom.nodeList = "childNodes"; 8 | [@mel.get] [@mel.return nullable] 9 | external firstChild: T.t => option(Dom.node) = "firstChild"; 10 | [@mel.get] external innerText: T.t => string = "innerText"; 11 | [@mel.set] external setInnerText: (T.t, string) => unit = "innerText"; 12 | [@mel.get] [@mel.return nullable] 13 | external lastChild: T.t => option(Dom.node) = "lastChild"; 14 | [@mel.get] [@mel.return nullable] 15 | external nextSibling: T.t => option(Dom.node) = "nextSibling"; 16 | [@mel.get] external nodeName: T.t => string = "nodeName"; /* nodePrincipal */ 17 | [@mel.get] external nodeType: T.t => int /* nodeType enum */ = "nodeType"; 18 | let nodeType: T.t => Webapi__Dom__Types.nodeType = 19 | self => Webapi__Dom__Types.decodeNodeType(nodeType(self)); 20 | [@mel.get] [@mel.return nullable] 21 | external nodeValue: T.t => option(string) = "nodeValue"; 22 | [@mel.set] 23 | external setNodeValue: (T.t, Js.null(string)) => unit = "nodeValue" /* let setNodeValue : T.t => option string => unit = fun self value => setNodeValue self (Js.Null.fromOption value); */; /* temporarily removed to reduce codegen size */ 24 | /* Not supported yet 25 | external setNodeValue : T.t => string => unit = "nodeValue" [@@mel.set]; 26 | external clearNodeValue : T.t => _ [@mel.as {json|null|json}] => unit = "nodeValue" [@@mel.set]; 27 | */ 28 | /* outerText */ 29 | [@mel.get] external ownerDocument: T.t => Dom.document = "ownerDocument"; 30 | [@mel.get] [@mel.return nullable] 31 | external parentElement: T.t => option(Dom.element) = "parentElement"; 32 | [@mel.get] [@mel.return nullable] 33 | external parentNode: T.t => option(Dom.node) = "parentNode"; 34 | [@mel.get] [@mel.return nullable] 35 | external previousSibling: T.t => option(Dom.node) = "previousSibling"; 36 | [@mel.get] external rootNode: T.t => Dom.node = "rootNode"; 37 | [@mel.get] external textContent: T.t => string = "textContent"; 38 | [@mel.set] external setTextContent: (T.t, string) => unit = "textContent"; 39 | 40 | [@mel.send] 41 | external appendChild: (Dom.node_like('a), [@mel.this] T.t) => unit = 42 | "appendChild"; 43 | [@mel.send] external cloneNode: ([@mel.this] T.t) => T.t = "cloneNode"; 44 | [@mel.send] 45 | external cloneNodeDeep: 46 | ([@mel.as {json|true|json}] _, [@mel.this] T.t) => T.t = 47 | "cloneNode"; 48 | [@mel.send] 49 | external compareDocumentPosition: 50 | (Dom.node_like('a), [@mel.this] T.t) => int = 51 | "compareDocumentPosition"; /* returns a bitmask which could also be represeneted as an enum, see https://developer.mozilla.org/en-US/docs/Web/API/Node/compareDocumentPosition */ 52 | [@mel.send] 53 | external contains: (Dom.node_like('a), [@mel.this] T.t) => bool = 54 | "contains"; 55 | [@mel.send] 56 | external getRootNode: ([@mel.this] T.t) => Dom.node = "getRootNode"; 57 | [@mel.send] 58 | external getRootNodeComposed: 59 | ([@mel.as {json|{ "composed": true }|json}] _, [@mel.this] T.t) => Dom.node = 60 | "getRootNode"; 61 | [@mel.send] 62 | external hasChildNodes: ([@mel.this] T.t) => bool = "hasChildNodes"; 63 | [@mel.send] 64 | external insertBefore: 65 | (Dom.node_like('a), Dom.node_like('b), [@mel.this] T.t) => 66 | Dom.node_like('a) = 67 | "insertBefore"; 68 | /* (temporarily?) removed to reduce codegen size. This variant is just for convenience, `appendChild` can be used in place of passing `null` to `insertBefore` 69 | [@mel.send] 70 | external insertBefore : Dom.node_like 'a => Js.null (Dom.node_like 'b) => ([@mel.this] T.t) => Dom.node_like 'a = "insertBefore"; 71 | let insertBefore : Dom.node_like 'a => option (Dom.node_like 'b) => T.t => Dom.node_like 'a = fun node reference self => insertBefore node (Js.Null.fromOption reference) self; 72 | */ 73 | [@mel.send] 74 | external isDefaultNamespace: (string, [@mel.this] T.t) => bool = 75 | "isDefaultNamespace"; 76 | [@mel.send] 77 | external isEqualNode: (Dom.node_like('a), [@mel.this] T.t) => bool = 78 | "isEqualNode"; 79 | [@mel.send] 80 | external isSameNode: (Dom.node_like('a), [@mel.this] T.t) => bool = 81 | "isSameNode"; 82 | [@mel.send] [@mel.return nullable] 83 | external lookupNamespaceURI: (string, [@mel.this] T.t) => option(string) = 84 | "lookupNamespaceURI"; 85 | [@mel.send] [@mel.return nullable] 86 | external lookupDefaultNamespaceURI: 87 | ([@mel.as {json|null|json}] _, [@mel.this] T.t) => option(string) = 88 | "lookupNamespaceURI"; 89 | [@mel.send] 90 | external lookupPrefix: ([@mel.this] T.t) => string = "lookupPrefix"; 91 | [@mel.send] external normalize: ([@mel.this] T.t) => unit = "normalize"; 92 | [@mel.send] 93 | external removeChild: 94 | (Dom.node_like('a), [@mel.this] T.t) => Dom.node_like('a) = 95 | "removeChild"; 96 | 97 | /** @since 0.19.0 */ 98 | [@mel.send] 99 | external replaceChild: 100 | (Dom.node_like('a), Dom.node_like('b), [@mel.this] T.t) => 101 | Dom.node_like('b) = 102 | "replaceChild"; 103 | }; 104 | 105 | type t = Dom.node; 106 | 107 | include Webapi__Dom__EventTarget.Impl({ 108 | type nonrec t = t; 109 | }); 110 | include Impl({ 111 | type nonrec t = t; 112 | }); 113 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__NodeFilter.re: -------------------------------------------------------------------------------- 1 | type t = Dom.nodeFilter; 2 | 3 | let make = f => {Dom.acceptNode: f}; 4 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__NodeIterator.re: -------------------------------------------------------------------------------- 1 | type t = Dom.nodeIterator; 2 | 3 | [@mel.get] external root: t => Dom.node = "root"; 4 | [@mel.get] external referenceNode: t => Dom.node = "referenceNode"; 5 | [@mel.get] 6 | external pointerBeforeReferenceNode: t => bool = "pointerBeforeReferenceNode"; 7 | [@mel.get] 8 | external whatToShow: t => Webapi__Dom__Types.WhatToShow.t = "whatToShow"; 9 | [@mel.get] [@mel.return nullable] 10 | external filter: t => option(Dom.nodeFilter) = "filter"; 11 | 12 | [@mel.send] [@mel.return nullable] 13 | external nextNode: ([@mel.this] t) => option(Dom.node) = "nextNode"; 14 | [@mel.send] [@mel.return nullable] 15 | external previousNode: ([@mel.this] t) => option(Dom.node) = "previousNode"; 16 | [@mel.send] external detach: ([@mel.this] t) => unit = "detach"; 17 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__NodeList.re: -------------------------------------------------------------------------------- 1 | type t = Dom.nodeList; 2 | 3 | external toArray: t => array(Dom.node) = "Array.prototype.slice.call"; 4 | 5 | [@mel.send] 6 | external forEach: ((Dom.node, int) => unit, [@mel.this] t) => unit = "forEach"; 7 | 8 | [@mel.get] external length: t => int = "length"; 9 | 10 | [@mel.send] [@mel.return nullable] 11 | external item: (int, [@mel.this] t) => option(Dom.node) = "item"; 12 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__NonDocumentTypeChildNode.re: -------------------------------------------------------------------------------- 1 | /* Mixin */ 2 | module Impl = (T: { 3 | type t; 4 | }) => { 5 | [@mel.get] [@mel.return nullable] 6 | external previousElementSibling: T.t => option(Dom.element) = 7 | "previousElementSibling"; 8 | [@mel.get] [@mel.return nullable] 9 | external nextElementSibling: T.t => option(Dom.element) = 10 | "nextElementSibling"; 11 | }; 12 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__NonElementParentNode.re: -------------------------------------------------------------------------------- 1 | /* Mixin */ 2 | module Impl = (T: { 3 | type t; 4 | }) => { 5 | [@mel.send] [@mel.return nullable] 6 | external getElementById: (string, [@mel.this] T.t) => option(Dom.element) = 7 | "getElementById"; 8 | }; 9 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__PageTransitionEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.pageTransitionEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | 7 | [@mel.new] external make: string => t = "PageTransitionEvent"; 8 | [@mel.new] 9 | external makeWithOptions: (string, Js.t({..})) => t = "PageTransitionEvent"; 10 | 11 | [@mel.get] external persisted: t => bool = "persisted"; 12 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__ParentNode.re: -------------------------------------------------------------------------------- 1 | /* Mixin */ 2 | module Impl = (T: { 3 | type t; 4 | }) => { 5 | [@mel.get] external children: T.t => Dom.htmlCollection = "children"; 6 | [@mel.get] [@mel.return nullable] 7 | external firstElementChild: T.t => option(Dom.element) = 8 | "firstElementChild"; 9 | [@mel.get] [@mel.return nullable] 10 | external lastElementChild: T.t => option(Dom.element) = "lastElementChild"; 11 | [@mel.get] external childElementCount: T.t => int = "childElementCount"; 12 | [@mel.send] [@mel.return nullable] 13 | external querySelector: (string, [@mel.this] T.t) => option(Dom.element) = 14 | "querySelector"; 15 | [@mel.send] 16 | external querySelectorAll: (string, [@mel.this] T.t) => Dom.nodeList = 17 | "querySelectorAll"; 18 | }; 19 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__PointerEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.pointerEvent; 2 | type pointerId = Dom.eventPointerId; 3 | 4 | include Webapi__Dom__Event.Impl({ 5 | type nonrec t = t; 6 | }); 7 | include Webapi__Dom__UiEvent.Impl({ 8 | type nonrec t = t; 9 | }); 10 | include Webapi__Dom__MouseEvent.Impl({ 11 | type nonrec t = t; 12 | }); 13 | 14 | [@mel.new] external make: string => t = "PointerEvent"; 15 | [@mel.new] 16 | external makeWithOptions: (string, Js.t({..})) => t = "PointerEvent"; 17 | 18 | [@mel.get] external pointerId: t => pointerId = "pointerId"; 19 | [@mel.get] external width: t => int = "width"; 20 | [@mel.get] external height: t => int = "height"; 21 | [@mel.get] external pressure: t => float = "pressure"; 22 | [@mel.get] external tiltX: t => int = "tiltX"; 23 | [@mel.get] external tiltY: t => int = "tiltY"; 24 | [@mel.get] 25 | external pointerType: t => string /* pointerType enum */ = "pointerType"; 26 | let pointerType: t => Webapi__Dom__Types.pointerType = 27 | self => Webapi__Dom__Types.decodePointerType(pointerType(self)); 28 | [@mel.get] external isPrimary: t => bool = "isPrimary"; 29 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__PopStateEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.popStateEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | 7 | [@mel.new] external make: string => t = "PopStateEvent"; 8 | [@mel.new] 9 | external makeWithOptions: (string, Js.t({..})) => t = "PopStateEvent"; 10 | 11 | [@mel.get] external state: t => Js.t({..}) = "state"; 12 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__ProcessingInstruction.re: -------------------------------------------------------------------------------- 1 | type t = Dom.processingInstruction; 2 | 3 | include Webapi__Dom__Node.Impl({ 4 | type nonrec t = t; 5 | }); 6 | include Webapi__Dom__EventTarget.Impl({ 7 | type nonrec t = t; 8 | }); 9 | include Webapi__Dom__NonDocumentTypeChildNode.Impl({ 10 | type nonrec t = t; 11 | }); 12 | include Webapi__Dom__ChildNode.Impl({ 13 | type nonrec t = t; 14 | }); 15 | 16 | [@mel.get] external target: t => string = "target"; 17 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__ProgressEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.progressEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | 7 | [@mel.new] external make: string => t = "ProgressEvent"; 8 | [@mel.new] 9 | external makeWithOptions: (string, Js.t({..})) => t = "ProgressEvent"; 10 | 11 | [@mel.get] external lengthComputable: t => bool = "lengthComputable"; 12 | [@mel.get] external loaded: t => int = "loaded"; 13 | [@mel.get] external total: t => int = "total"; 14 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__Range.re: -------------------------------------------------------------------------------- 1 | type t = Dom.range; 2 | 3 | [@mel.new] external make: unit => t = "Range"; /* experimental */ 4 | 5 | [@mel.get] external collapsed: t => bool = "collapsed"; 6 | [@mel.get] 7 | external commonAncestorContainer: t => Dom.node = "commonAncestorContainer"; 8 | [@mel.get] external endContainer: t => Dom.node = "endContainer"; 9 | [@mel.get] external endOffset: t => int = "endOffset"; 10 | [@mel.get] external startContainer: t => Dom.node = "startContainer"; 11 | [@mel.get] external startOffset: t => int = "startOffset"; 12 | 13 | [@mel.send] 14 | external setStart: (Dom.node_like('a), int, [@mel.this] t) => unit = 15 | "setStart"; 16 | [@mel.send] 17 | external setEnd: (Dom.node_like('a), int, [@mel.this] t) => unit = "setEnd"; 18 | [@mel.send] 19 | external setStartBefore: (Dom.node_like('a), [@mel.this] t) => unit = 20 | "setStartBefore"; 21 | [@mel.send] 22 | external setStartAfter: (Dom.node_like('a), [@mel.this] t) => unit = 23 | "setStartAfter"; 24 | [@mel.send] 25 | external setEndBefore: (Dom.node_like('a), [@mel.this] t) => unit = 26 | "setEndBefore"; 27 | [@mel.send] 28 | external setEndAfter: (Dom.node_like('a), [@mel.this] t) => unit = 29 | "setEndAfter"; 30 | [@mel.send] 31 | external selectNode: (Dom.node_like('a), [@mel.this] t) => unit = 32 | "selectNode"; 33 | [@mel.send] 34 | external selectNodeContents: (Dom.node_like('a), [@mel.this] t) => unit = 35 | "selectNodeContents"; 36 | [@mel.send] external collapse: ([@mel.this] t) => unit = "collapse"; 37 | [@mel.send] 38 | external collapseToStart: ([@mel.as {json|true|json}] _, [@mel.this] t) => unit = 39 | "collapse"; 40 | [@mel.send] 41 | external cloneContents: ([@mel.this] t) => Dom.documentFragment = 42 | "cloneContents"; 43 | [@mel.send] 44 | external deleteContents: ([@mel.this] t) => unit = "deleteContents"; 45 | [@mel.send] 46 | external extractContents: ([@mel.this] t) => Dom.documentFragment = 47 | "extractContents"; 48 | [@mel.send] 49 | external insertNode: (Dom.node_like('a), [@mel.this] t) => unit = 50 | "insertNode"; 51 | [@mel.send] 52 | external surroundContents: (Dom.node_like('a), [@mel.this] t) => unit = 53 | "surroundContents"; 54 | [@mel.send] 55 | external compareBoundaryPoints: 56 | (int /* compareHow enum */, t, [@mel.this] t) => int /* compareResult enum */ = 57 | "compareBoundaryPoints"; 58 | let compareBoundaryPoint: 59 | (Webapi__Dom__Types.compareHow, t, t) => Webapi__Dom__Types.compareResult = 60 | (how, range, self) => 61 | Webapi__Dom__Types.decodeCompareResult( 62 | compareBoundaryPoints( 63 | Webapi__Dom__Types.encodeCompareHow(how), 64 | range, 65 | self, 66 | ), 67 | ); 68 | [@mel.send] external cloneRange: ([@mel.this] t) => t = "cloneRange"; 69 | [@mel.send] external detach: ([@mel.this] t) => unit = "detach"; 70 | [@mel.send] external toString: ([@mel.this] t) => string = "toString"; 71 | [@mel.send] 72 | external comparePoint: 73 | (Dom.node_like('a), int, [@mel.this] t) => int /* compareRsult enum */ = 74 | "comparePoint"; 75 | let comparePoint: 76 | (Dom.node_like('a), int, t) => Webapi__Dom__Types.compareResult = 77 | (node, offset, self) => 78 | Webapi__Dom__Types.decodeCompareResult(comparePoint(node, offset, self)); 79 | [@mel.send] 80 | external createContextualFragment: 81 | (string, [@mel.this] t) => Dom.documentFragment = 82 | "createContextualFragment"; /* experimental, but widely supported */ 83 | [@mel.send] 84 | external getBoundingClientRect: ([@mel.this] t) => Dom.domRect = 85 | "getBoundingClientRect"; /* experimental, but widely supported */ 86 | [@mel.send] 87 | external getClientRects: ([@mel.this] t) => array(Dom.domRect) = 88 | "getClientRects"; /* experimental, but widely supported */ 89 | [@mel.send] 90 | external intersectsNode: (Dom.node_like('a), [@mel.this] t) => bool = 91 | "intersectsNode"; 92 | [@mel.send] 93 | external isPointInRange: (Dom.node_like('a), int, [@mel.this] t) => bool = 94 | "isPointInRange"; 95 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__RelatedEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.relatedEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | 7 | [@mel.new] external make: string => t = "RelatedEvent"; 8 | [@mel.new] 9 | external makeWithOptions: (string, Js.t({..})) => t = "RelatedEvent"; 10 | 11 | [@mel.get] [@mel.return nullable] 12 | external relatedTarget: t => option(Dom.eventTarget) = "relatedTarget"; 13 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__Selection.re: -------------------------------------------------------------------------------- 1 | type t = Dom.selection; 2 | 3 | [@mel.get] [@mel.return nullable] 4 | external anchorNode: t => option(Dom.node) = "anchorNode"; 5 | [@mel.get] external anchorOffset: t => int = "anchorOffset"; 6 | [@mel.get] [@mel.return nullable] 7 | external focusNode: t => option(Dom.node) = "focusNode"; 8 | [@mel.get] external focusOffset: t => int = "focusOffset"; 9 | [@mel.get] external isCollapsed: t => bool = "isCollapsed"; 10 | [@mel.get] external rangeCount: t => int = "rangeCount"; 11 | 12 | [@mel.send] 13 | external getRangeAt: (int, [@mel.this] t) => Dom.range = "getRangeAt"; 14 | [@mel.send] 15 | external collapse: (Dom.node_like(_), int, [@mel.this] t) => unit = 16 | "collapse"; 17 | [@mel.send] 18 | external extend: (Dom.node_like(_), int, [@mel.this] t) => unit = "extend"; 19 | [@mel.send] 20 | external collapseToStart: ([@mel.this] t) => unit = "collapseToStart"; 21 | [@mel.send] external collapseToEnd: ([@mel.this] t) => unit = "collapseToEnd"; 22 | [@mel.send] 23 | external selectAllChildren: (Dom.node_like(_), [@mel.this] t) => unit = 24 | "selectAllChildren"; 25 | [@mel.send] 26 | external setBaseAndExtent: 27 | (Dom.node_like(_), int, Dom.node_like(_), int, [@mel.this] t) => unit = 28 | "setBaseAndExtent"; 29 | [@mel.send] external addRange: (Dom.range, [@mel.this] t) => unit = "addRange"; 30 | [@mel.send] 31 | external removeRange: (Dom.range, [@mel.this] t) => unit = "removeRange"; 32 | [@mel.send] 33 | external removeAllRanges: ([@mel.this] t) => unit = "removeAllRanges"; 34 | [@mel.send] 35 | external deleteFromDocument: ([@mel.this] t) => unit = "deleteFromDocument"; 36 | [@mel.send] external toString: ([@mel.this] t) => string = "toString"; 37 | [@mel.send] 38 | external containsNode: 39 | (Dom.node_like(_), [@mel.as {json|false|json}] _, [@mel.this] t) => bool = 40 | "containsNode"; 41 | [@mel.send] 42 | external containsNodePartly: 43 | (Dom.node_like(_), [@mel.as {json|true|json}] _, [@mel.this] t) => bool = 44 | "containsNode"; 45 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__ShadowRoot.re: -------------------------------------------------------------------------------- 1 | type t = Dom.shadowRoot; 2 | 3 | include Webapi__Dom__Node.Impl({ 4 | type nonrec t = t; 5 | }); 6 | include Webapi__Dom__EventTarget.Impl({ 7 | type nonrec t = t; 8 | }); 9 | include Webapi__Dom__NonElementParentNode.Impl({ 10 | type nonrec t = t; 11 | }); 12 | include Webapi__Dom__DocumentOrShadowRoot.Impl({ (); }); 13 | include Webapi__Dom__ParentNode.Impl({ 14 | type nonrec t = t; 15 | }); 16 | 17 | [@mel.get] external shadowRootMode: t => string = "shadowRootMode"; 18 | let shadowRootMode: t => Webapi__Dom__Types.shadowRootMode = 19 | self => Webapi__Dom__Types.decodeShadowRootMode(shadowRootMode(self)); 20 | [@mel.get] external host: t => Dom.element = "host"; 21 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__Slotable.re: -------------------------------------------------------------------------------- 1 | /* Mixin */ 2 | module Impl = (T: { 3 | type t; 4 | }) => { 5 | [@mel.get] [@mel.return nullable] 6 | external assignedSlot: T.t => option(Dom.htmlSlotElement) = "assignedSlot"; 7 | }; 8 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__StorageEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.storageEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | 7 | [@mel.new] external make: string => t = "StorageEvent"; 8 | [@mel.new] 9 | external makeWithOptions: (string, Js.t({..})) => t = "StorageEvent"; 10 | 11 | [@mel.get] external key: t => string = "key"; 12 | [@mel.get] external newValue: t => Js.Nullable.t(string) = "newValue"; 13 | [@mel.get] external oldValue: t => Js.Nullable.t(string) = "oldValue"; 14 | [@mel.get] external storageArea: t => Dom.Storage.t = "storageArea"; 15 | [@mel.get] external url: t => string = "url"; 16 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__SvgZoomEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.svgZoomEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | include Webapi__Dom__UiEvent.Impl({ 7 | type nonrec t = t; 8 | }); 9 | 10 | [@mel.new] external make: string => t = "SVGZoomEvent"; 11 | [@mel.new] 12 | external makeWithOptions: (string, Js.t({..})) => t = "SVGZoomEvent"; 13 | 14 | [@mel.get] external zoomRectScreen: t => Dom.svgRect = "zoomRectScreen"; 15 | [@mel.get] external previousScale: t => float = "previousScale"; 16 | [@mel.get] external previousTranslate: t => Dom.svgPoint = "previousTranslate"; 17 | [@mel.get] external newScale: t => float = "newScale"; 18 | [@mel.get] external newTranslate: t => Dom.svgPoint = "newTranslate"; 19 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__Text.re: -------------------------------------------------------------------------------- 1 | let ofNode = (node: Dom.node): option('a) => 2 | Webapi__Dom__Node.nodeType(node) == Webapi__Dom__Types.Text 3 | ? Some(Obj.magic(node)) : None; 4 | 5 | module Impl = (T: { 6 | type t; 7 | }) => { 8 | let ofNode: Dom.node => option(T.t) = ofNode; 9 | 10 | [@mel.send] 11 | external splitText: (~offset: int, unit, [@mel.this] T.t) => Dom.text = 12 | "splitText"; 13 | [@mel.get] external wholeText: T.t => string = "wholeText"; 14 | }; 15 | 16 | type t = Dom.text; 17 | 18 | include Webapi__Dom__Node.Impl({ 19 | type nonrec t = t; 20 | }); 21 | include Webapi__Dom__EventTarget.Impl({ 22 | type nonrec t = t; 23 | }); 24 | include Webapi__Dom__CharacterData.Impl({ 25 | type nonrec t = t; 26 | }); 27 | include Webapi__Dom__NonDocumentTypeChildNode.Impl({ 28 | type nonrec t = t; 29 | }); 30 | include Webapi__Dom__ChildNode.Impl({ 31 | type nonrec t = t; 32 | }); 33 | include Webapi__Dom__Slotable.Impl({ 34 | type nonrec t = t; 35 | }); 36 | include Impl({ 37 | type nonrec t = t; 38 | }); 39 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__TimeEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.timeEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | 7 | [@mel.new] external make: string => t = "TimeEvent"; 8 | [@mel.new] external makeWithOptions: (string, Js.t({..})) => t = "TimeEvent"; 9 | 10 | [@mel.get] external detail: t => int = "detail"; 11 | [@mel.get] external view: t => Dom.window = "view"; /* technically returns a `WindowProxy` */ 12 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__TouchEvent.re: -------------------------------------------------------------------------------- 1 | type touchList; /* TODO, Touch Events */ 2 | 3 | module Impl = (T: { 4 | type t; 5 | }) => { 6 | [@mel.get] external altKey: T.t => bool = "altKey"; 7 | [@mel.get] external changedTouches: T.t => touchList = "changedTouches"; 8 | [@mel.get] external ctrlKey: T.t => bool = "ctrlKey"; 9 | [@mel.get] external metaKey: T.t => bool = "metaKey"; 10 | [@mel.get] external shiftKey: T.t => bool = "shiftKey"; 11 | [@mel.get] external targetTouches: T.t => touchList = "targetTouches"; 12 | [@mel.get] external touches: T.t => touchList = "touches"; 13 | }; 14 | 15 | type t = Dom.touchEvent; 16 | 17 | include Webapi__Dom__Event.Impl({ 18 | type nonrec t = t; 19 | }); 20 | include Webapi__Dom__UiEvent.Impl({ 21 | type nonrec t = t; 22 | }); 23 | include Impl({ 24 | type nonrec t = t; 25 | }); 26 | 27 | [@mel.new] external make: string => t = "TouchEvent"; 28 | [@mel.new] external makeWithOptions: (string, Js.t({..})) => t = "TouchEvent"; 29 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__TrackEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.trackEvent; 2 | type track; /* TODO: VideoTrack or AudioTrack or TextTrack */ 3 | 4 | include Webapi__Dom__Event.Impl({ 5 | type nonrec t = t; 6 | }); 7 | 8 | [@mel.new] external make: string => t = "TrackEvent"; 9 | [@mel.new] external makeWithOptions: (string, Js.t({..})) => t = "TrackEvent"; 10 | 11 | [@mel.get] external track: t => track = "track"; 12 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__TransitionEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.transitionEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | 7 | [@mel.new] external make: string => t = "TransitionEvent"; 8 | [@mel.new] 9 | external makeWithOptions: (string, Js.t({..})) => t = "TransitionEvent"; 10 | 11 | [@mel.get] external propertyName: t => string = "propertyName"; 12 | [@mel.get] external elapsedTime: t => float = "elapsedTime"; 13 | [@mel.get] 14 | external pseudoElement: t => string /* enum-ish */ = "pseudoElement"; 15 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__TreeWalker.re: -------------------------------------------------------------------------------- 1 | type t = Dom.treeWalker; 2 | 3 | [@mel.get] external root: t => Dom.node = "root"; 4 | [@mel.get] 5 | external whatToShow: t => Webapi__Dom__Types.WhatToShow.t = "whatToShow"; 6 | [@mel.get] [@mel.return nullable] 7 | external filter: t => option(Dom.nodeFilter) = "filter"; 8 | [@mel.get] external currentNode: t => Dom.node = "currentNode"; 9 | [@mel.set] external setCurrentNode: (t, Dom.node) => unit = "setCurrentNode"; 10 | 11 | [@mel.send] [@mel.return nullable] 12 | external parentNode: ([@mel.this] t) => option(Dom.node) = "parentNode"; 13 | [@mel.send] [@mel.return nullable] 14 | external firstChild: ([@mel.this] t) => option(Dom.node) = "firstChild"; 15 | [@mel.send] [@mel.return nullable] 16 | external lastChild: ([@mel.this] t) => option(Dom.node) = "lastChild"; 17 | [@mel.send] [@mel.return nullable] 18 | external previousSibling: ([@mel.this] t) => option(Dom.node) = 19 | "previousSibling"; 20 | [@mel.send] [@mel.return nullable] 21 | external nextSibling: ([@mel.this] t) => option(Dom.node) = "nextSibling"; 22 | [@mel.send] [@mel.return nullable] 23 | external previousNode: ([@mel.this] t) => option(Dom.node) = "previousNode"; 24 | [@mel.send] [@mel.return nullable] 25 | external nextNode: ([@mel.this] t) => option(Dom.node) = "nextNode"; 26 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__Types.re: -------------------------------------------------------------------------------- 1 | /*** enums, bitmaks and constants ***/ 2 | type compareHow = 3 | | StartToStart 4 | | StartToEnd 5 | | EndToEnd 6 | | EndToStart; 7 | 8 | let encodeCompareHow = 9 | fun /* internal */ 10 | | StartToStart => 0 11 | | StartToEnd => 1 12 | | EndToEnd => 2 13 | | EndToStart => 3; 14 | 15 | type compareResult = 16 | | Before 17 | | Equal 18 | | After 19 | | Unknown; 20 | 21 | let decodeCompareResult = 22 | fun /* internal */ 23 | | (-1) => Before 24 | | 0 => Equal 25 | | 1 => After 26 | | _ => Unknown; 27 | 28 | type compatMode = 29 | | BackCompat 30 | | CSS1Compat 31 | | Unknown; 32 | 33 | let decodeCompatMode = 34 | fun /* internal */ 35 | | "BackCompat" => BackCompat 36 | | "CSS1Compat" => CSS1Compat 37 | | _ => Unknown; 38 | 39 | type contentEditable = 40 | | True 41 | | False 42 | | Inherit 43 | | Unknown; 44 | 45 | let encodeContentEditable = 46 | fun /* internal */ 47 | | True => "true" 48 | | False => "false" 49 | | Inherit => "inherit" 50 | | Unknown => ""; 51 | 52 | let decodeContentEditable = 53 | fun /* internal */ 54 | | "true" => True 55 | | "false" => False 56 | | "inherit" => Inherit 57 | | _ => Unknown; 58 | 59 | type deltaMode = 60 | | Pixel 61 | | Line 62 | | Page; 63 | 64 | let decodeDeltaMode = 65 | fun /* internal */ 66 | | 0 => Pixel 67 | | 1 => Line 68 | | 2 => Page 69 | | _ => raise(Invalid_argument("invalid deltaMode")); 70 | 71 | type designMode = 72 | | On 73 | | Off 74 | | Unknown; 75 | 76 | let encodeDesignMode = 77 | fun /* internal */ 78 | | On => "on" 79 | | Off => "off" 80 | | Unknown => ""; 81 | 82 | let decodeDesignMode = 83 | fun /* internal */ 84 | | "on" => On 85 | | "off" => Off 86 | | _ => Unknown; 87 | 88 | type dir = 89 | | Ltr 90 | | Rtl 91 | | Unknown; 92 | 93 | let encodeDir = 94 | fun /* internal */ 95 | | Ltr => "ltr" 96 | | Rtl => "rtl" 97 | | Unknown => ""; 98 | 99 | let decodeDir = 100 | fun /* internal */ 101 | | "ltr" => Ltr 102 | | "rtl" => Rtl 103 | | _ => Unknown; 104 | 105 | /** @since 0.17.1 */ 106 | module EventPhase = { 107 | type t = 108 | | None 109 | | CapturingPhase 110 | | AtTarget 111 | | BubblingPhase 112 | | Unknown; 113 | 114 | let decode = 115 | fun /* internal */ 116 | | 1 => CapturingPhase 117 | | 2 => AtTarget 118 | | 3 => BubblingPhase 119 | | 0 => None 120 | | _ => Unknown; 121 | }; 122 | 123 | [@deprecated "Use EventPhase.t"] 124 | type eventPhase = EventPhase.t = 125 | | None 126 | | CapturingPhase 127 | | AtTarget 128 | | BubblingPhase 129 | | Unknown; 130 | 131 | type filterAction = 132 | | Accept 133 | | Reject 134 | | Skip; 135 | 136 | let encodeFilterAction = 137 | fun 138 | | Accept => 1 139 | | Reject => 2 140 | | Skip => 3; 141 | 142 | type insertPosition = 143 | | BeforeBegin 144 | | AfterBegin 145 | | BeforeEnd 146 | | AfterEnd; 147 | 148 | let encodeInsertPosition = 149 | fun /* internal */ 150 | | BeforeBegin => "beforebegin" 151 | | AfterBegin => "afterbegin" 152 | | BeforeEnd => "beforeend" 153 | | AfterEnd => "afterend"; 154 | 155 | type modifierKey = 156 | | Alt 157 | | AltGraph 158 | | CapsLock 159 | | Control 160 | | Fn 161 | | FnLock 162 | | Hyper 163 | | Meta 164 | | NumLock 165 | | ScrollLock 166 | | Shift 167 | | Super 168 | | Symbol 169 | | SymbolLock; 170 | 171 | let encodeModifierKey = 172 | fun /* internal */ 173 | | Alt => "Alt" 174 | | AltGraph => "AltGraph" 175 | | CapsLock => "CapsLock" 176 | | Control => "Control" 177 | | Fn => "Fn" 178 | | FnLock => "FnLock" 179 | | Hyper => "Hyper" 180 | | Meta => "Meta" 181 | | NumLock => "NumLock" 182 | | ScrollLock => "ScrollLock" 183 | | Shift => "Shift" 184 | | Super => "Super" 185 | | Symbol => "Symbol" 186 | | SymbolLock => "SymbolLock"; 187 | 188 | type nodeType = 189 | | Element 190 | | Attribute /* deprecated */ 191 | | Text 192 | | CDATASection /* deprecated */ 193 | | EntityReference /* deprecated */ 194 | | Entity /* deprecated */ 195 | | ProcessingInstruction 196 | | Comment 197 | | Document 198 | | DocumentType 199 | | DocumentFragment 200 | | Notation /* deprecated */ 201 | | Unknown; 202 | 203 | let decodeNodeType = 204 | fun /* internal */ 205 | | 1 => Element 206 | | 2 => Attribute 207 | | 3 => Text 208 | | 4 => CDATASection 209 | | 5 => EntityReference 210 | | 6 => Entity 211 | | 7 => ProcessingInstruction 212 | | 8 => Comment 213 | | 9 => Document 214 | | 10 => DocumentType 215 | | 11 => DocumentFragment 216 | | 12 => Notation 217 | | _ => Unknown; 218 | 219 | type pointerType = 220 | | Mouse 221 | | Pen 222 | | Touch 223 | | Unknown; 224 | 225 | let decodePointerType = 226 | fun /* itnernal */ 227 | | "mouse" => Mouse 228 | | "pen" => Pen 229 | | "touch|" => Touch 230 | | _ => Unknown; 231 | 232 | type readyState = 233 | | Loading 234 | | Interactive 235 | | Complete 236 | | Unknown; 237 | 238 | let decodeReadyState = 239 | fun /* internal */ 240 | | "loading" => Loading 241 | | "interactive" => Interactive 242 | | "complete" => Complete 243 | | _ => Unknown; 244 | 245 | type shadowRootMode = 246 | | Open 247 | | Closed; 248 | 249 | let decodeShadowRootMode = 250 | fun /* internal */ 251 | | "open" => Open 252 | | "closed" => Closed 253 | | _ => raise(Invalid_argument("Unknown shadowRootMode")); 254 | 255 | type visibilityState = 256 | | Visible 257 | | Hidden 258 | | Prerender 259 | | Unloaded 260 | | Unknown; 261 | 262 | let decodeVisibilityState = 263 | fun /* internal */ 264 | | "visible" => Visible 265 | | "hidden" => Hidden 266 | | "prerender" => Prerender 267 | | "unloaded" => Unloaded 268 | | _ => Unknown; 269 | 270 | type image; 271 | 272 | module type WhatToShowT = { 273 | type t; 274 | 275 | let _All: t; 276 | let _Element: t; 277 | let _Attribute: t; 278 | let _Text: t; 279 | let _CDATASection: t; 280 | let _EntityReference: t; 281 | let _Entity: t; 282 | let _ProcessingInstruction: t; 283 | let _Comment: t; 284 | let _Document: t; 285 | let _DocumentType: t; 286 | let _DocumentFragment: t; 287 | let _Notation: t; 288 | 289 | let many: list(t) => t; 290 | }; 291 | 292 | module WhatToShow: WhatToShowT = { 293 | type t = int; 294 | 295 | let _All = (-1); 296 | let _Element = 1; 297 | let _Attribute = 2; 298 | let _Text = 4; 299 | let _CDATASection = 8; 300 | let _EntityReference = 16; 301 | let _Entity = 32; 302 | let _ProcessingInstruction = 64; 303 | let _Comment = 128; 304 | let _Document = 256; 305 | let _DocumentType = 512; 306 | let _DocumentFragment = 1024; 307 | let _Notation = 2048; 308 | 309 | let rec many = 310 | fun 311 | | [] => 0 312 | | [hd, ...rest] => hd lor many(rest); 313 | }; 314 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__UiEvent.re: -------------------------------------------------------------------------------- 1 | module Impl = (T: { 2 | type t; 3 | }) => { 4 | [@mel.get] external detail: T.t => int = "detail"; 5 | [@mel.get] external view: T.t => Dom.window = "view"; /* technically returns a `WindowProxy` */ 6 | }; 7 | 8 | type t = Dom.uiEvent; 9 | 10 | include Webapi__Dom__Event.Impl({ 11 | type nonrec t = t; 12 | }); 13 | include Impl({ 14 | type nonrec t = t; 15 | }); 16 | 17 | [@mel.new] external make: string => t = "UIEvent"; 18 | [@mel.new] external makeWithOptions: (string, Js.t({..})) => t = "UIEvent"; 19 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__ValidityState.re: -------------------------------------------------------------------------------- 1 | type t; 2 | 3 | [@mel.get] external valueMissing: t => bool = "valueMissing"; 4 | [@mel.get] external typeMismatch: t => bool = "typeMismatch"; 5 | [@mel.get] external patternMismatch: t => bool = "patternMismatch"; 6 | [@mel.get] external tooLong: t => bool = "tooLong"; 7 | [@mel.get] external tooShort: t => bool = "tooShort"; 8 | [@mel.get] external rangeUnderflow: t => bool = "rangeUnderflow"; 9 | [@mel.get] external rangeOverflow: t => bool = "rangeOverflow"; 10 | [@mel.get] external stepMismatch: t => bool = "stepMismatch"; 11 | [@mel.get] external badInput: t => bool = "badInput"; 12 | [@mel.get] external customError: t => bool = "customError"; 13 | [@mel.get] external valid: t => bool = "valid"; 14 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__WebGlContextEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.webGlContextEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | 7 | [@mel.new] external make: string => t = "WebGLContextEvent"; 8 | [@mel.new] 9 | external makeWithOptions: (string, Js.t({..})) => t = "WebGLContextEvent"; 10 | 11 | [@mel.get] external statusMessage: t => string = "statusMessage"; 12 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__WheelEvent.re: -------------------------------------------------------------------------------- 1 | type t = Dom.wheelEvent; 2 | 3 | include Webapi__Dom__Event.Impl({ 4 | type nonrec t = t; 5 | }); 6 | include Webapi__Dom__UiEvent.Impl({ 7 | type nonrec t = t; 8 | }); 9 | include Webapi__Dom__MouseEvent.Impl({ 10 | type nonrec t = t; 11 | }); 12 | 13 | [@mel.new] external make: string => t = "WheelEvent"; 14 | [@mel.new] external makeWithOptions: (string, Js.t({..})) => t = "WheelEvent"; 15 | 16 | [@mel.get] external deltaX: t => float = "deltaX"; 17 | [@mel.get] external deltaY: t => float = "deltaY"; 18 | [@mel.get] external deltaZ: t => float = "deltaZ"; 19 | [@mel.get] external deltaMode: t => int = "deltaMode"; 20 | let deltaMode: t => Webapi__Dom__Types.deltaMode = 21 | self => Webapi__Dom__Types.decodeDeltaMode(deltaMode(self)); 22 | -------------------------------------------------------------------------------- /src/Webapi/Dom/Webapi__Dom__Window.re: -------------------------------------------------------------------------------- 1 | type console; /* Console API, should maybe be defined in Js stdlib */ 2 | type crypto; /* Web Cryptography API */ 3 | type frameList; /* array-like, WindowProxy? */ 4 | type idleDeadline; /* Cooperative Scheduling of Background Tasks */ 5 | type locationbar; /* "bar object" */ 6 | type menubar; /* "bar object" */ 7 | type navigator; 8 | type personalbar; /* "bar object" */ 9 | type screen; 10 | type scrollbars; /* "bar object" */ 11 | type speechSynthesis; 12 | type statusbar; /* "bar object" */ 13 | type toolbar; /* "bar object" */ 14 | type mediaQueryList; /* CSSOM View module */ 15 | type transferable; 16 | 17 | type idleCallbackId; /* used by requestIdleCallback and cancelIdleCallback */ 18 | 19 | module Impl = (T: { 20 | type t; 21 | }) => { 22 | type t_window = T.t; 23 | 24 | /* A lot of this isn't really "dom", but rather global exports */ 25 | 26 | [@mel.get] external console: t_window => console = "console"; 27 | [@mel.get] external crypto: t_window => crypto = "crypto"; 28 | [@mel.get] external document: t_window => Dom.document = "document"; 29 | [@mel.get] [@mel.return nullable] 30 | external frameElement: t_window => option(Dom.element) = "frameElement"; /* experimental? */ 31 | [@mel.get] external frames: t_window => frameList = "frames"; 32 | [@mel.get] external fullScreen: t_window => bool = "fullScreen"; 33 | [@mel.get] external history: t_window => Dom.history = "history"; 34 | [@mel.get] external innerWidth: t_window => int = "innerWidth"; 35 | [@mel.get] external innerHeight: t_window => int = "innerHeight"; 36 | [@mel.get] external isSecureContext: t_window => bool = "isSecureContext"; 37 | [@mel.get] external length: t_window => int = "length"; 38 | [@mel.get] external location: t_window => Dom.location = "location"; 39 | [@mel.set] external setLocation: (t_window, string) => unit = "location"; 40 | [@mel.get] external locationbar: t_window => locationbar = "locationbar"; 41 | /* localStorage: accessed directly via Dom.Storage.localStorage */ 42 | [@mel.get] external menubar: t_window => menubar = "menubar"; 43 | [@mel.get] external name: t_window => string = "name"; 44 | [@mel.set] external setName: (t_window, string) => unit = "name"; 45 | [@mel.get] external navigator: t_window => navigator = "navigator"; 46 | [@mel.get] [@mel.return nullable] 47 | external opener: t_window => option(Dom.window) = "opener"; 48 | [@mel.get] external outerWidth: t_window => int = "outerWidth"; 49 | [@mel.get] external outerHeight: t_window => int = "outerHeight"; 50 | [@mel.get] external pageXOffset: t_window => float = "pageXOffset"; /* alias for scrollX */ 51 | [@mel.get] external pageYOffset: t_window => float = "pageYOffset"; /* alias for scrollY */ 52 | [@mel.get] external parent: t_window => Dom.window = "parent"; 53 | [@mel.get] 54 | external performance: t_window => Webapi__Performance.t = "performance"; 55 | [@mel.get] external personalbar: t_window => personalbar = "personalbar"; 56 | [@mel.get] external screen: t_window => screen = "screen"; 57 | [@mel.get] external screenX: t_window => int = "screenX"; 58 | [@mel.get] external screenY: t_window => int = "screenY"; 59 | [@mel.get] external scrollbars: t_window => scrollbars = "scrollbars"; 60 | [@mel.get] external scrollX: t_window => float = "scrollX"; 61 | [@mel.get] external scrollY: t_window => float = "scrollY"; 62 | [@mel.get] external self: t_window => Dom.window = "self"; /* alias for window, but apparently convenient because self (stand-alone) resolves to WorkerGlobalScope in a web worker. Probably poitnless here though */ 63 | /* sessionStorage: accessed directly via Dom.Storage.sessionStorage */ 64 | [@mel.get] 65 | external speechSynthesis: t_window => speechSynthesis = "speechSynthesis"; /* experimental */ 66 | [@mel.get] external status: t_window => string = "status"; 67 | [@mel.set] external setStatus: (t_window, string) => unit = "status"; 68 | [@mel.get] external statusbar: t_window => statusbar = "statusbar"; 69 | [@mel.get] external toolbar: t_window => toolbar = "toolbar"; 70 | [@mel.get] external top: t_window => Dom.window = "top"; 71 | [@mel.get] external window: t_window => t_window = "window"; /* This is pointless I think, it's just here because window is the implicit global scope, and it's needed to be able to get a reference to it */ 72 | 73 | [@mel.send] external alert: (string, [@mel.this] t_window) => unit = "alert"; 74 | [@mel.send] external blur: ([@mel.this] t_window) => unit = "blur"; 75 | 76 | /* experimental, Cooperative Scheduling of Background Tasks */ 77 | [@mel.send] 78 | external cancelIdleCallback: (idleCallbackId, [@mel.this] t_window) => unit = 79 | "cancelIdleCallback"; 80 | 81 | [@mel.send] external close: ([@mel.this] t_window) => unit = "close"; 82 | [@mel.send] 83 | external confirm: (string, [@mel.this] t_window) => bool = "confirm"; 84 | [@mel.send] external focus: ([@mel.this] t_window) => unit = "focus"; 85 | [@mel.send] 86 | external getComputedStyle: 87 | (Dom.element, [@mel.this] t_window) => Dom.cssStyleDeclaration = 88 | "getComputedStyle"; 89 | [@mel.send] 90 | external getComputedStyleWithPseudoElement: 91 | (Dom.element, string, [@mel.this] t_window) => Dom.cssStyleDeclaration = 92 | "getComputedStyle"; 93 | [@mel.send] 94 | external getSelection: ([@mel.this] t_window) => Dom.selection = 95 | "getSelection"; 96 | [@mel.send] 97 | external matchMedia: (string, [@mel.this] t_window) => mediaQueryList = 98 | "matchMedia"; /* experimental, CSSOM View module */ 99 | 100 | /* experimental, CSSOM View module */ 101 | [@mel.send] 102 | external moveBy: (int, int, [@mel.this] t_window) => unit = "moveBy"; 103 | 104 | /* experimental, CSSOM View module */ 105 | [@mel.send] 106 | external moveTo: (int, int, [@mel.this] t_window) => unit = "moveTo"; 107 | 108 | /* yes, features is a stringly typed list of key value pairs, sigh */ 109 | [@mel.send] [@mel.return nullable] 110 | external open_: 111 | (~url: string, ~name: string, ~features: string=?, [@mel.this] t_window) => 112 | option(Dom.window) = 113 | "open"; 114 | 115 | [@mel.send] 116 | external postMessage: ('a, string, [@mel.this] t_window) => unit = 117 | "postMessage"; /* experimental-ish?, Web Messaging */ 118 | [@mel.send] 119 | external postMessageWithTransfers: 120 | ('a, string, array(transferable), [@mel.this] t_window) => unit = 121 | "postMessage"; /* experimental-ish?, Web Messaging */ 122 | [@mel.send] external print: ([@mel.this] t_window) => unit = "print"; 123 | [@mel.send] 124 | external prompt: (string, [@mel.this] t_window) => string = "prompt"; 125 | [@mel.send] 126 | external promptWithDefault: (string, string, [@mel.this] t_window) => string = 127 | "prompt"; 128 | /* requestAnimationFrame: accessed directly via Webapi */ 129 | [@mel.send] 130 | external requestIdleCallback: 131 | (idleDeadline => unit, [@mel.this] t_window) => idleCallbackId = 132 | "requestIdleCallback"; /* experimental, Cooperative Scheduling of Background Tasks */ 133 | [@mel.send] 134 | external requestIdleCallbackWithOptions: 135 | (idleDeadline => unit, {. "timeout": int}, [@mel.this] t_window) => 136 | idleCallbackId = 137 | "requestIdleCallback"; /* experimental, Cooperative Scheduling of Background Tasks */ 138 | [@mel.send] 139 | external resizeBy: (int, int, [@mel.this] t_window) => unit = "resizeBy"; /* experimental, CSSOM View module */ 140 | [@mel.send] 141 | external resizeTo: (int, int, [@mel.this] t_window) => unit = "resizeTo"; /* experimental, CSSOM View module */ 142 | [@mel.send] 143 | external scroll: (float, float, [@mel.this] t_window) => unit = "scroll"; /* experimental, CSSOM View module */ 144 | [@mel.send] 145 | external scrollBy: (float, float, [@mel.this] t_window) => unit = "scrollBy"; /* experimental, CSSOM View module */ 146 | [@mel.send] 147 | external scrollTo: (float, float, [@mel.this] t_window) => unit = "scrollTo"; /* experimental, CSSOM View module */ 148 | [@mel.send] external stop: ([@mel.this] t_window) => unit = "stop"; 149 | 150 | [@mel.send] 151 | external addPopStateEventListener: 152 | ( 153 | [@mel.as "popstate"] _, 154 | Dom.popStateEvent => unit, 155 | [@mel.this] t_window 156 | ) => 157 | unit = 158 | "addEventListener"; 159 | [@mel.send] 160 | external removePopStateEventListener: 161 | ( 162 | [@mel.as "popstate"] _, 163 | Dom.popStateEvent => unit, 164 | [@mel.this] t_window 165 | ) => 166 | unit = 167 | "removeEventListener"; 168 | 169 | [@mel.set] external setOnLoad: (t_window, unit => unit) => unit = "onload"; /* use addEventListener instead? */ 170 | }; 171 | 172 | type t = Dom.window; 173 | 174 | /* include WindowOrWorkerGlobalScope? not really "dom" though */ 175 | include Webapi__Dom__EventTarget.Impl({ 176 | type nonrec t = t; 177 | }); 178 | include Webapi__Dom__GlobalEventHandlers.Impl({ 179 | type nonrec t = t; 180 | }); 181 | include Impl({ 182 | type nonrec t = t; 183 | }); 184 | -------------------------------------------------------------------------------- /src/Webapi/ResizeObserver/Webapi__ResizeObserver__ResizeObserverEntry.re: -------------------------------------------------------------------------------- 1 | type t; 2 | 3 | [@mel.get] external contentRect: t => Dom.domRect = "contentRect"; 4 | [@mel.get] external target: t => Dom.element = "target"; 5 | -------------------------------------------------------------------------------- /src/Webapi/Webapi__Base64.re: -------------------------------------------------------------------------------- 1 | external btoa: string => string = "btoa"; 2 | external atob: string => string = "atob"; 3 | -------------------------------------------------------------------------------- /src/Webapi/Webapi__Blob.re: -------------------------------------------------------------------------------- 1 | module Impl = (T: { 2 | type t; 3 | }) => { 4 | [@mel.send] 5 | external arrayBuffer: T.t => Js.Promise.t(Js.Typed_array.ArrayBuffer.t) = 6 | "arrayBuffer"; 7 | 8 | [@mel.get] external size: T.t => float = "size"; 9 | 10 | [@mel.send] 11 | external slice: 12 | (~start: int=?, ~end_: int=?, ~contentType: string=?, [@mel.this] T.t) => 13 | T.t = 14 | "slice"; 15 | 16 | /** @since 0.19.0 */ 17 | [@mel.send] 18 | external stream: T.t => Webapi__ReadableStream.t = "stream"; 19 | 20 | [@mel.send] external text: T.t => Js.Promise.t(string) = "text"; 21 | 22 | [@mel.get] external type_: T.t => string = "type"; 23 | 24 | /** Deprecated, use [type_] instead. */ 25 | [@deprecated "Use [type_] instead"] [@mel.get] 26 | external _type: T.t => string = "type"; 27 | }; 28 | 29 | type t = Fetch.blob; 30 | 31 | include Impl({ 32 | type nonrec t = t; 33 | }) /* [@mel.new] external make: ... = "Blob"*/; 34 | -------------------------------------------------------------------------------- /src/Webapi/Webapi__Canvas.re: -------------------------------------------------------------------------------- 1 | module Canvas2d = Webapi__Canvas__Canvas2d; 2 | module WebGl = Webapi__Canvas__WebGl; 3 | 4 | module CanvasElement = { 5 | [@mel.send] 6 | external getContext2d: (Dom.element, [@mel.as "2d"] _) => Canvas2d.t = 7 | "getContext"; 8 | [@mel.send] 9 | external getContextWebGl: (Dom.element, [@mel.as "webgl"] _) => WebGl.glT = 10 | "getContext"; 11 | [@mel.get] external height: Dom.element => int = "height"; 12 | [@mel.set] external setHeight: (Dom.element, int) => unit = "height"; 13 | [@mel.get] external width: Dom.element => int = "width"; 14 | [@mel.set] external setWidth: (Dom.element, int) => unit = "width"; 15 | }; 16 | -------------------------------------------------------------------------------- /src/Webapi/Webapi__File.re: -------------------------------------------------------------------------------- 1 | type t = Fetch.file; 2 | 3 | [@text "{1 Blob superclass}"]; 4 | 5 | include Webapi__Blob.Impl({ 6 | type nonrec t = t; 7 | }); 8 | 9 | [@text "{1 File class}"]; 10 | 11 | /** @since 0.18.0 */ 12 | [@mel.get] 13 | external lastModified: t => float = "lastModified"; 14 | 15 | // [@mel.new] external make: ... = "File"; 16 | 17 | [@mel.get] external name: t => string = "name"; 18 | 19 | [@mel.get] external preview: t => string = "preview"; 20 | -------------------------------------------------------------------------------- /src/Webapi/Webapi__Performance.re: -------------------------------------------------------------------------------- 1 | type t; 2 | 3 | [@mel.send] external now: t => float = "now"; 4 | -------------------------------------------------------------------------------- /src/Webapi/Webapi__ReadableStream.re: -------------------------------------------------------------------------------- 1 | module type Reader = { 2 | type t; 3 | type closed; 4 | 5 | [@mel.send] external closed: t => Js.Promise.t(closed) = "closed"; 6 | [@mel.send] external cancel: t => Js.Promise.t(unit) = "cancel"; 7 | [@mel.send] 8 | external cancelWith: (string, [@mel.this] t) => Js.Promise.t(string) = 9 | "cancel"; 10 | [@mel.send] external releaseLock: t => unit = "releaseLock"; 11 | }; 12 | 13 | module rec DefaultReader: { 14 | include Reader; 15 | [@mel.send] 16 | external read: t => Js.Promise.t(Fetch__Iterator.Next.t(string)) = "read"; 17 | } = DefaultReader; 18 | 19 | module rec BYOBReader: { 20 | include Reader; 21 | // [@mel.send] external read: (view, [@mel.this] t) => Js.Promise.t(Fetch__Iterator.Next.t(string)) = "read"; 22 | } = BYOBReader; 23 | 24 | type t = Fetch.readableStream; 25 | 26 | [@mel.get] external locked: t => bool = "locked"; 27 | [@mel.send] external cancel: t => Js.Promise.t(unit) = "cancel"; 28 | [@mel.send] 29 | external cancelWith: (string, [@mel.this] t) => Js.Promise.t(string) = 30 | "cancel"; 31 | [@mel.send] external getReader: t => DefaultReader.t = "getReader"; 32 | [@mel.send] 33 | external getReaderBYOB: 34 | (t, [@mel.as {json|{"mode": "byob"}|json}] _) => BYOBReader.t = 35 | "getReader"; 36 | [@mel.send] external tee: t => (t, t) = "tee"; 37 | -------------------------------------------------------------------------------- /src/Webapi/Webapi__ResizeObserver.re: -------------------------------------------------------------------------------- 1 | module ResizeObserverEntry = Webapi__ResizeObserver__ResizeObserverEntry; 2 | 3 | type t; 4 | 5 | [@mel.new] 6 | external make: (array(ResizeObserverEntry.t) => unit) => t = "ResizeObserver"; 7 | [@mel.new] 8 | external makeWithObserver: ((array(ResizeObserverEntry.t), t) => unit) => t = 9 | "ResizeObserver"; 10 | 11 | [@mel.send] external disconnect: t => unit = "disconnect"; 12 | [@mel.send] external observe: (t, Dom.element) => unit = "observe"; 13 | [@mel.send] external unobserve: (t, Dom.element) => unit = "unobserve"; 14 | -------------------------------------------------------------------------------- /src/Webapi/Webapi__Url.re: -------------------------------------------------------------------------------- 1 | module URLSearchParams = { 2 | type t; 3 | 4 | [@mel.new] external make: string => t = "URLSearchParams"; 5 | [@mel.new] 6 | external makeWithDict: Js.Dict.t(string) => t = "URLSearchParams"; 7 | [@mel.new] 8 | external makeWithArray: array((string, string)) => t = "URLSearchParams"; 9 | [@mel.send] 10 | external append: (string, string, [@mel.this] t) => unit = "append"; 11 | [@mel.send] external delete: (string, [@mel.this] t) => unit = "delete"; 12 | [@mel.send] 13 | external entries: ([@mel.this] t) => Js.Array.array_like((string, string)) = 14 | "entries"; 15 | [@mel.send] 16 | external forEach: 17 | ([@mel.uncurry] ((string, string) => unit), [@mel.this] t) => unit = 18 | "forEach"; 19 | [@mel.return nullable] [@mel.send] 20 | external get: (string, [@mel.this] t) => option(string) = "get"; 21 | [@mel.send] 22 | external getAll: (string, [@mel.this] t) => array(string) = "getAll"; 23 | [@mel.send] external has: (string, [@mel.this] t) => bool = "has"; 24 | [@mel.send] 25 | external keys: ([@mel.this] t) => Js.Array.array_like(string) = "keys"; 26 | [@mel.send] external set: (string, string, [@mel.this] t) => unit = "set"; 27 | [@mel.send] external sort: ([@mel.this] t) => unit = "sort"; 28 | [@mel.send] external toString: ([@mel.this] t) => string = "toString"; 29 | [@mel.send] 30 | external values: ([@mel.this] t) => Js.Array.array_like(string) = "values"; 31 | }; 32 | 33 | type t; 34 | 35 | [@mel.new] external make: string => t = "URL"; 36 | 37 | /** Deprecated, use [makeWith] instead. */ 38 | [@deprecated "Use [makeWith] instead."] [@mel.new] 39 | external makeWithBase: (string, string) => t = "URL"; 40 | 41 | /** @since 0.19.0 */ 42 | [@mel.new] 43 | external makeWith: (string, ~base: string) => t = "URL"; 44 | 45 | [@mel.get] external hash: t => string = "hash"; 46 | [@mel.set] external setHash: (t, string) => unit = "hash"; 47 | [@mel.get] external host: t => string = "host"; 48 | [@mel.set] external setHost: (t, string) => unit = "host"; 49 | [@mel.get] external hostname: t => string = "hostname"; 50 | [@mel.set] external setHostname: (t, string) => unit = "hostname"; 51 | [@mel.get] external href: t => string = "href"; 52 | [@mel.set] external setHref: (t, string) => unit = "href"; 53 | [@mel.get] external origin: t => string = "origin"; 54 | [@mel.get] external password: t => string = "password"; 55 | [@mel.set] external setPassword: (t, string) => unit = "password"; 56 | [@mel.get] external pathname: t => string = "pathname"; 57 | [@mel.set] external setPathname: (t, string) => unit = "pathname"; 58 | [@mel.get] external port: t => string = "port"; 59 | [@mel.set] external setPort: (t, string) => unit = "port"; 60 | [@mel.get] external protocol: t => string = "protocol"; 61 | [@mel.set] external setProtocol: (t, string) => unit = "protocol"; 62 | [@mel.get] external search: t => string = "search"; 63 | [@mel.set] external setSearch: (t, string) => unit = "search"; 64 | [@mel.get] external searchParams: t => URLSearchParams.t = "searchParams"; 65 | [@mel.get] external username: t => string = "username"; 66 | [@mel.set] external setUsername: (t, string) => unit = "username"; 67 | [@mel.get] external toJson: t => string = "toJson"; 68 | 69 | [@mel.scope "URL"] 70 | external createObjectURL: Webapi__File.t => string = "createObjectURL"; 71 | [@mel.scope "URL"] 72 | external revokeObjectURL: string => unit = "revokeObjectURL"; 73 | -------------------------------------------------------------------------------- /src/dune: -------------------------------------------------------------------------------- 1 | (include_subdirs unqualified) 2 | 3 | (library 4 | (name webapi) 5 | (public_name melange-webapi) 6 | (wrapped false) 7 | (libraries melange-fetch (re_export melange.dom)) 8 | (modes melange) 9 | (preprocess 10 | (pps melange.ppx))) 11 | -------------------------------------------------------------------------------- /tests/Webapi/Canvas/Webapi__Canvas__Canvas2d__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Canvas; 2 | open Webapi.Canvas.Canvas2d; 3 | open Webapi.Dom; 4 | 5 | let canvasEl = Document.createElement("canvas", document); 6 | let ctx = CanvasElement.getContext2d(canvasEl); 7 | 8 | ctx |> save; 9 | ctx |> restore; 10 | 11 | ctx |> scale(~x=1., ~y=2.); 12 | ctx |> rotate(2.); 13 | ctx |> translate(~x=2., ~y=3.); 14 | ctx |> transform(~m11=1., ~m12=2., ~m21=1., ~m22=1., ~dx=1., ~dy=1.); 15 | 16 | globalAlpha(ctx, 0.9); 17 | globalCompositeOperation(ctx, Composite.sourceOver); 18 | 19 | lineWidth(ctx, 1.); 20 | lineCap(ctx, LineCap.butt); 21 | lineJoin(ctx, LineJoin.round); 22 | miterLimit(ctx, 10.); 23 | 24 | setStrokeStyle(ctx, String, "red"); 25 | setFillStyle(ctx, String, "red"); 26 | 27 | switch (fillStyle(ctx)) { 28 | | (Gradient, g) => g |> addColorStop(0.0, "red") 29 | | (String, s) => Js.log(s) 30 | | (Pattern, _) => () 31 | }; 32 | 33 | switch (strokeStyle(ctx)) { 34 | | (Gradient, g) => g |> addColorStop(1.2, "blue") 35 | | (String, s) => Js.log(s) 36 | | (Pattern, _) => () 37 | }; 38 | 39 | shadowOffsetX(ctx, 1.); 40 | shadowOffsetY(ctx, 1.); 41 | shadowBlur(ctx, 1.); 42 | shadowColor(ctx, "red"); 43 | 44 | ctx |> beginPath; 45 | ctx |> closePath; 46 | ctx |> fill; 47 | ctx |> stroke; 48 | ctx |> clip; 49 | ctx |> moveTo(~x=1., ~y=1.); 50 | ctx |> lineTo(~x=1., ~y=2.); 51 | ctx |> quadraticCurveTo(~cp1x=1., ~cp1y=1., ~x=1., ~y=1.); 52 | ctx |> bezierCurveTo(~cp1x=1., ~cp1y=1., ~cp2x=2., ~cp2y=2., ~x=4., ~y=4.); 53 | ctx |> arcTo(~x1=1., ~y1=1., ~x2=2., ~y2=2., ~r=4.); 54 | ctx |> arc(~x=1., ~y=1., ~r=4., ~startAngle=1., ~endAngle=3., ~anticw=true); 55 | ctx |> rect(~x=0., ~y=0., ~w=10., ~h=10.); 56 | let _ = ctx |> isPointInPath(~x=0., ~y=0.); 57 | 58 | let linearGradient = ctx |> createLinearGradient(~x0=0.0, ~y0=0.0, ~x1=0.0, ~y1=0.0); 59 | setStrokeStyle(ctx, Gradient, linearGradient); 60 | let _ = ctx |> createRadialGradient(~x0=0.0, ~y0=0.0, ~x1=0.0, ~y1=0.0, ~r0=0.0, ~r1=0.0); 61 | linearGradient |> addColorStop(0.0, "red"); 62 | let _ = 63 | List.map( 64 | createPattern(ctx, Document.createElement("img", document)), 65 | [`noRepeat, `repeat, `repeatX, `repeatY] 66 | ); 67 | 68 | let measureText = ctx |> measureText("foo"); 69 | let width = width(measureText); 70 | ctx |> fillText("foo!", ~x=0.0, ~y=0.0, ~maxWidth=width); 71 | ctx |> strokeText("foo!", ~x=0.0, ~y=0.0, ~maxWidth=width); 72 | let imageData = createImageDataCoords(ctx, ~width=0.0, ~height=0.0); 73 | let _: Image.t = createImageDataFromImage(ctx, imageData); 74 | let _: float = Image.width(imageData); 75 | let _: float = Image.height(imageData); 76 | 77 | let _: Image.t = getImageData(ctx, ~sx=0.0, ~sy=0.0, ~sw=0.0, ~sh=0.0); 78 | let _: unit = putImageData(ctx, ~imageData, ~dx=0.0, ~dy=0.0); 79 | let _: unit = putImageDataWithDirtyRect(ctx, ~imageData, ~dx=0.0, ~dy=0.0, ~dirtyX=0.0, ~dirtyY=0.0, ~dirtyWidth=0.0, ~dirtyHeight=0.0); 80 | 81 | font(ctx, "10px Courier"); 82 | textAlign(ctx, "left"); 83 | textBaseline(ctx, "top"); 84 | ctx |> fillText("hi", ~x=1., ~y=0.); 85 | ctx |> strokeText("hi", ~x=1., ~y=0.); 86 | 87 | ctx |> fillRect(~x=1., ~y=0., ~w=10., ~h=10.); 88 | ctx |> strokeRect(~x=1., ~y=0., ~w=10., ~h=10.); 89 | ctx |> clearRect(~x=1., ~y=0., ~w=10., ~h=10.); 90 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__AnimationEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open AnimationEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* AnimationEvent */ 23 | let _ = animationName(event); 24 | let _ = elapsedTime(event); 25 | let _ = pseudoElement(event); 26 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__BeforeUnloadEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open BeforeUnloadEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* BeforeUnloadEvent */ 23 | let _ = returnValue(event); 24 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__ClipboardEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open ClipboardEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* ClipboardEvent */ 23 | let _ = clipboardData(event); 24 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__CloseEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open CloseEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* CloseEvent */ 23 | let _ = wasClean(event); 24 | let _ = code(event); 25 | let _ = reason(event); 26 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__CompositionEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open CompositionEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* UIEvent */ 23 | let _ = detail(event); 24 | let _ = view(event); 25 | 26 | /* CompositionEvent */ 27 | let _ = data(event); 28 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__CustomEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open CustomEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__Document__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open Document; 3 | 4 | let el = document |> createElement("strong"); 5 | 6 | let _ = characterSet(document); 7 | let _ = compatMode(document); 8 | let _ = doctype(document); 9 | let _ = documentElement(document); 10 | let _ = documentURI(document); 11 | let _ = hidden(document); 12 | let _ = implementation(document); 13 | let _ = lastStyleSheetSet(document); 14 | let _ = pointerLockElement(document); 15 | let _ = preferredStyleSheetSet(document); 16 | let _ = scrollingElement(document); 17 | let _ = selectedStyleSheetSet(document); 18 | let _ = setSelectedStyleSheetSet(document, "muh-stylesheet"); 19 | let _ = styleSheets(document); 20 | let _ = styleSheetSets(document); 21 | let _ = visibilityState(document); 22 | 23 | let _ = adoptNode(el, document); 24 | let _ = createAttribute("data-foo", document); 25 | let _ = createAttributeNS("http://...", "foo", document); 26 | let _ = createComment("witty comment", document); 27 | let _ = createDocumentFragment(document); 28 | let _ = createElement("div", document); 29 | let _ = createElementWithOptions("div", [%mel.raw "{}"], document); /* I've no idea what this options object is supposed to be, even the spec doesn't seem to bother explaining it */ 30 | let _ = createElementNS("http://...", "foo", document); 31 | let _ = 32 | createElementNSWithOptions("http://...", "div", [%mel.raw "{}"], document); /* I've no idea what this options object is supposed to be, even the spec doesn't seem to bother explaining it */ 33 | let _ = createEvent("MyCustomEvent", document); 34 | let _ = createNodeIterator(el, document); 35 | let _ = createNodeIteratorWithWhatToShow(el, WhatToShow._All, document); 36 | let _ = 37 | createNodeIteratorWithWhatToShowFilter( 38 | el, 39 | WhatToShow.(many([_Element, _Attribute])), 40 | NodeFilter.make(_ => 0), 41 | document, 42 | ); 43 | let _ = createRange(document); 44 | let _ = createTextNode("Very reasonable!", document); 45 | let _ = createTreeWalker(el, document); 46 | let _ = createTreeWalkerWithWhatToShow(el, WhatToShow._All, document); 47 | let _ = 48 | createTreeWalkerWithWhatToShowFilter( 49 | el, 50 | WhatToShow.(many([_Element, _Attribute])), 51 | NodeFilter.make(_ => 0), 52 | document, 53 | ); 54 | let _ = elementFromPoint(0, 0, document); 55 | let _ = elementsFromPoint(0, 0, document); 56 | let _ = enableStyleSheetsForSet("my-stylesheet-set", document); 57 | let _ = exitPointerLock(document); 58 | let _ = getAnimations(document); 59 | let _ = getElementsByClassName("lstlisting", document); 60 | let _ = getElementsByTagName("code", document); 61 | let _ = getElementsByTagNameNS("http://...", "foo", document); 62 | let _ = importNode(el, document); 63 | let _ = importNodeDeep(el, document); 64 | /* TODO: These get dead code eliminated 65 | let _ = registerElement(document, "my-component"); 66 | let _ = registerElementWithOptions(document, "my-component", [%mel.raw "{}"]); 67 | */ 68 | let _ = getElementById("root", document); 69 | let _ = querySelector(".lstlisting", document); 70 | let _ = querySelectorAll(".lstlisting", document); 71 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__DomStringMap__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open Webapi.Dom.DomStringMap; 3 | 4 | let dataset = 5 | document 6 | |> Document.createElement("div") 7 | |> Element.unsafeAsHtmlElement 8 | |> HtmlElement.dataset; 9 | 10 | let () = set("fooKey", "barValue", dataset); 11 | let _ = get("fooKey", dataset); 12 | let () = unsafeDeleteKey("fooKey", dataset); 13 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__DomTokenList__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open DomTokenList; 3 | 4 | let tlist = 5 | document |> Document.createElement("div") 6 | |> Element.classList; 7 | 8 | let _ = length(tlist); 9 | let _ = item(3, tlist); 10 | 11 | add("my-class", tlist); 12 | addMany([|"my-class", "my-other-class"|], tlist); 13 | let _ = contains("my-class", tlist); 14 | forEach((item, _) => print_endline(item), tlist); 15 | remove("my-class", tlist); 16 | removeMany([|"my-class", "my-other-class"|], tlist); 17 | replace("my-class", "my-other-class", tlist); 18 | let _ = supports("my-class", tlist); 19 | let _ = toggle("my-class", tlist); 20 | let _ = toggleForced("my-class", tlist); 21 | let _ = toString(tlist); 22 | let _ = value(tlist); 23 | let _ = setValue(tlist, "foo"); 24 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__DragEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open DragEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* UIEvent */ 23 | let _ = detail(event); 24 | let _ = view(event); 25 | 26 | /* MouseEvent */ 27 | let _ = altKey(event); 28 | let _ = button(event); 29 | let _ = buttons(event); 30 | let _ = clientX(event); 31 | let _ = clientY(event); 32 | let _ = ctrlKey(event); 33 | let _ = metaKey(event); 34 | let _ = movementX(event); 35 | let _ = movementY(event); 36 | let _ = offsetX(event); 37 | let _ = offsetY(event); 38 | let _ = pageX(event); 39 | let _ = pageY(event); 40 | let _ = region(event); 41 | let _ = relatedTarget(event); 42 | let _ = screenX(event); 43 | let _ = screenY(event); 44 | let _ = shiftKey(event); 45 | let _ = x(event); 46 | let _ = y(event); 47 | let _ = getModifierState(Alt, event); 48 | 49 | /* DragEvent */ 50 | let _ = dataTransfer(event); 51 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__Element__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open Element; 3 | 4 | let el = document |> Document.createElement("strong"); 5 | let el2 = document |> Document.createElement("small"); 6 | let event = PointerEvent.make("my-event"); 7 | 8 | let _ = assignedSlot(el); 9 | let _ = attributes(el); 10 | let _ = classList(el); 11 | let _ = className(el); 12 | let _ = setClassName(el, "my-class-name"); 13 | let _ = clientHeight(el); 14 | let _ = clientLeft(el); 15 | let _ = clientTop(el); 16 | let _ = clientWidth(el); 17 | let _ = id(el); 18 | let _ = setId(el, "my-id"); 19 | let _ = innerHTML(el); 20 | let _ = setInnerHTML(el, "stuff"); 21 | let _ = localName(el); 22 | let _ = namespaceURI(el); 23 | let _ = nextElementSibling(el); 24 | let _ = outerHTML(el); 25 | let _ = setOuterHTML(el, "stuff"); 26 | let _ = prefix(el); 27 | let _ = previousElementSibling(el); 28 | let _ = scrollHeight(el); 29 | let _ = scrollLeft(el); 30 | let _ = setScrollLeft(el, 0.0); 31 | let _ = scrollTop(el); 32 | let _ = setScrollTop(el, 0.0); 33 | let _ = scrollWidth(el); 34 | let _ = shadowRoot(el); 35 | let _ = slot(el); 36 | let _ = setSlot(el, "stuff"); 37 | let _ = tagName(el); 38 | 39 | let _ = attachShadow({"mode": "open"}, el); 40 | let _ = attachShadowOpen(el); 41 | let _ = attachShadowClosed(el); 42 | let _ = animate({"transform": "translateT(0px)"}, {"duration": 1000}, el); 43 | let _ = closest("input", el); 44 | let _ = createShadowRoot(el); 45 | let _ = getAttribute("href", el); 46 | let _ = getAttributeNS("http://...", "foo", el); 47 | let _ = getBoundingClientRect(el); 48 | let _ = getClientRects(el); 49 | let _ = getElementsByClassName("some-class-name", el); 50 | let _ = getElementsByTagName("pre", el); 51 | let _ = getElementsByTagNameNS("http://...", "td", el); 52 | let _ = hasAttribute("data-my-value", el); 53 | let _ = hasAttributeNS("http://...", "foo", el); 54 | let _ = hasAttributes(el); 55 | let _ = insertAdjacentElement(BeforeBegin, el2, el); 56 | let _ = insertAdjacentHTML(AfterBegin, "text", el); 57 | let _ = insertAdjacentText(AfterEnd, "text", el); 58 | let _ = matches("input", el); 59 | let _ = querySelector("input", el); 60 | let _ = querySelectorAll("input", el); 61 | let _ = releasePointerCapture(PointerEvent.pointerId(event), el); 62 | let _ = remove(el); 63 | let _ = removeAttribute("href", el); 64 | let _ = removeAttributeNS("http://...", "foo", el); 65 | let _ = requestFullscreen(el); 66 | let _ = requestPointerLock(el); 67 | let _ = scrollIntoView(el); 68 | /*let _ = scrollIntoViewNoAlignToTop(el);*/ 69 | let _ = scrollIntoViewNoAlignToTop(el); 70 | let _ = scrollIntoViewWithOptions({"block": "end", "behavior": "smooth"}, el); 71 | let _ = setAttribute("href", "http://...", el); 72 | let _ = setAttributeNS("http://...", "foo", "bar", el); 73 | let _ = setPointerCapture(PointerEvent.pointerId(event), el); 74 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__ErrorEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open ErrorEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* ErrorEvent */ 23 | let _ = message(event); 24 | let _ = filename(event); 25 | let _ = lineno(event); 26 | let _ = colno(event); 27 | let _ = error(event); 28 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__EventTarget__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open EventTarget; 3 | 4 | let target = 5 | document |> Document.createElement("strong") 6 | |> Element.asEventTarget; 7 | let event = Event.make("my-event"); 8 | let handleClick = (_) => print_endline("asd"); 9 | 10 | addEventListener("click", handleClick, target); 11 | addEventListenerWithOptions("click",handleClick, {"passive": true, "once": true, "capture": false}, target); 12 | addEventListenerUseCapture("click", handleClick, target); 13 | removeEventListener("click", handleClick, target); 14 | removeEventListenerWithOptions("click", handleClick, {"passive": true, "capture": false}, target); 15 | removeEventListenerUseCapture("click", handleClick, target); 16 | let _ = dispatchEvent(event, target); 17 | 18 | /* https://github.com/reasonml-community/bs-webapi-incubator/issues/103 */ 19 | let customEvent = CustomEvent.makeWithOptions("custom-event", {"detail": {"test": "test"}}); 20 | let _ : bool = dispatchEvent(customEvent, target); 21 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__Event__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open Event; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__FocusEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open FocusEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* UIEvent */ 23 | let _ = detail(event); 24 | let _ = view(event); 25 | 26 | /* FocusEvent */ 27 | let _ = relatedTarget(event); 28 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__GlobalEventHandlers__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | 3 | let handleSelection = (_) => print_endline("change"); 4 | 5 | let elm = document |> Document.createElement("strong"); 6 | 7 | Element.addSelectionChangeEventListenerWithOptions(handleSelection, {"passive": true, "once": true, "capture": false}, elm); 8 | Element.addSelectionChangeEventListenerUseCapture(handleSelection, elm); 9 | Element.removeSelectionChangeEventListener(handleSelection, elm); 10 | Element.removeSelectionChangeEventListenerWithOptions(handleSelection, {"passive": true, "capture": false}, elm); 11 | Element.removeSelectionChangeEventListenerUseCapture(handleSelection, elm); 12 | 13 | let htmlElm = document |> Document.createElement("strong") |> HtmlElement.ofElement |> TestHelpers.unsafelyUnwrapOption; 14 | 15 | HtmlElement.addSelectionChangeEventListenerWithOptions(handleSelection, {"passive": true, "once": true, "capture": false}, htmlElm); 16 | HtmlElement.addSelectionChangeEventListenerUseCapture(handleSelection, htmlElm); 17 | HtmlElement.removeSelectionChangeEventListener(handleSelection, htmlElm); 18 | HtmlElement.removeSelectionChangeEventListenerWithOptions(handleSelection, {"passive": true, "capture": false}, htmlElm); 19 | HtmlElement.removeSelectionChangeEventListenerUseCapture(handleSelection, htmlElm); 20 | 21 | let htmlDoc = document |> Document.asHtmlDocument |> TestHelpers.unsafelyUnwrapOption; 22 | 23 | HtmlDocument.addSelectionChangeEventListenerWithOptions(handleSelection, {"passive": true, "once": true, "capture": false}, htmlDoc); 24 | HtmlDocument.addSelectionChangeEventListenerUseCapture(handleSelection, htmlDoc); 25 | HtmlDocument.removeSelectionChangeEventListener(handleSelection, htmlDoc); 26 | HtmlDocument.removeSelectionChangeEventListenerWithOptions(handleSelection, {"passive": true, "capture": false}, htmlDoc); 27 | HtmlDocument.removeSelectionChangeEventListenerUseCapture(handleSelection, htmlDoc); 28 | 29 | Window.addSelectionChangeEventListenerWithOptions(handleSelection, {"passive": true, "once": true, "capture": false}, window); 30 | Window.addSelectionChangeEventListenerUseCapture(handleSelection, window); 31 | Window.removeSelectionChangeEventListener(handleSelection, window); 32 | Window.removeSelectionChangeEventListenerWithOptions(handleSelection, {"passive": true, "capture": false}, window); 33 | Window.removeSelectionChangeEventListenerUseCapture(handleSelection, window); 34 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__History__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open History; 3 | 4 | let _ = length(history); 5 | let _ = scrollRestoration(history); 6 | let _ = setScrollRestoration(history, true); 7 | let _ = state(history); 8 | 9 | back(history); 10 | forward(history); 11 | go((-2), history); 12 | pushState(state(history), "My title", "http://...", history); 13 | replaceState(state(history), "My title", "http://...", history); 14 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__HtmlDocument__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open! HtmlDocument; 3 | 4 | let el = document |> Document.createElement("strong"); 5 | let htmlDocument = 6 | document |> Document.asHtmlDocument 7 | |> TestHelpers.unsafelyUnwrapOption; 8 | 9 | let _ = activeElement(htmlDocument); 10 | let _ = body(htmlDocument); 11 | let _ = setBody(htmlDocument, el); 12 | let _ = cookie(htmlDocument); 13 | let _ = setCookie(htmlDocument, "foo=bar;reason=ml"); 14 | let _ = defaultView(htmlDocument); 15 | let _ = designMode(htmlDocument); 16 | let _ = setDesignMode(htmlDocument, On); 17 | let _ = dir(htmlDocument); 18 | let _ = setDir(htmlDocument, Ltr); 19 | let _ = domain(htmlDocument); 20 | let _ = setDomain(htmlDocument, "reason.ml"); 21 | let _ = embeds(htmlDocument); 22 | let _ = forms(htmlDocument); 23 | let _ = head(htmlDocument); 24 | let _ = images(htmlDocument); 25 | let _ = lastModified(htmlDocument); 26 | let _ = links(htmlDocument); 27 | let _ = location(htmlDocument); 28 | let _ = setLocation(htmlDocument, "http://reason.ml"); 29 | let _ = plugins(htmlDocument); 30 | let _ = readyState(htmlDocument); 31 | let _ = referrer(htmlDocument); 32 | let _ = scripts(htmlDocument); 33 | let _ = title(htmlDocument); 34 | let _ = setTitle(htmlDocument, "Reason: Rapid Expressive Systems Programming."); 35 | let _ = url(htmlDocument); 36 | 37 | close(htmlDocument); 38 | let _ = execCommand("copy", false, None, htmlDocument); 39 | let _ = getElementsByName("angry-joe", htmlDocument); 40 | let _ = getSelection(htmlDocument); 41 | let _ = hasFocus(htmlDocument); 42 | open_(htmlDocument); 43 | let _ = queryCommandEnabled("copy", htmlDocument); 44 | let _ = queryCommandIndeterm("cut", htmlDocument); 45 | let _ = queryCommandSupported("paste", htmlDocument); 46 | let _ = queryCommandValue("fontName", htmlDocument); 47 | write("Hello World!", htmlDocument); 48 | writeln("Hello Newline!", htmlDocument); 49 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__HtmlElement__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open HtmlElement; 3 | 4 | let el = 5 | document 6 | |> Document.createElement("strong") 7 | |> Element.asHtmlElement 8 | |> TestHelpers.unsafelyUnwrapOption; 9 | let el2 = 10 | document 11 | |> Document.createElement("small") 12 | |> Element.asHtmlElement 13 | |> TestHelpers.unsafelyUnwrapOption; 14 | let event = document |> Document.createEvent("my-event"); 15 | 16 | let _ = accessKey(el); 17 | let _ = setAccessKey(el, ""); 18 | let _ = accessKeyLabel(el); 19 | let _ = contentEditable(el); 20 | let _ = setContentEditable(el, Inherit); 21 | let _ = isContentEditable(el); 22 | let _ = contextMenu(el); 23 | let _ = setContextMenu(el, el2); 24 | let _ = dataset(el); 25 | let _ = dir(el); 26 | let _ = setDir(el, Rtl); 27 | let _ = draggable(el); 28 | let _ = setDraggable(el, true); 29 | let _ = dropzone(el); 30 | let _ = hidden(el); 31 | let _ = setHidden(el, true); 32 | let _ = itemScope(el); 33 | let _ = setItemScope(el, true); 34 | let _ = itemType(el); 35 | let _ = itemId(el); 36 | let _ = setItemId(el, "my-id"); 37 | let _ = itemRef(el); 38 | let _ = itemProp(el); 39 | let _ = itemValue(el); 40 | let _ = setItemValue(el, [%mel.raw "{}"]); 41 | let _ = lang(el); 42 | let _ = setLang(el, "en"); 43 | let _ = offsetHeight(el); 44 | let _ = offsetLeft(el); 45 | let _ = offsetParent(el); 46 | let _ = offsetTop(el); 47 | let _ = offsetWidth(el); 48 | let _ = spellcheck(el); 49 | let _ = setSpellcheck(el, true); 50 | let _ = style(el); 51 | /* let _ = setStyle el CSSStyleDeclaration.t; /* TODO: No way to make a CSSStyleDeclaration at the moment */*/ 52 | let _ = tabIndex(el); 53 | let _ = setTabIndex(el, 42); 54 | let _ = title(el); 55 | let _ = setTitle(el, "hovertext!"); 56 | let _ = translate(el); 57 | let _ = setTranslate(el, true); 58 | 59 | blur(el); 60 | click(el); 61 | focus(el); 62 | forceSpellCheck(el); 63 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__HtmlFormElement__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.FormData; 2 | open Webapi.Dom.HtmlFormElement; 3 | 4 | let test_data = formElement => formElement |> data |> get("foo"); 5 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__IdbVersionChangeEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open IdbVersionChangeEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* IdbVersionChangeEvent */ 23 | let _ = oldVersion(event); 24 | let _ = newVersion(event); 25 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__Image__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom.Image; 2 | 3 | let imageData = make(~width=0.0, ~height=0.0); 4 | 5 | let arr = Js.Typed_array.Uint8ClampedArray.make([||]); 6 | let _ = makeWithData(~array=arr, ~width=0.0, ~height=0.0); 7 | 8 | let _ = height(imageData); 9 | let _ = width(imageData); 10 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__InputEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open InputEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* UIEvent */ 23 | let _ = detail(event); 24 | let _ = view(event); 25 | 26 | /* InputEvent */ 27 | let _ = data(event); 28 | let _ = isComposing(event); 29 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__KeyboardEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open! KeyboardEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* UIEvent */ 23 | let _ = detail(event); 24 | let _ = view(event); 25 | 26 | /* KeyboardEvent */ 27 | let _ = altKey(event); 28 | let _ = code(event); 29 | let _ = ctrlKey(event); 30 | let _ = isComposing(event); 31 | let _ = key(event); 32 | let _ = locale(event); 33 | let _ = location(event); 34 | let _ = metaKey(event); 35 | let _ = repeat(event); 36 | let _ = shiftKey(event); 37 | let _ = getModifierState(Alt, event); 38 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__Location__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open Location; 3 | 4 | let _ = href(location); 5 | let _ = setHref(location, "http://reason.ml"); 6 | let _ = protocol(location); 7 | let _ = setProtocol(location, "https"); 8 | let _ = host(location); 9 | let _ = setHost(location, "reason.ml"); 10 | let _ = hostname(location); 11 | let _ = setHostname(location, "reason.ml"); 12 | let _ = port(location); 13 | let _ = setPort(location, "443"); 14 | let _ = pathname(location); 15 | let _ = setPathname(location, "/reason/tools.html"); 16 | let _ = search(location); 17 | let _ = setSearch(location, "q=reasonml"); 18 | let _ = hash(location); 19 | let _ = setHash(location, "merlin-atom"); 20 | let _ = username(location); 21 | let _ = setUsername(location, "alonzo.church"); 22 | let _ = password(location); 23 | let _ = setPassword(location, "lambda-the-ultimate"); 24 | let _ = origin(location); 25 | 26 | assign("http://reason.ml", location); 27 | reload(location); 28 | reloadWithForce(location); 29 | replace("http://reason.ml", location); 30 | let _ = toString(location); 31 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__MouseEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open MouseEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* UIEvent */ 23 | let _ = detail(event); 24 | let _ = view(event); 25 | 26 | /* MouseEvent */ 27 | let _ = altKey(event); 28 | let _ = button(event); 29 | let _ = buttons(event); 30 | let _ = clientX(event); 31 | let _ = clientY(event); 32 | let _ = ctrlKey(event); 33 | let _ = metaKey(event); 34 | let _ = movementX(event); 35 | let _ = movementY(event); 36 | let _ = offsetX(event); 37 | let _ = offsetY(event); 38 | let _ = pageX(event); 39 | let _ = pageY(event); 40 | let _ = region(event); 41 | let _ = relatedTarget(event); 42 | let _ = screenX(event); 43 | let _ = screenY(event); 44 | let _ = shiftKey(event); 45 | let _ = x(event); 46 | let _ = y(event); 47 | let _ = getModifierState(Alt, event); 48 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__NodeList__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open NodeList; 3 | 4 | let items = document |> Document.querySelectorAll(".item"); 5 | 6 | forEach((item, _) => Js.log(item), items); 7 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__Node__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open Node; 3 | 4 | let node = document |> Document.createElement("strong") |> Element.rootNode; 5 | let node2 = document |> Document.createElement("small") |> Element.rootNode; 6 | let node3 = document |> Document.createElement("small") |> Element.rootNode; 7 | 8 | let _ = childNodes(node); 9 | let _ = firstChild(node); 10 | let _ = lastChild(node); 11 | let _ = nextSibling(node); 12 | let _ = nodeName(node); 13 | let _ = nodeType(node); 14 | let _ = nodeValue(node); 15 | let _ = setNodeValue(node, Js.Null.return("foo")); 16 | /* Not supported yet 17 | let _ = setNodeValue(node, "foo"); 18 | let _ = clearNodeValue(node); 19 | */ 20 | let _ = ownerDocument(node); 21 | let _ = parentNode(node); 22 | let _ = parentElement(node); 23 | let _ = previousSibling(node); 24 | let _ = rootNode(node); 25 | let _ = textContent(node); 26 | let _ = setTextContent(node, "foo"); 27 | 28 | let _ = appendChild(node2, node); 29 | let _ = cloneNode(node); 30 | let _ = cloneNodeDeep(node); 31 | let _ = compareDocumentPosition(node2, node); 32 | let _ = contains(node2, node); 33 | let _ = getRootNode(node); 34 | let _ = getRootNodeComposed(node); 35 | let _ = hasChildNodes(node); 36 | let _ = insertBefore(node2, node3, node); 37 | /***let _ = insertBefore(node2, None, node);*/ 38 | let _ = isDefaultNamespace("http://...", node); 39 | let _ = isEqualNode(node2, node); 40 | let _ = isSameNode(node2, node); 41 | let _ = lookupPrefix(node); 42 | let _ = lookupNamespaceURI("https://...", node); 43 | let _ = lookupDefaultNamespaceURI(node); 44 | let _ = normalize(node); 45 | let _ = removeChild(node2, node); 46 | let _ = replaceChild(node3, node2, node); 47 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__PageTransitionEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open PageTransitionEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* PageTransitionEvent */ 23 | let _ = persisted(event); 24 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__PointerEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open PointerEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* UIEvent */ 23 | let _ = detail(event); 24 | let _ = view(event); 25 | 26 | /* MouseEvent */ 27 | let _ = altKey(event); 28 | let _ = button(event); 29 | let _ = buttons(event); 30 | let _ = clientX(event); 31 | let _ = clientY(event); 32 | let _ = ctrlKey(event); 33 | let _ = metaKey(event); 34 | let _ = movementX(event); 35 | let _ = movementY(event); 36 | let _ = offsetX(event); 37 | let _ = offsetY(event); 38 | let _ = pageX(event); 39 | let _ = pageY(event); 40 | let _ = region(event); 41 | let _ = relatedTarget(event); 42 | let _ = screenX(event); 43 | let _ = screenY(event); 44 | let _ = shiftKey(event); 45 | let _ = x(event); 46 | let _ = y(event); 47 | let _ = getModifierState(Alt, event); 48 | 49 | /* PointerEvent */ 50 | let _ = pointerId(event); 51 | let _ = width(event); 52 | let _ = height(event); 53 | let _ = pressure(event); 54 | let _ = tiltX(event); 55 | let _ = tiltY(event); 56 | let _ = pointerType(event); 57 | let _ = isPrimary(event); 58 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__PopStateEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open PopStateEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* PopStateEvent */ 23 | let _ = state(event); 24 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__ProgressEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open ProgressEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* ProgressEvent */ 23 | let _ = lengthComputable(event); 24 | let _ = loaded(event); 25 | let _ = total(event); 26 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__Range__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open Range; 3 | 4 | let node = document |> Document.createElement("strong"); 5 | 6 | let range = make(); 7 | 8 | let _ = collapsed(range); 9 | let _ = commonAncestorContainer(range); 10 | let _ = endContainer(range); 11 | let _ = endOffset(range); 12 | let _ = startContainer(range); 13 | let _ = startOffset(range); 14 | 15 | setStart(node, 0, range); 16 | setEnd(node, 0, range); 17 | setStartBefore(node, range); 18 | setStartAfter(node, range); 19 | setEndBefore(node, range); 20 | setEndAfter(node, range); 21 | selectNode(node, range); 22 | selectNodeContents(node, range); 23 | collapse(range); 24 | collapseToStart(range); 25 | let _ = cloneContents(range); 26 | deleteContents(range); 27 | let _ = extractContents(range); 28 | insertNode(node, range); 29 | surroundContents(node, range); 30 | let _ = compareBoundaryPoints(0, range, range); 31 | let _ = cloneRange(range); 32 | detach(range); 33 | let _ = toString(range); 34 | let _ = comparePoint(node, 0, range); 35 | let _ = createContextualFragment("stuff", range); 36 | let _ = getBoundingClientRect(range); 37 | let _ = getClientRects(range); 38 | let _ = intersectsNode(node, range); 39 | let _ = isPointInRange(node, 0, range); 40 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__RelatedEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open RelatedEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* RelatedEvent */ 23 | let _ = relatedTarget(event); 24 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__Selection__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open Selection; 3 | 4 | let node = document |> Document.createElement("strong"); 5 | let sel = 6 | document |> Document.asHtmlDocument 7 | |> TestHelpers.unsafelyUnwrapOption 8 | |> HtmlDocument.getSelection; 9 | 10 | let range = Range.make(); 11 | 12 | let _ = anchorNode(sel); 13 | let _ = anchorOffset(sel); 14 | let _ = focusNode(sel); 15 | let _ = focusOffset(sel); 16 | let _ = isCollapsed(sel); 17 | let _ = rangeCount(sel); 18 | let _ = getRangeAt(0, sel); 19 | 20 | collapse(node, 0, sel); 21 | extend(node, 0, sel); 22 | collapseToStart(sel); 23 | collapseToEnd(sel); 24 | selectAllChildren(node, sel); 25 | addRange(range, sel); 26 | removeRange(range, sel); 27 | removeAllRanges(sel); 28 | deleteFromDocument(sel); 29 | setBaseAndExtent(node, 0, node, 0, sel); 30 | let _ = toString(sel); 31 | let _ = containsNode(node, sel); 32 | let _ = containsNodePartly(node, sel); 33 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__StorageEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open StorageEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* StorageEvent */ 23 | let _ = key(event); 24 | let _ = newValue(event); 25 | let _ = oldValue(event); 26 | let _ = storageArea(event); 27 | let _ = url(event); 28 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__SvgZoomEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open SvgZoomEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* UIEvent */ 23 | let _ = detail(event); 24 | let _ = view(event); 25 | 26 | /* SvgZoomEvent */ 27 | let _ = zoomRectScreen(event); 28 | let _ = previousScale(event); 29 | let _ = previousTranslate(event); 30 | let _ = newScale(event); 31 | let _ = newTranslate(event); 32 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__Text__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | 3 | let node = 4 | document |> Document.createTextNode("text") 5 | |> Text.asNode; 6 | 7 | let text = Text.ofNode(node); 8 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__TimeEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open TimeEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* TimeEvent */ 23 | let _ = detail(event); 24 | let _ = view(event); 25 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__TouchEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open TouchEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* UIEvent */ 23 | let _ = detail(event); 24 | let _ = view(event); 25 | 26 | /* TouchEvent */ 27 | let _ = altKey(event); 28 | let _ = changedTouches(event); 29 | let _ = ctrlKey(event); 30 | let _ = metaKey(event); 31 | let _ = shiftKey(event); 32 | let _ = targetTouches(event); 33 | let _ = touches(event); 34 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__TrackEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open TrackEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* TrackEvent */ 23 | let _ = track(event); 24 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__TransitionEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open TransitionEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* TransitionEvent */ 23 | let _ = propertyName(event); 24 | let _ = elapsedTime(event); 25 | let _ = pseudoElement(event); 26 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__UiEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open UiEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* UIEvent */ 23 | let _ = detail(event); 24 | let _ = view(event); 25 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__WebGlContextEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open WebGlContextEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* WebGlContextEvent */ 23 | let _ = statusMessage(event); 24 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__WheelEvent__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | open WheelEvent; 3 | 4 | let event = make("my-event"); 5 | 6 | /* Event */ 7 | let _ = bubbles(event); 8 | let _ = cancelable(event); 9 | let _ = composed(event); 10 | let _ = currentTarget(event); 11 | let _ = defaultPrevented(event); 12 | let _ = eventPhase(event); 13 | let _ = target(event); 14 | let _ = timeStamp(event); 15 | let _ = type_(event); 16 | let _ = isTrusted(event); 17 | 18 | preventDefault(event); 19 | stopImmediatePropagation(event); 20 | stopPropagation(event); 21 | 22 | /* UIEvent */ 23 | let _ = detail(event); 24 | let _ = view(event); 25 | 26 | /* MouseEvent */ 27 | let _ = clientX(event); 28 | 29 | /* WheelEvent */ 30 | let _ = deltaX(event); 31 | let _ = deltaY(event); 32 | let _ = deltaZ(event); 33 | let _ = deltaMode(event); 34 | -------------------------------------------------------------------------------- /tests/Webapi/Dom/Webapi__Dom__Window__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Dom; 2 | 3 | let el = document |> Document.createElement("strong"); 4 | let event = document |> Document.createEvent("my-event"); 5 | let handleClick = (_) => print_endline("asd"); 6 | 7 | let _ = Window.console(window); 8 | let _ = Window.crypto(window); 9 | let _ = Window.document(window); 10 | let _ = Window.frameElement(window); 11 | let _ = Window.frames(window); 12 | let _ = Window.fullScreen(window); 13 | let _ = Window.history(window); 14 | let _ = Window.innerWidth(window); 15 | let _ = Window.innerHeight(window); 16 | let _ = Window.isSecureContext(window); 17 | let _ = Window.length(window); 18 | let _ = Window.location(window); 19 | let _ = Window.setLocation(window, "http://reason.ml"); 20 | let _ = Window.locationbar(window); 21 | let _ = Window.menubar(window); 22 | let _ = Window.name(window); 23 | let _ = Window.setName(window, "new name"); 24 | let _ = Window.navigator(window); 25 | let _ = Window.opener(window); 26 | let _ = Window.outerWidth(window); 27 | let _ = Window.outerHeight(window); 28 | let _ = Window.pageXOffset(window); 29 | let _ = Window.pageYOffset(window); 30 | let _ = Window.parent(window); 31 | let _ = Window.performance(window); 32 | let _ = Window.personalbar(window); 33 | let _ = Window.screen(window); 34 | let _ = Window.screenX(window); 35 | let _ = Window.screenY(window); 36 | let _ = Window.scrollbars(window); 37 | let _ = Window.scrollX(window); 38 | let _ = Window.scrollY(window); 39 | let _ = Window.self(window); 40 | let _ = Window.speechSynthesis(window); 41 | let _ = Window.status(window); 42 | let _ = Window.setStatus(window, "new status"); 43 | let _ = Window.statusbar(window); 44 | let _ = Window.toolbar(window); 45 | let _ = Window.top(window); 46 | let _ = Window.window(window); 47 | 48 | Window.alert("hello!", window); 49 | Window.blur(window); 50 | let idleId = Window.requestIdleCallback((_) => (), window); /* out of order */ 51 | Window.cancelIdleCallback(idleId, window); 52 | Window.close(window); 53 | let _ = Window.confirm("is ok?", window); 54 | Window.focus(window); 55 | let _ = Window.getComputedStyle(el, window); 56 | let _ = Window.getComputedStyleWithPseudoElement(el, "hover", window); 57 | let _ = Window.getSelection(window); 58 | let _ = Window.matchMedia("max-height: 400", window); 59 | let _ = Window.moveBy(10, (-10), window); 60 | let _ = Window.moveTo(120, 300, window); 61 | let _ = Window.open_(~url="http://...", ~name="my window", ~features="menubar=yes", window); 62 | let _ = Window.open_(~url="http://...", ~name="my window", window); 63 | Window.postMessage("my message", "*", window) /* Currently no way to make transferables */; /*Window.postMessageWithTransfers "my message" "*" transfers window;*/ 64 | Window.print(window); 65 | let _ = Window.prompt("type you password, please?", window); 66 | let _ = Window.promptWithDefault("type password or use this?", "password", window); 67 | let _ = Window.requestIdleCallbackWithOptions((_) => (), {"timeout": 1000}, window); 68 | let _ = Window.resizeBy(10, (-10), window); 69 | let _ = Window.resizeTo(120, 300, window); 70 | let _ = Window.scroll(0.0, 0.0, window); 71 | let _ = Window.scrollBy(10.0, (-10.0), window); 72 | let _ = Window.scrollTo(120.5, 300.3, window); 73 | Window.stop(window); 74 | Window.setOnLoad(window, () => print_endline("load")); 75 | -------------------------------------------------------------------------------- /tests/Webapi/Webapi__Base64__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Base64; 2 | 3 | let _ = atob("foo"); 4 | let _ = btoa("gibberish"); 5 | -------------------------------------------------------------------------------- /tests/Webapi/Webapi__Blob__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Blob; 2 | 3 | let test_arrayBuffer = blob => blob |> arrayBuffer |> Js.Promise.then_(buffer => 4 | buffer 5 | |> Js.Typed_array.ArrayBuffer.byteLength 6 | |> Js.log 7 | |> Js.Promise.resolve); 8 | 9 | let test_size = blob => blob |> size |> Js.log; 10 | 11 | let test_slice = blob => test_size(slice(~start=0, blob)); 12 | 13 | let test_stream = blob => blob |> stream; 14 | 15 | let test_text = blob => blob |> text |> Js.Promise.then_(string => 16 | string 17 | |> Js.log 18 | |> Js.Promise.resolve); 19 | 20 | let test_type = blob => blob |> type_ |> Js.log; 21 | -------------------------------------------------------------------------------- /tests/Webapi/Webapi__File__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.File; 2 | 3 | let test_lastModified = file => file |> lastModified |> Js.log; 4 | let test_name = file => file |> name |> Js.log; 5 | let test_preview = file => file |> preview |> Js.log; 6 | -------------------------------------------------------------------------------- /tests/Webapi/Webapi__Performace__test.re: -------------------------------------------------------------------------------- 1 | let _ = 2 | Webapi.Dom.window 3 | |> Webapi.Dom.Window.performance 4 | |> Webapi.Performance.now; 5 | -------------------------------------------------------------------------------- /tests/Webapi/Webapi__ReadableStream__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.ReadableStream; 2 | 3 | module DefaultReader__test = { 4 | open! DefaultReader; 5 | 6 | let test_closed = reader => closed(reader); 7 | 8 | let test_cancel = reader => 9 | reader 10 | |> cancel 11 | |> Js.Promise.then_(() => 12 | "cancelled" 13 | |> Js.log 14 | |> Js.Promise.resolve); 15 | 16 | let test_cancelWith = reader => 17 | reader 18 | |> cancelWith("reason") 19 | |> Js.Promise.then_(reason => 20 | reason 21 | |> Js.log 22 | |> Js.Promise.resolve); 23 | 24 | let test_releaseLock = reader => releaseLock(reader); 25 | 26 | let test_read = reader => 27 | reader 28 | |> read 29 | |> Js.Promise.then_(next => 30 | next 31 | |> Fetch__Iterator.Next.value 32 | |> Belt.Option.forEach(_, Js.log) 33 | |> Js.Promise.resolve); 34 | }; 35 | 36 | let test_locked = stream => locked(stream); 37 | 38 | let test_cancel = stream => cancel(stream); 39 | 40 | let test_cancelWith = stream => cancelWith("reason", stream); 41 | 42 | let test_getReader = stream => getReader(stream); 43 | 44 | let test_getReaderBYOB = stream => getReaderBYOB(stream); 45 | 46 | let test_tee = stream => { 47 | let (stream1, stream2) = tee(stream); 48 | 49 | stream1 |> cancel |> ignore; 50 | stream2 |> cancel |> ignore; 51 | }; 52 | -------------------------------------------------------------------------------- /tests/Webapi/Webapi__ResizeObserver__test.re: -------------------------------------------------------------------------------- 1 | let el = Webapi.Dom.document |> Webapi.Dom.Document.createElement("strong"); 2 | 3 | let handler = (entries) => { 4 | let entry = entries[0]; 5 | let _: Dom.domRect = Webapi.ResizeObserver.ResizeObserverEntry.contentRect(entry); 6 | let _: Dom.element = Webapi.ResizeObserver.ResizeObserverEntry.target(entry); 7 | } 8 | 9 | let observer = Webapi.ResizeObserver.make(handler); 10 | 11 | Webapi.ResizeObserver.observe(observer, el); 12 | Webapi.ResizeObserver.unobserve(observer, el); 13 | Webapi.ResizeObserver.disconnect(observer); 14 | -------------------------------------------------------------------------------- /tests/Webapi/Webapi__Url__test.re: -------------------------------------------------------------------------------- 1 | open Webapi.Url; 2 | 3 | let params = URLSearchParams.make("key1=value1&key2=value2"); 4 | URLSearchParams.forEach(Js.log2, params); 5 | let test_entries = params => params |> URLSearchParams.entries |> Js.Array.from; 6 | Js.log(test_entries(params)); 7 | -------------------------------------------------------------------------------- /tests/dune: -------------------------------------------------------------------------------- 1 | (include_subdirs unqualified) 2 | 3 | (melange.emit 4 | (target tests) 5 | (libraries webapi melange.belt) 6 | (preprocess 7 | (pps melange.ppx))) 8 | -------------------------------------------------------------------------------- /tests/testHelpers.re: -------------------------------------------------------------------------------- 1 | let unsafelyUnwrapOption = 2 | fun | Some(v) => v 3 | | None => raise(Invalid_argument("Passed `None` to unsafelyUnwrapOption")); 4 | --------------------------------------------------------------------------------