Skip to content

Commit 58c61c1

Browse files
committed
refactor: Auto generate event JS wrappers
1 parent 197d7d9 commit 58c61c1

File tree

13 files changed

+147
-109
lines changed

13 files changed

+147
-109
lines changed

internal/code-gen/script-wrappers/configuration/dom_configuration.go

+27
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ package configuration
33
func ConfigureDOMSpecs(specs *WebIdlConfigurations) {
44
domSpecs := specs.Module("dom")
55
domSpecs.SetMultipleFiles(true)
6+
configureDOMNode(domSpecs)
7+
configureDOMEvent(domSpecs)
8+
}
9+
10+
func configureDOMNode(domSpecs *WebIdlConfiguration) {
611
domNode := domSpecs.Type("Node")
712
domNode.Method("nodeType").SetCustomImplementation()
813
domNode.Method("getRootNode").Argument("options").SetHasDefault()
@@ -21,5 +26,27 @@ func ConfigureDOMSpecs(specs *WebIdlConfigurations) {
2126
domNode.Method("parentNode").Ignore()
2227
domNode.Method("lastChild").Ignore()
2328
domNode.Method("nodeValue").Ignore()
29+
}
2430

31+
func configureDOMEvent(domSpecs *WebIdlConfiguration) {
32+
event := domSpecs.Type("Event")
33+
event.SkipWrapper = true
34+
event.Method("type").SetCustomImplementation()
35+
event.Method("bubbles").SetCustomImplementation()
36+
event.Method("cancelable").SetCustomImplementation()
37+
event.Method("eventPhase").SetCustomImplementation()
38+
event.Method("constructor").Argument("eventInitDict").SetHasDefault()
39+
event.Method("initEvent").Ignore()
40+
event.Method("composed").Ignore()
41+
event.Method("composedPath").Ignore()
42+
event.Method("stopImmediatePropagation").Ignore()
43+
event.Method("isTrusted").Ignore()
44+
event.Method("CancelBubble").Ignore()
45+
event.Method("cancelBubble").Ignore()
46+
event.Method("TimeStamp").Ignore()
47+
event.Method("timeStamp").Ignore()
48+
event.Method("ReturnValue").Ignore()
49+
event.Method("returnValue").Ignore()
50+
event.Method("srcElement").Ignore()
51+
event.Method("defaultPrevented").Ignore()
2552
}

internal/code-gen/script-wrappers/configuration/v8_configuration.go

-18
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,6 @@ func CreateV8Specs() WebIdlConfigurations {
3636

3737
domSpecs := specs.Module("dom")
3838

39-
event := domSpecs.Type("Event")
40-
event.Method("eventPhase").SetCustomImplementation()
41-
42-
event.Method("constructor").Argument("eventInitDict").SetHasDefault()
43-
event.Method("initEvent").Ignore()
44-
event.Method("composed").Ignore()
45-
event.Method("composedPath").Ignore()
46-
event.Method("stopImmediatePropagation").Ignore()
47-
event.Method("isTrusted").Ignore()
48-
event.Method("CancelBubble").Ignore()
49-
event.Method("cancelBubble").Ignore()
50-
event.Method("TimeStamp").Ignore()
51-
event.Method("timeStamp").Ignore()
52-
event.Method("ReturnValue").Ignore()
53-
event.Method("returnValue").Ignore()
54-
event.Method("srcElement").Ignore()
55-
event.Method("defaultPrevented").Ignore()
56-
5739
parentNode := domSpecs.Type("ParentNode")
5840
parentNode.Method("children").Ignore()
5941
parentNode.Method("append").SetCustomImplementation()

internal/code-gen/script-wrappers/gojagen/functions.go

-1
This file was deleted.

internal/code-gen/script-wrappers/gojagen/generators.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func (gen GojaTargetGenerators) CreatePrototypeInitializerBody(
9595
for a := range data.AttributesToInstall() {
9696
var getter, setter g.Generator
9797
if a.Getter != nil {
98-
getter = vm.Field("ToValue").Call(receiver.Field(a.Getter.Name))
98+
getter = vm.Field("ToValue").Call(receiver.Field(a.Getter.CallbackMethodName()))
9999
} else {
100100
getter = g.Nil
101101
}
@@ -165,6 +165,7 @@ func (gen GojaTargetGenerators) CreateMethodCallbackBody(
165165

166166
} else {
167167
list.Append(instance.Field(UpperCaseFirstLetter(op.Name)).Call(argNames...))
168+
list.Append(g.Return(g.Nil))
168169
}
169170
}
170171
return list

internal/code-gen/script-wrappers/wrapper_struct_generator.go

-3
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ func (g WrapperStructGenerator) Generate() *jen.Statement {
2525

2626
func (g WrapperStructGenerator) WrappedType() Generator {
2727
idlInterfaceName := g.Data.Name()
28-
if idlInterfaceName == "Event" {
29-
return gen.NewType("eventWrapper")
30-
}
3128

3229
return gen.NewTypePackage(idlInterfaceName, g.Data.GetInternalPackage())
3330
}

scripting/gojahost/event.go

+30-25
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,9 @@ package gojahost
33
import (
44
g "github.com/dop251/goja"
55
"github.com/gost-dom/browser/dom/event"
6+
"github.com/gost-dom/browser/internal/entity"
67
)
78

8-
type eventWrapper struct {
9-
baseInstanceWrapper[*event.Event]
10-
}
11-
12-
func newEventWrapperAsWrapper(instance *GojaContext) wrapper { return newEventWrapper(instance) }
13-
func newEventWrapper(instance *GojaContext) eventWrapper {
14-
return eventWrapper{newBaseInstanceWrapper[*event.Event](instance)}
15-
}
16-
179
type gojaEvent[T event.Event] struct {
1810
Value *g.Object
1911
Event T
@@ -23,6 +15,14 @@ func toBoolean(value g.Value) bool {
2315
return value != nil && value.ToBoolean()
2416
}
2517

18+
type eventWrapper struct {
19+
baseInstanceWrapper[*event.Event]
20+
}
21+
22+
func newEventWrapper(instance *GojaContext) wrapper {
23+
return &eventWrapper{newBaseInstanceWrapper[*event.Event](instance)}
24+
}
25+
2626
func (w eventWrapper) constructor(call g.ConstructorCall, r *g.Runtime) *g.Object {
2727
arg1 := call.Argument(0).String()
2828
init := event.CustomEventInit{}
@@ -37,31 +37,36 @@ func (w eventWrapper) constructor(call g.ConstructorCall, r *g.Runtime) *g.Objec
3737
return nil
3838
}
3939

40-
func (w eventWrapper) PreventDefault(c g.FunctionCall) g.Value {
41-
w.getInstance(c).PreventDefault()
42-
return nil
40+
func (w eventWrapper) type_(c g.FunctionCall) g.Value {
41+
return w.ctx.vm.ToValue(w.getInstance(c).Type)
4342
}
4443

45-
func (w eventWrapper) GetType(c g.FunctionCall) g.Value {
46-
return w.ctx.vm.ToValue(w.getInstance(c).Type)
44+
func (w eventWrapper) cancelable(c g.FunctionCall) g.Value {
45+
return w.ctx.vm.ToValue(w.getInstance(c).Cancelable)
46+
}
47+
48+
func (w eventWrapper) bubbles(c g.FunctionCall) g.Value {
49+
return w.ctx.vm.ToValue(w.getInstance(c).Bubbles)
4750
}
4851

49-
func (w eventWrapper) initializePrototype(prototype *g.Object,
50-
vm *g.Runtime) {
51-
prototype.Set("preventDefault", w.PreventDefault)
52-
prototype.DefineAccessorProperty(
53-
"type",
54-
w.ctx.vm.ToValue(w.GetType),
55-
nil,
56-
g.FLAG_TRUE,
57-
g.FLAG_TRUE,
58-
)
52+
func (w eventWrapper) eventPhase(c g.FunctionCall) g.Value {
53+
return w.ctx.vm.ToValue(w.getInstance(c).EventPhase())
5954
}
6055

6156
type customEventWrapper struct {
6257
eventWrapper
6358
}
6459

6560
func newCustomEventWrapper(instance *GojaContext) wrapper {
66-
return customEventWrapper{newEventWrapper(instance)}
61+
return customEventWrapper{eventWrapper{newBaseInstanceWrapper[*event.Event](instance)}}
62+
}
63+
64+
func (w eventWrapper) toEventTarget(t event.EventTarget) g.Value {
65+
if t == nil {
66+
return nil
67+
}
68+
if ider, ok := t.(entity.ObjectIder); ok {
69+
return w.toNode(ider)
70+
}
71+
panic("TODO: Handle instances of non-entity events")
6772
}

scripting/gojahost/event_generated.go

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// This file is generated. Do not edit.
2+
3+
package gojahost
4+
5+
import (
6+
g "github.com/dop251/goja"
7+
log "github.com/gost-dom/browser/internal/log"
8+
)
9+
10+
func init() {
11+
installClass("Event", "", newEventWrapper)
12+
}
13+
14+
func (w eventWrapper) initializePrototype(prototype *g.Object, vm *g.Runtime) {
15+
prototype.Set("stopPropagation", w.stopPropagation)
16+
prototype.Set("preventDefault", w.preventDefault)
17+
prototype.DefineAccessorProperty("type", w.ctx.vm.ToValue(w.type_), nil, g.FLAG_TRUE, g.FLAG_TRUE)
18+
prototype.DefineAccessorProperty("target", w.ctx.vm.ToValue(w.target), nil, g.FLAG_TRUE, g.FLAG_TRUE)
19+
prototype.DefineAccessorProperty("currentTarget", w.ctx.vm.ToValue(w.currentTarget), nil, g.FLAG_TRUE, g.FLAG_TRUE)
20+
prototype.DefineAccessorProperty("eventPhase", w.ctx.vm.ToValue(w.eventPhase), nil, g.FLAG_TRUE, g.FLAG_TRUE)
21+
prototype.DefineAccessorProperty("bubbles", w.ctx.vm.ToValue(w.bubbles), nil, g.FLAG_TRUE, g.FLAG_TRUE)
22+
prototype.DefineAccessorProperty("cancelable", w.ctx.vm.ToValue(w.cancelable), nil, g.FLAG_TRUE, g.FLAG_TRUE)
23+
}
24+
25+
func (w eventWrapper) stopPropagation(c g.FunctionCall) g.Value {
26+
log.Debug(w.logger(c), "V8 Function call: Event.stopPropagation")
27+
instance := w.getInstance(c)
28+
instance.StopPropagation()
29+
return nil
30+
}
31+
32+
func (w eventWrapper) preventDefault(c g.FunctionCall) g.Value {
33+
log.Debug(w.logger(c), "V8 Function call: Event.preventDefault")
34+
instance := w.getInstance(c)
35+
instance.PreventDefault()
36+
return nil
37+
}
38+
39+
func (w eventWrapper) target(c g.FunctionCall) g.Value {
40+
log.Debug(w.logger(c), "V8 Function call: Event.target")
41+
instance := w.getInstance(c)
42+
result := instance.Target()
43+
return w.toEventTarget(result)
44+
}
45+
46+
func (w eventWrapper) currentTarget(c g.FunctionCall) g.Value {
47+
log.Debug(w.logger(c), "V8 Function call: Event.currentTarget")
48+
instance := w.getInstance(c)
49+
result := instance.CurrentTarget()
50+
return w.toEventTarget(result)
51+
}

scripting/gojahost/goja_host.go

-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ func init() {
5454
installClass("Window", "Node", newWindowWrapper)
5555
installClass("Document", "Node", newDocumentWrapper)
5656
installClass("HTMLDocument", "Document", newHTMLDocumentWrapper)
57-
installClass("Event", "", newEventWrapperAsWrapper)
5857
installClass("CustomEvent", "Event", newCustomEventWrapper)
5958
installClass("Element", "Node", newElementWrapper)
6059
installClass("HTMLElement", "Element", newGenericElementWrapper)

scripting/v8host/event.go

+34-16
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,16 @@ package v8host
33
import (
44
"github.com/gost-dom/browser/dom/event"
55
"github.com/gost-dom/browser/internal/entity"
6+
"github.com/gost-dom/browser/internal/log"
67
v8 "github.com/gost-dom/v8go"
78
)
89

9-
// the eventWrapper type is a temporary solution because the code generator
10-
// creates function calls, not field lookups.
11-
//
12-
// Once that if fixed, this type can be removed.
13-
type eventWrapper struct{ *event.Event }
14-
15-
func (w eventWrapper) Type() string {
16-
return w.Event.Type
17-
}
18-
func (w eventWrapper) Cancelable() bool {
19-
return w.Event.Cancelable
10+
type eventV8Wrapper struct {
11+
handleReffedObject[*event.Event]
2012
}
21-
func (w eventWrapper) Bubbles() bool {
22-
return w.Event.Bubbles
13+
14+
func newEventV8Wrapper(scriptHost *V8ScriptHost) *eventV8Wrapper {
15+
return &eventV8Wrapper{newHandleReffedObject[*event.Event](scriptHost)}
2316
}
2417

2518
func (w eventV8Wrapper) defaultEventInit() eventInitWrapper {
@@ -32,9 +25,7 @@ func (w eventV8Wrapper) CreateInstance(
3225
type_ string,
3326
o eventInitWrapper,
3427
) (*v8.Value, error) {
35-
e := eventWrapper{
36-
&event.Event{Type: type_, Bubbles: o.bubbles, Cancelable: o.cancelable, Data: o.init},
37-
}
28+
e := &event.Event{Type: type_, Bubbles: o.bubbles, Cancelable: o.cancelable, Data: o.init}
3829
return w.store(e, ctx, this)
3930
}
4031

@@ -58,3 +49,30 @@ func (w eventV8Wrapper) eventPhase(info *v8.FunctionCallbackInfo) (*v8.Value, er
5849
}
5950
return v8.NewValue(w.iso(), uint32(instance.EventPhase()))
6051
}
52+
53+
func (w eventV8Wrapper) type_(info *v8.FunctionCallbackInfo) (*v8.Value, error) {
54+
log.Debug(w.logger(info), "V8 Function call: Event.type")
55+
instance, err := w.getInstance(info)
56+
if err != nil {
57+
return nil, err
58+
}
59+
return v8.NewValue(w.iso(), instance.Type)
60+
}
61+
62+
func (w eventV8Wrapper) cancelable(info *v8.FunctionCallbackInfo) (*v8.Value, error) {
63+
log.Debug(w.logger(info), "V8 Function call: Event.cancelable")
64+
instance, err := w.getInstance(info)
65+
if err != nil {
66+
return nil, err
67+
}
68+
return v8.NewValue(w.iso(), instance.Cancelable)
69+
}
70+
71+
func (w eventV8Wrapper) bubbles(info *v8.FunctionCallbackInfo) (*v8.Value, error) {
72+
log.Debug(w.logger(info), "V8 Function call: Event.bubbles")
73+
instance, err := w.getInstance(info)
74+
if err != nil {
75+
return nil, err
76+
}
77+
return v8.NewValue(w.iso(), instance.Bubbles)
78+
}

scripting/v8host/event_generated.go

-41
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,6 @@ func init() {
1212
registerJSClass("Event", "", createEventPrototype)
1313
}
1414

15-
type eventV8Wrapper struct {
16-
handleReffedObject[eventWrapper]
17-
}
18-
19-
func newEventV8Wrapper(scriptHost *V8ScriptHost) *eventV8Wrapper {
20-
return &eventV8Wrapper{newHandleReffedObject[eventWrapper](scriptHost)}
21-
}
22-
2315
func createEventPrototype(scriptHost *V8ScriptHost) *v8.FunctionTemplate {
2416
iso := scriptHost.iso
2517
wrapper := newEventV8Wrapper(scriptHost)
@@ -98,17 +90,6 @@ func (w eventV8Wrapper) preventDefault(info *v8.FunctionCallbackInfo) (*v8.Value
9890
return nil, nil
9991
}
10092

101-
func (w eventV8Wrapper) type_(info *v8.FunctionCallbackInfo) (*v8.Value, error) {
102-
log.Debug(w.logger(info), "V8 Function call: Event.type")
103-
ctx := w.mustGetContext(info)
104-
instance, err := w.getInstance(info)
105-
if err != nil {
106-
return nil, err
107-
}
108-
result := instance.Type()
109-
return w.toDOMString(ctx, result)
110-
}
111-
11293
func (w eventV8Wrapper) target(info *v8.FunctionCallbackInfo) (*v8.Value, error) {
11394
log.Debug(w.logger(info), "V8 Function call: Event.target")
11495
ctx := w.mustGetContext(info)
@@ -130,25 +111,3 @@ func (w eventV8Wrapper) currentTarget(info *v8.FunctionCallbackInfo) (*v8.Value,
130111
result := instance.CurrentTarget()
131112
return w.toNullableEventTarget(ctx, result)
132113
}
133-
134-
func (w eventV8Wrapper) bubbles(info *v8.FunctionCallbackInfo) (*v8.Value, error) {
135-
log.Debug(w.logger(info), "V8 Function call: Event.bubbles")
136-
ctx := w.mustGetContext(info)
137-
instance, err := w.getInstance(info)
138-
if err != nil {
139-
return nil, err
140-
}
141-
result := instance.Bubbles()
142-
return w.toBoolean(ctx, result)
143-
}
144-
145-
func (w eventV8Wrapper) cancelable(info *v8.FunctionCallbackInfo) (*v8.Value, error) {
146-
log.Debug(w.logger(info), "V8 Function call: Event.cancelable")
147-
ctx := w.mustGetContext(info)
148-
instance, err := w.getInstance(info)
149-
if err != nil {
150-
return nil, err
151-
}
152-
result := instance.Cancelable()
153-
return w.toBoolean(ctx, result)
154-
}

scripting/v8host/event_target.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func (l v8EventListener) HandleEvent(e *event.Event) error {
2020
f, err := l.val.AsFunction()
2121
if err == nil {
2222
var event *v8.Value
23-
event, err = l.ctx.getInstanceForNode(eventWrapper{e})
23+
event, err = l.ctx.getInstanceForNode(e)
2424
if err == nil {
2525
_, err1 := f.Call(l.val, event)
2626
err2 := l.ctx.eventLoop.tick()

scripting/v8host/script_host.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (c *V8ScriptContext) getInstanceForNode(
9696
return v8.Null(iso), nil
9797
}
9898
switch n := node.(type) {
99-
case eventWrapper:
99+
case *event.Event:
100100
switch n.Data.(type) {
101101
case event.CustomEventInit:
102102
return c.getInstanceForNodeByName("CustomEvent", n)

scripting/v8host/xml_http_request.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func (xhr xmlHttpRequestV8Wrapper) CreateInstance(
5757
prop := "on" + event.Type
5858
handler, err := this.Get(prop)
5959
if err == nil && handler.IsFunction() {
60-
v8Event, err := ctx.getInstanceForNode(eventWrapper{event})
60+
v8Event, err := ctx.getInstanceForNode(event)
6161
if err == nil {
6262
f, _ := handler.AsFunction()
6363
f.Call(this, v8Event)

0 commit comments

Comments
 (0)