-
Notifications
You must be signed in to change notification settings - Fork 1
/
jsc.go
80 lines (72 loc) · 2.26 KB
/
jsc.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package webkitgtk
import (
"errors"
"github.com/ebitengine/purego"
)
// TODO: check for memory leaks in jsc.go
func (w *Window) JSPromise(js string, fn func(interface{})) func() {
js = "return new Promise((resolve, reject) => { \n" + js + "\n });"
return w.JSCall(js, fn)
}
func (w *Window) JSCall(js string, fn func(interface{})) func() {
cancelable := lib.g.CancellableNew()
lib.webkit.WebViewCallAsyncJavascriptFunction(
w.webview, js, len(js), 0, 0, 0, cancelable,
ptr(purego.NewCallback(func(webview webviewPtr, result ptr) {
var gErr *gError
jsc := lib.webkit.WebViewCallAsyncJavascriptFunctionFinish(webview, result, gErr)
fn(parseJSC(jsc, cancelable, gErr))
//lib.webkit.JavascriptResultUnref(result)
})), 0)
return func() {
lib.g.CancellableCancel(cancelable)
}
}
func (w *Window) JSEval(js string, fn func(interface{})) func() {
cancelable := lib.g.CancellableNew()
lib.webkit.WebViewEvaluateJavascript(
w.webview, js, len(js), 0, 0, cancelable,
ptr(purego.NewCallback(func(webview webviewPtr, result ptr) {
var gErr *gError
jsc := lib.webkit.WebViewEvaluateJavascriptFinish(webview, result, gErr)
fn(parseJSC(jsc, cancelable, gErr))
//lib.webkit.JavascriptResultUnref(result)
})), 0)
return func() {
lib.g.CancellableCancel(cancelable)
}
}
type JSObject struct {
pointer ptr
}
func (jso *JSObject) Get(name string) interface{} {
value := lib.jsc.ValueObjectGetProperty(jso.pointer, name)
return parseJSC(value, 0, nil)
}
func parseJSC(value ptr, cancelable ptr, gErr *gError) interface{} {
if value == 0 {
if lib.g.CancellableIsCancelled(cancelable) {
return errors.New("call canceled")
}
err := errors.New("call error")
if gErr != nil {
err = gErr.toError(err.Error())
lib.g.ErrorFree(gErr)
}
return err
}
exception := lib.jsc.ContextGetException(lib.jsc.ValueGetContext(value))
if exception != 0 {
return errors.New(lib.jsc.ExceptionGetMessage(exception))
}
if lib.jsc.ValueIsNumber(value) {
return lib.jsc.ValueToDouble(value)
} else if lib.jsc.ValueIsBoolean(value) {
return lib.jsc.ValueToBoolean(value)
} else if lib.jsc.ValueIsString(value) {
return lib.jsc.ValueToString(value)
} else if lib.jsc.ValueIsObject(value) {
return &JSObject{value}
}
return errors.New("jscToValue: unknown type")
}