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