dom_wasm.mx raw
1 //go:build wasm
2 //:build wasm
3
4 package dom
5
6 import (
7 "git.smesh.lol/smesh/web/common/jsbridge/callback"
8 "unsafe"
9 )
10
11 // --- Element creation/query ---
12
13 //:wasmimport bridge dom_body
14 func wasmBody() (n int32)
15
16 //:wasmimport bridge dom_create_element
17 func wasmCreateElement(ptr *byte, len int32, cap int32) (n int32)
18
19 //:wasmimport bridge dom_create_text_node
20 func wasmCreateTextNode(ptr *byte, len int32, cap int32) (n int32)
21
22 //:wasmimport bridge dom_get_element_by_id
23 func wasmGetElementById(ptr *byte, len int32, cap int32) (n int32)
24
25 //:wasmimport bridge dom_query_selector
26 func wasmQuerySelector(ptr *byte, len int32, cap int32) (n int32)
27
28 //:wasmimport bridge dom_query_selector_from
29 func wasmQuerySelectorFrom(root int32, ptr *byte, len int32, cap int32) (n int32)
30
31 func Body() (e Element) { return Element(wasmBody()) }
32 func CreateElement(tag string) (e Element) { return Element(wasmCreateElement(unsafe.StringData(tag), int32(len(tag)), int32(len(tag)))) }
33 func CreateTextNode(text string) (e Element) { return Element(wasmCreateTextNode(unsafe.StringData(text), int32(len(text)), int32(len(text)))) }
34 func GetElementById(id string) (e Element) { return Element(wasmGetElementById(unsafe.StringData(id), int32(len(id)), int32(len(id)))) }
35 func QuerySelector(sel string) (e Element) { return Element(wasmQuerySelector(unsafe.StringData(sel), int32(len(sel)), int32(len(sel)))) }
36 func QuerySelectorFrom(root Element, sel string) (e Element) { return Element(wasmQuerySelectorFrom(int32(root), unsafe.StringData(sel), int32(len(sel)), int32(len(sel)))) }
37
38 // --- Tree manipulation ---
39
40 //:wasmimport bridge dom_append_child
41 func wasmAppendChild(parent int32, child int32)
42
43 //:wasmimport bridge dom_remove_child
44 func wasmRemoveChild(parent int32, child int32)
45
46 //:wasmimport bridge dom_remove
47 func wasmRemove(el int32)
48
49 //:wasmimport bridge dom_insert_before
50 func wasmInsertBefore(parent int32, newChild int32, refChild int32)
51
52 //:wasmimport bridge dom_first_child
53 func wasmFirstChild(el int32) (n int32)
54
55 //:wasmimport bridge dom_first_element_child
56 func wasmFirstElementChild(el int32) (n int32)
57
58 //:wasmimport bridge dom_next_sibling
59 func wasmNextSibling(el int32) (n int32)
60
61 //:wasmimport bridge dom_release_element
62 func wasmReleaseElement(el int32)
63
64 //:wasmimport bridge dom_release_all
65 func wasmReleaseAll(ptr *int32, len int32)
66
67 func AppendChild(parent, child Element) { wasmAppendChild(int32(parent), int32(child)) }
68 func RemoveChild(parent, child Element) { wasmRemoveChild(int32(parent), int32(child)) }
69 func Remove(el Element) { wasmRemove(int32(el)) }
70 func InsertBefore(parent, newChild, refChild Element) { wasmInsertBefore(int32(parent), int32(newChild), int32(refChild)) }
71 func FirstChild(el Element) (e Element) { return Element(wasmFirstChild(int32(el))) }
72 func FirstElementChild(el Element) (e Element) { return Element(wasmFirstElementChild(int32(el))) }
73 func NextSibling(el Element) (e Element) { return Element(wasmNextSibling(int32(el))) }
74 func ReleaseElement(el Element) { wasmReleaseElement(int32(el)) }
75 func ReleaseAll(ids []int32) { if len(ids) > 0 { wasmReleaseAll(&ids[0], int32(len(ids))) } }
76
77 //:wasmimport bridge dom_release_children
78 func wasmReleaseChildren(el int32)
79
80 func ReleaseChildren(el Element) { wasmReleaseChildren(int32(el)) }
81
82 // --- Attributes and content ---
83
84 //:wasmimport bridge dom_set_attribute
85 func wasmSetAttribute(el int32, nPtr *byte, nLen int32, nCap int32, vPtr *byte, vLen int32, vCap int32)
86
87 //:wasmimport bridge dom_remove_attribute
88 func wasmRemoveAttribute(el int32, nPtr *byte, nLen int32, nCap int32)
89
90 //:wasmimport bridge dom_get_attribute
91 func wasmGetAttribute(el int32, nPtr *byte, nLen int32, nCap int32, outPtr *int32, outLen *int32)
92
93 //:wasmimport bridge dom_set_text_content
94 func wasmSetTextContent(el int32, ptr *byte, len int32, cap int32)
95
96 //:wasmimport bridge dom_set_inner_html
97 func wasmSetInnerHTML(el int32, ptr *byte, len int32, cap int32)
98
99 //:wasmimport bridge dom_set_style
100 func wasmSetStyle(el int32, pPtr *byte, pLen int32, pCap int32, vPtr *byte, vLen int32, vCap int32)
101
102 //:wasmimport bridge dom_add_class
103 func wasmAddClass(el int32, ptr *byte, len int32, cap int32)
104
105 //:wasmimport bridge dom_remove_class
106 func wasmRemoveClass(el int32, ptr *byte, len int32, cap int32)
107
108 //:wasmimport bridge dom_focus
109 func wasmFocus(el int32)
110
111 //:wasmimport bridge dom_set_property
112 func wasmSetProperty(el int32, pPtr *byte, pLen int32, pCap int32, vPtr *byte, vLen int32, vCap int32)
113
114 //:wasmimport bridge dom_get_property
115 func wasmGetProperty(el int32, pPtr *byte, pLen int32, pCap int32, outPtr *int32, outLen *int32)
116
117 func SetAttribute(el Element, name, value string) {
118 wasmSetAttribute(int32(el),
119 unsafe.StringData(name), int32(len(name)), int32(len(name)),
120 unsafe.StringData(value), int32(len(value)), int32(len(value)))
121 }
122
123 func RemoveAttribute(el Element, name string) {
124 wasmRemoveAttribute(int32(el), unsafe.StringData(name), int32(len(name)), int32(len(name)))
125 }
126
127 func GetAttribute(el Element, name string) (s string) {
128 var rPtr, rLen int32
129 wasmGetAttribute(int32(el), unsafe.StringData(name), int32(len(name)), int32(len(name)), &rPtr, &rLen)
130 return ptrToString(rPtr, rLen)
131 }
132
133 func SetTextContent(el Element, text string) {
134 wasmSetTextContent(int32(el), unsafe.StringData(text), int32(len(text)), int32(len(text)))
135 }
136
137 func SetInnerHTML(el Element, html string) {
138 wasmSetInnerHTML(int32(el), unsafe.StringData(html), int32(len(html)), int32(len(html)))
139 }
140
141 func SetStyle(el Element, prop, value string) {
142 wasmSetStyle(int32(el),
143 unsafe.StringData(prop), int32(len(prop)), int32(len(prop)),
144 unsafe.StringData(value), int32(len(value)), int32(len(value)))
145 }
146
147 func AddClass(el Element, cls string) {
148 wasmAddClass(int32(el), unsafe.StringData(cls), int32(len(cls)), int32(len(cls)))
149 }
150
151 func RemoveClass(el Element, cls string) {
152 wasmRemoveClass(int32(el), unsafe.StringData(cls), int32(len(cls)), int32(len(cls)))
153 }
154
155 func Focus(el Element) { wasmFocus(int32(el)) }
156
157 func SetProperty(el Element, prop, value string) {
158 wasmSetProperty(int32(el),
159 unsafe.StringData(prop), int32(len(prop)), int32(len(prop)),
160 unsafe.StringData(value), int32(len(value)), int32(len(value)))
161 }
162
163 func GetProperty(el Element, prop string) (s string) {
164 var rPtr, rLen int32
165 wasmGetProperty(int32(el), unsafe.StringData(prop), int32(len(prop)), int32(len(prop)), &rPtr, &rLen)
166 return ptrToString(rPtr, rLen)
167 }
168
169 // --- Geometry ---
170
171 //:wasmimport bridge dom_bounding_client_left
172 func wasmBoundingClientLeft(el int32) (n int32)
173
174 //:wasmimport bridge dom_get_bounding_rect
175 func wasmGetBoundingRect(el int32, cbID int32)
176
177 //:wasmimport bridge dom_get_viewport_height
178 func wasmGetViewportHeight() (n int32)
179
180 //:wasmimport bridge dom_get_viewport_width
181 func wasmGetViewportWidth() (n int32)
182
183 func BoundingClientLeft(el Element) (n int32) { return wasmBoundingClientLeft(int32(el)) }
184
185 func GetBoundingRect(el Element, fn func(int32, int32, int32, int32, int32, int32)) {
186 wasmGetBoundingRect(int32(el), callback.Register6IOnce(fn))
187 }
188
189 func GetViewportHeight() (n int32) { return wasmGetViewportHeight() }
190 func GetViewportWidth() (n int32) { return wasmGetViewportWidth() }
191
192 // --- Callbacks and events ---
193
194 //:wasmimport bridge dom_add_event_listener
195 func wasmAddEventListener(el int32, evPtr *byte, evLen int32, evCap int32, cbID int32)
196
197 //:wasmimport bridge dom_add_self_event_listener
198 func wasmAddSelfEventListener(el int32, evPtr *byte, evLen int32, evCap int32, cbID int32)
199
200 //:wasmimport bridge dom_add_enter_key_listener
201 func wasmAddEnterKeyListener(el int32, cbID int32)
202
203 //:wasmimport bridge dom_remove_event_listener
204 func wasmRemoveEventListener(el int32, evPtr *byte, evLen int32, evCap int32, cbID int32)
205
206 //:wasmimport bridge dom_observe_resize
207 func wasmObserveResize(el int32, cbID int32)
208
209 //:wasmimport bridge dom_unobserve_resize
210 func wasmUnobserveResize(el int32)
211
212 //:wasmimport bridge dom_request_animation_frame
213 func wasmRequestAnimationFrame(cbID int32)
214
215 func RegisterCallback(fn func()) (n int32) {
216 return callback.Register0(fn)
217 }
218
219 func ReleaseCallback(id int32) {
220 callback.Release(id)
221 }
222
223 func AddEventListener(el Element, event string, callbackId int32) {
224 wasmAddEventListener(int32(el), unsafe.StringData(event), int32(len(event)), int32(len(event)), callbackId)
225 }
226
227 func AddSelfEventListener(el Element, event string, callbackId int32) {
228 wasmAddSelfEventListener(int32(el), unsafe.StringData(event), int32(len(event)), int32(len(event)), callbackId)
229 }
230
231 func AddEnterKeyListener(el Element, callbackId int32) {
232 wasmAddEnterKeyListener(int32(el), callbackId)
233 }
234
235 func RemoveEventListener(el Element, event string, callbackId int32) {
236 wasmRemoveEventListener(int32(el), unsafe.StringData(event), int32(len(event)), int32(len(event)), callbackId)
237 }
238
239 func ObserveResize(el Element, callbackId int32) {
240 wasmObserveResize(int32(el), callbackId)
241 }
242
243 func UnobserveResize(el Element) {
244 wasmUnobserveResize(int32(el))
245 }
246
247 func RequestAnimationFrame(fn func()) {
248 wasmRequestAnimationFrame(callback.Register0Once(fn))
249 }
250
251 // OnKeydown has a nested callback: fn(key, preventDefault).
252 // Uses a custom hook so preventDefault can be signaled synchronously.
253 var keydownHandlers = map[int32]func(string, func()){}
254 var keydownNextID int32 = 1
255
256 //:wasmimport bridge dom_on_keydown
257 func wasmOnKeydown(el int32, handlerID int32)
258
259 func OnKeydown(el Element, fn func(string, func())) {
260 id := keydownNextID
261 keydownNextID++
262 keydownHandlers[id] = fn
263 wasmOnKeydown(int32(el), id)
264 }
265
266 //:wasmexport __hook_keydown
267 func hookKeydown(handlerID int32, keyPtr *byte, keyLen int32) (n int32) {
268 fn, ok := keydownHandlers[handlerID]
269 if !ok {
270 return 0
271 }
272 key := ptrToStringLocal(keyPtr, keyLen)
273 prevented := int32(0)
274 fn(key, func() { prevented = 1 })
275 return prevented
276 }
277
278 // --- Mention chips ---
279
280 //:wasmimport bridge dom_insert_mention_chip
281 func wasmInsertMentionChip(el int32, charCount int32, npubPtr *byte, npubLen int32, npubCap int32, namePtr *byte, nameLen int32, nameCap int32, picPtr *byte, picLen int32, picCap int32)
282
283 func InsertMentionChip(el Element, charCount int32, npub, name, pic string) {
284 wasmInsertMentionChip(int32(el), int32(charCount),
285 unsafe.StringData(npub), int32(len(npub)), int32(len(npub)),
286 unsafe.StringData(name), int32(len(name)), int32(len(name)),
287 unsafe.StringData(pic), int32(len(pic)), int32(len(pic)))
288 }
289
290 // --- Timers ---
291
292 //:wasmimport bridge dom_set_timeout
293 func wasmSetTimeout(cbID int32, ms int32) (n int32)
294
295 //:wasmimport bridge dom_clear_timeout
296 func wasmClearTimeout(id int32)
297
298 func SetTimeout(fn func(), ms int32) (n int32) {
299 return wasmSetTimeout(callback.Register0Once(fn), ms)
300 }
301
302 func ClearTimeout(id int32) { wasmClearTimeout(id) }
303
304 // --- Fetch ---
305
306 //:wasmimport bridge dom_fetch_text
307 func wasmFetchText(ptr *byte, len int32, cap int32, cbID int32)
308
309 //:wasmimport bridge dom_fetch_relay_info
310 func wasmFetchRelayInfo(ptr *byte, len int32, cap int32, cbID int32)
311
312 //:wasmimport bridge dom_fetch_put_blob_base64
313 func wasmFetchPutBlobBase64(urlPtr *byte, urlLen int32, urlCap int32, dataPtr *byte, dataLen int32, dataCap int32, ctPtr *byte, ctLen int32, ctCap int32, authPtr *byte, authLen int32, authCap int32, cbID int32)
314
315 func FetchText(url string, fn func(string)) {
316 wasmFetchText(unsafe.StringData(url), int32(len(url)), int32(len(url)), callback.RegisterSOnce(fn))
317 }
318
319 func FetchRelayInfo(url string, fn func(string)) {
320 wasmFetchRelayInfo(unsafe.StringData(url), int32(len(url)), int32(len(url)), callback.RegisterSOnce(fn))
321 }
322
323 func FetchPutBlobBase64(url, base64data, contentType, authHeader string, fn func(string)) {
324 wasmFetchPutBlobBase64(
325 unsafe.StringData(url), int32(len(url)), int32(len(url)),
326 unsafe.StringData(base64data), int32(len(base64data)), int32(len(base64data)),
327 unsafe.StringData(contentType), int32(len(contentType)), int32(len(contentType)),
328 unsafe.StringData(authHeader), int32(len(authHeader)), int32(len(authHeader)),
329 callback.RegisterSOnce(fn))
330 }
331
332 // --- IDB ---
333
334 //:wasmimport bridge dom_idb_set_enc_key
335 func wasmIDBSetEncKey(ptr *byte, len int32, cap int32)
336
337 //:wasmimport bridge dom_idb_get
338 func wasmIDBGet(storePtr *byte, storeLen int32, storeCap int32, keyPtr *byte, keyLen int32, keyCap int32, cbID int32)
339
340 //:wasmimport bridge dom_idb_put
341 func wasmIDBPut(storePtr *byte, storeLen int32, storeCap int32, keyPtr *byte, keyLen int32, keyCap int32, valPtr *byte, valLen int32, valCap int32)
342
343 //:wasmimport bridge dom_idb_get_all
344 func wasmIDBGetAll(storePtr *byte, storeLen int32, storeCap int32, fnID int32, doneID int32)
345
346 func IDBSetEncKey(hexKey string) {
347 wasmIDBSetEncKey(unsafe.StringData(hexKey), int32(len(hexKey)), int32(len(hexKey)))
348 }
349
350 func IDBGet(store, key string, fn func(string)) {
351 wasmIDBGet(
352 unsafe.StringData(store), int32(len(store)), int32(len(store)),
353 unsafe.StringData(key), int32(len(key)), int32(len(key)),
354 callback.RegisterSOnce(fn))
355 }
356
357 func IDBPut(store, key, value string) {
358 wasmIDBPut(
359 unsafe.StringData(store), int32(len(store)), int32(len(store)),
360 unsafe.StringData(key), int32(len(key)), int32(len(key)),
361 unsafe.StringData(value), int32(len(value)), int32(len(value)))
362 }
363
364 func IDBGetAll(store string, fn func(string, string), done func()) {
365 fnID := callback.RegisterSS(fn)
366 doneID := callback.Register0Once(func() {
367 callback.Release(fnID)
368 done()
369 })
370 wasmIDBGetAll(unsafe.StringData(store), int32(len(store)), int32(len(store)), fnID, doneID)
371 }
372
373 // --- Browser state ---
374
375 //:wasmimport bridge dom_prefers_dark
376 func wasmPrefersDark() (n int32)
377
378 //:wasmimport bridge dom_console_log
379 func wasmConsoleLog(ptr *byte, len int32, cap int32)
380
381 //:wasmimport bridge dom_confirm
382 func wasmConfirm(ptr *byte, len int32, cap int32) (n int32)
383
384 //:wasmimport bridge dom_post_to_sw
385 func wasmPostToSW(ptr *byte, len int32, cap int32)
386
387 //:wasmimport bridge dom_on_sw_message
388 func wasmOnSWMessage(cbID int32)
389
390 //:wasmimport bridge dom_push_state
391 func wasmPushState(ptr *byte, len int32, cap int32)
392
393 //:wasmimport bridge dom_replace_state
394 func wasmReplaceState(ptr *byte, len int32, cap int32)
395
396 //:wasmimport bridge dom_back
397 func wasmBack()
398
399 //:wasmimport bridge dom_location_reload
400 func wasmLocationReload()
401
402 //:wasmimport bridge dom_location_assign
403 func wasmLocationAssign(ptr *byte, len int32, cap int32)
404
405 //:wasmimport bridge dom_hard_refresh
406 func wasmHardRefresh()
407
408 //:wasmimport bridge dom_clear_storage_prefix
409 func wasmClearStoragePrefix(ptr *byte, len int32, cap int32)
410
411 //:wasmimport bridge dom_timezone_offset_seconds
412 func wasmTimezoneOffsetSeconds() (n int32)
413
414 //:wasmimport bridge dom_read_clipboard
415 func wasmReadClipboard(cbID int32)
416
417 //:wasmimport bridge dom_write_clipboard
418 func wasmWriteClipboard(ptr *byte, len int32, cap int32, cbID int32)
419
420 //:wasmimport bridge dom_get_path
421 func wasmGetPath(outPtr *int32, outLen *int32)
422
423 //:wasmimport bridge dom_get_hash
424 func wasmGetHash(outPtr *int32, outLen *int32)
425
426 //:wasmimport bridge dom_hostname
427 func wasmHostname(outPtr *int32, outLen *int32)
428
429 //:wasmimport bridge dom_port
430 func wasmPort(outPtr *int32, outLen *int32)
431
432 //:wasmimport bridge dom_user_agent
433 func wasmUserAgent(outPtr *int32, outLen *int32)
434
435 //:wasmimport bridge dom_on_pop_state
436 func wasmOnPopState(cbID int32)
437
438 //:wasmimport bridge dom_intercept_internal_links
439 func wasmInterceptInternalLinks(cbID int32)
440
441 //:wasmimport bridge dom_pick_file_text
442 func wasmPickFileText(ptr *byte, len int32, cap int32, cbID int32)
443
444 //:wasmimport bridge dom_download_text
445 func wasmDownloadText(fnPtr *byte, fnLen int32, fnCap int32, ctPtr *byte, ctLen int32, ctCap int32, mtPtr *byte, mtLen int32, mtCap int32)
446
447 //:wasmimport bridge dom_on_pull_refresh
448 func wasmOnPullRefresh(el int32, indicator int32, cbID int32)
449
450 //:wasmimport bridge dom_now_seconds
451 func wasmNowSeconds() (n int64)
452
453 //:wasmimport bridge dom_pick_file_base64
454 func wasmPickFileBase64(ptr *byte, len int32, cap int32, cbID int32)
455
456 //:wasmimport bridge dom_on_paste_image
457 func wasmOnPasteImage(el int32, cbID int32)
458
459 //:wasmimport bridge dom_on_drop_image
460 func wasmOnDropImage(el int32, cbID int32)
461
462 func PrefersDark() (ok bool) { return wasmPrefersDark() != 0 }
463
464 func ConsoleLog(msg string) {
465 wasmConsoleLog(unsafe.StringData(msg), int32(len(msg)), int32(len(msg)))
466 }
467
468 func Confirm(msg string) (ok bool) {
469 return wasmConfirm(unsafe.StringData(msg), int32(len(msg)), int32(len(msg))) != 0
470 }
471
472 func PostToSW(msg string) {
473 wasmPostToSW(unsafe.StringData(msg), int32(len(msg)), int32(len(msg)))
474 }
475
476 func OnSWMessage(fn func(string)) {
477 wasmOnSWMessage(callback.RegisterS(fn))
478 }
479
480 func PushState(path string) {
481 wasmPushState(unsafe.StringData(path), int32(len(path)), int32(len(path)))
482 }
483
484 func ReplaceState(path string) {
485 wasmReplaceState(unsafe.StringData(path), int32(len(path)), int32(len(path)))
486 }
487
488 func Back() { wasmBack() }
489 func LocationReload() { wasmLocationReload() }
490 func LocationAssign(url string) {
491 wasmLocationAssign(unsafe.StringData(url), int32(len(url)), int32(len(url)))
492 }
493 func HardRefresh() { wasmHardRefresh() }
494
495 func ClearStoragePrefix(prefix string) {
496 wasmClearStoragePrefix(unsafe.StringData(prefix), int32(len(prefix)), int32(len(prefix)))
497 }
498
499 func TimezoneOffsetSeconds() (n int32) { return wasmTimezoneOffsetSeconds() }
500
501 func ReadClipboard(fn func(string)) {
502 wasmReadClipboard(callback.RegisterSOnce(fn))
503 }
504
505 func WriteClipboard(text string, fn func(bool)) {
506 wasmWriteClipboard(unsafe.StringData(text), int32(len(text)), int32(len(text)), callback.RegisterBOnce(fn))
507 }
508
509 //:wasmimport bridge dom_write_primary_selection
510 func wasmWritePrimarySelection(ptr *byte, len int32, cap int32)
511
512 func WritePrimarySelection(text string) {
513 wasmWritePrimarySelection(unsafe.StringData(text), int32(len(text)), int32(len(text)))
514 }
515
516 //:wasmimport bridge dom_copy_image_to_clipboard
517 func wasmCopyImageToClipboard(el int32, cbID int32)
518
519 func CopyImageToClipboard(el Element, fn func(bool)) {
520 wasmCopyImageToClipboard(int32(el), callback.RegisterBOnce(fn))
521 }
522
523 //:wasmimport bridge dom_window_open
524 func wasmWindowOpen(ptr *byte, len int32, cap int32)
525
526 func WindowOpen(url string) {
527 wasmWindowOpen(unsafe.StringData(url), int32(len(url)), int32(len(url)))
528 }
529
530 //:wasmimport bridge dom_encode_uri_component
531 func wasmEncodeURIComponent(ptr *byte, len int32, cap int32, rPtr *int32, rLen *int32)
532
533 func EncodeURIComponent(s string) (sv string) {
534 var rPtr, rLen int32
535 wasmEncodeURIComponent(unsafe.StringData(s), int32(len(s)), int32(len(s)), &rPtr, &rLen)
536 return ptrToString(rPtr, rLen)
537 }
538
539 func GetPath() (s string) {
540 var rPtr, rLen int32
541 wasmGetPath(&rPtr, &rLen)
542 return ptrToString(rPtr, rLen)
543 }
544
545 func GetHash() (s string) {
546 var rPtr, rLen int32
547 wasmGetHash(&rPtr, &rLen)
548 return ptrToString(rPtr, rLen)
549 }
550
551 func Hostname() (s string) {
552 var rPtr, rLen int32
553 wasmHostname(&rPtr, &rLen)
554 return ptrToString(rPtr, rLen)
555 }
556
557 func Port() (s string) {
558 var rPtr, rLen int32
559 wasmPort(&rPtr, &rLen)
560 return ptrToString(rPtr, rLen)
561 }
562
563 func UserAgent() (s string) {
564 var rPtr, rLen int32
565 wasmUserAgent(&rPtr, &rLen)
566 return ptrToString(rPtr, rLen)
567 }
568
569 func OnPopState(fn func(string)) {
570 wasmOnPopState(callback.RegisterS(fn))
571 }
572
573 func InterceptInternalLinks(fn func(string)) {
574 wasmInterceptInternalLinks(callback.RegisterS(fn))
575 }
576
577 func PickFileText(accept string, fn func(string)) {
578 wasmPickFileText(unsafe.StringData(accept), int32(len(accept)), int32(len(accept)), callback.RegisterSOnce(fn))
579 }
580
581 func DownloadText(filename, content, mimeType string) {
582 wasmDownloadText(
583 unsafe.StringData(filename), int32(len(filename)), int32(len(filename)),
584 unsafe.StringData(content), int32(len(content)), int32(len(content)),
585 unsafe.StringData(mimeType), int32(len(mimeType)), int32(len(mimeType)))
586 }
587
588 func OnPullRefresh(el Element, indicator Element, fn func()) {
589 wasmOnPullRefresh(int32(el), int32(indicator), callback.Register0(fn))
590 }
591
592 func NowSeconds() (n int64) { return wasmNowSeconds() }
593
594 func PickFileBase64(accept string, fn func(string, string)) {
595 wasmPickFileBase64(unsafe.StringData(accept), int32(len(accept)), int32(len(accept)), callback.RegisterSSOnce(fn))
596 }
597
598 func OnPasteImage(el Element, fn func(string, string)) {
599 wasmOnPasteImage(int32(el), callback.RegisterSS(fn))
600 }
601
602 func OnDropImage(el Element, fn func(string, string)) {
603 wasmOnDropImage(int32(el), callback.RegisterSS(fn))
604 }
605
606 func ptrToString(ptr int32, length int32) (s string) {
607 if length <= 0 {
608 return ""
609 }
610 return unsafe.String((*byte)(unsafe.Pointer(uintptr(ptr))), length)
611 }
612
613 func ptrToStringLocal(ptr *byte, length int32) (s string) {
614 if ptr == nil || length <= 0 {
615 return ""
616 }
617 return unsafe.String(ptr, length)
618 }
619