...
1 package playwright
2
3 import (
4 "log"
5 )
6
7 type bindingCallImpl struct {
8 channelOwner
9 }
10
11
12 type BindingSource struct {
13 Context BrowserContext
14 Page Page
15 Frame Frame
16 }
17
18
19 type ExposedFunction = func(args ...interface{}) interface{}
20
21
22 type BindingCallFunction func(source *BindingSource, args ...interface{}) interface{}
23
24 func (b *bindingCallImpl) Call(f BindingCallFunction) {
25 defer func() {
26 if r := recover(); r != nil {
27 if _, err := b.channel.Send("reject", map[string]interface{}{
28 "error": serializeError(r.(error)),
29 }); err != nil {
30 log.Printf("could not reject BindingCall: %v", err)
31 }
32 }
33 }()
34
35 frame := fromChannel(b.initializer["frame"]).(*frameImpl)
36 source := &BindingSource{
37 Context: frame.Page().Context(),
38 Page: frame.Page(),
39 Frame: frame,
40 }
41 var result interface{}
42 if handle, ok := b.initializer["handle"]; ok {
43 result = f(source, fromChannel(handle))
44 } else {
45 initializerArgs := b.initializer["args"].([]interface{})
46 funcArgs := []interface{}{}
47 for i := 0; i < len(initializerArgs); i++ {
48 funcArgs = append(funcArgs, parseResult(initializerArgs[i]))
49 }
50 result = f(source, funcArgs...)
51 }
52 _, err := b.channel.Send("resolve", map[string]interface{}{
53 "result": serializeArgument(result),
54 })
55 if err != nil {
56 log.Printf("could not resolve BindingCall: %v", err)
57 }
58 }
59
60 func newBindingCall(parent *channelOwner, objectType string, guid string, initializer map[string]interface{}) *bindingCallImpl {
61 bt := &bindingCallImpl{}
62 bt.createChannelOwner(bt, parent, objectType, guid, initializer)
63 return bt
64 }
65
View as plain text