Skip to content

Commit

Permalink
v2: add support for Go 1.14
Browse files Browse the repository at this point in the history
The syscall/js API has changed in Go 1.14 as described
at https://golang.org/doc/go1.14#wasm.
Start using it, but keep compatibility for Go 1.13 and older
by making copies of .go files and using build constraints.

Fixes #74.

Co-authored-by: Dmitri Shuralyov <dmitri@shuralyov.com>
GitHub-Pull-Request: #69
  • Loading branch information
inliquid and dmitshur authored May 4, 2020
1 parent ebc4cf9 commit 2e7dad8
Show file tree
Hide file tree
Showing 4 changed files with 3,858 additions and 133 deletions.
173 changes: 87 additions & 86 deletions v2/dom.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// +build js
// +build go1.14

// Package dom provides Go bindings for the JavaScript DOM APIs.
//
Expand Down Expand Up @@ -118,7 +119,7 @@ import (
// toString returns the string representation of o. If o is nil or
// undefined, the empty string will be returned instead.
func toString(o js.Value) string {
if o == js.Null() || o == js.Undefined() {
if o.IsNull() || o.IsUndefined() {
return ""
}
return o.String()
Expand All @@ -141,7 +142,7 @@ func callRecover(o js.Value, fn string, args ...interface{}) (err error) {
}

func elementConstructor(o js.Value) js.Value {
if n := o.Get("node"); n != js.Undefined() {
if n := o.Get("node"); !n.IsUndefined() {
// Support elements wrapped in Polymer's DOM APIs.
return n.Get("constructor")
}
Expand All @@ -157,7 +158,7 @@ func arrayToObjects(o js.Value) []js.Value {
}

func nodeListToObjects(o js.Value) []js.Value {
if o.Get("constructor") == js.Global().Get("Array") {
if o.Get("constructor").Equal(js.Global().Get("Array")) {
// Support Polymer's DOM APIs, which uses Arrays instead of
// NodeLists
return arrayToObjects(o)
Expand Down Expand Up @@ -215,192 +216,192 @@ func WrapHTMLElement(o js.Value) HTMLElement {
}

func wrapDocument(o js.Value) Document {
switch elementConstructor(o) {
case js.Global().Get("HTMLDocument"):
switch c := elementConstructor(o); {
case c.Equal(js.Global().Get("HTMLDocument")):
return &htmlDocument{&document{&BasicNode{o}}}
default:
return &document{&BasicNode{o}}
}
}

func wrapDocumentFragment(o js.Value) DocumentFragment {
switch elementConstructor(o) {
switch /*c := elementConstructor(o);*/ {
// TODO: do we have any other stuff we want to check
default:
return &documentFragment{&BasicNode{o}}
}
}

func wrapNode(o js.Value) Node {
if o == js.Null() || o == js.Undefined() {
if o.IsNull() || o.IsUndefined() {
return nil
}
switch elementConstructor(o) {
switch c := elementConstructor(o); {
// TODO all the non-element cases
case js.Global().Get("Text"):
case c.Equal(js.Global().Get("Text")):
return Text{&BasicNode{o}}
default:
return wrapElement(o)
}
}

func wrapElement(o js.Value) Element {
if o == js.Null() || o == js.Undefined() {
if o.IsNull() || o.IsUndefined() {
return nil
}
switch elementConstructor(o) {
switch /*c := elementConstructor(o);*/ {
// TODO all the non-HTML cases
default:
return wrapHTMLElement(o)
}
}

func wrapHTMLElement(o js.Value) HTMLElement {
if o == js.Null() || o == js.Undefined() {
if o.IsNull() || o.IsUndefined() {
return nil
}
el := &BasicHTMLElement{&BasicElement{&BasicNode{o}}}
c := elementConstructor(o)
switch c {
case js.Global().Get("HTMLAnchorElement"):
switch {
case c.Equal(js.Global().Get("HTMLAnchorElement")):
return &HTMLAnchorElement{BasicHTMLElement: el, URLUtils: &URLUtils{Value: o}}
case js.Global().Get("HTMLAppletElement"):
case c.Equal(js.Global().Get("HTMLAppletElement")):
return &HTMLAppletElement{BasicHTMLElement: el}
case js.Global().Get("HTMLAreaElement"):
case c.Equal(js.Global().Get("HTMLAreaElement")):
return &HTMLAreaElement{BasicHTMLElement: el, URLUtils: &URLUtils{Value: o}}
case js.Global().Get("HTMLAudioElement"):
case c.Equal(js.Global().Get("HTMLAudioElement")):
return &HTMLAudioElement{HTMLMediaElement: &HTMLMediaElement{BasicHTMLElement: el}}
case js.Global().Get("HTMLBaseElement"):
case c.Equal(js.Global().Get("HTMLBaseElement")):
return &HTMLBaseElement{BasicHTMLElement: el}
case js.Global().Get("HTMLBodyElement"):
case c.Equal(js.Global().Get("HTMLBodyElement")):
return &HTMLBodyElement{BasicHTMLElement: el}
case js.Global().Get("HTMLBRElement"):
case c.Equal(js.Global().Get("HTMLBRElement")):
return &HTMLBRElement{BasicHTMLElement: el}
case js.Global().Get("HTMLButtonElement"):
case c.Equal(js.Global().Get("HTMLButtonElement")):
return &HTMLButtonElement{BasicHTMLElement: el}
case js.Global().Get("HTMLCanvasElement"):
case c.Equal(js.Global().Get("HTMLCanvasElement")):
return &HTMLCanvasElement{BasicHTMLElement: el}
case js.Global().Get("HTMLDataElement"):
case c.Equal(js.Global().Get("HTMLDataElement")):
return &HTMLDataElement{BasicHTMLElement: el}
case js.Global().Get("HTMLDataListElement"):
case c.Equal(js.Global().Get("HTMLDataListElement")):
return &HTMLDataListElement{BasicHTMLElement: el}
case js.Global().Get("HTMLDirectoryElement"):
case c.Equal(js.Global().Get("HTMLDirectoryElement")):
return &HTMLDirectoryElement{BasicHTMLElement: el}
case js.Global().Get("HTMLDivElement"):
case c.Equal(js.Global().Get("HTMLDivElement")):
return &HTMLDivElement{BasicHTMLElement: el}
case js.Global().Get("HTMLDListElement"):
case c.Equal(js.Global().Get("HTMLDListElement")):
return &HTMLDListElement{BasicHTMLElement: el}
case js.Global().Get("HTMLEmbedElement"):
case c.Equal(js.Global().Get("HTMLEmbedElement")):
return &HTMLEmbedElement{BasicHTMLElement: el}
case js.Global().Get("HTMLFieldSetElement"):
case c.Equal(js.Global().Get("HTMLFieldSetElement")):
return &HTMLFieldSetElement{BasicHTMLElement: el}
case js.Global().Get("HTMLFontElement"):
case c.Equal(js.Global().Get("HTMLFontElement")):
return &HTMLFontElement{BasicHTMLElement: el}
case js.Global().Get("HTMLFormElement"):
case c.Equal(js.Global().Get("HTMLFormElement")):
return &HTMLFormElement{BasicHTMLElement: el}
case js.Global().Get("HTMLFrameElement"):
case c.Equal(js.Global().Get("HTMLFrameElement")):
return &HTMLFrameElement{BasicHTMLElement: el}
case js.Global().Get("HTMLFrameSetElement"):
case c.Equal(js.Global().Get("HTMLFrameSetElement")):
return &HTMLFrameSetElement{BasicHTMLElement: el}
case js.Global().Get("HTMLHeadElement"):
case c.Equal(js.Global().Get("HTMLHeadElement")):
return &HTMLHeadElement{BasicHTMLElement: el}
case js.Global().Get("HTMLHeadingElement"):
case c.Equal(js.Global().Get("HTMLHeadingElement")):
return &HTMLHeadingElement{BasicHTMLElement: el}
case js.Global().Get("HTMLHtmlElement"):
case c.Equal(js.Global().Get("HTMLHtmlElement")):
return &HTMLHtmlElement{BasicHTMLElement: el}
case js.Global().Get("HTMLHRElement"):
case c.Equal(js.Global().Get("HTMLHRElement")):
return &HTMLHRElement{BasicHTMLElement: el}
case js.Global().Get("HTMLIFrameElement"):
case c.Equal(js.Global().Get("HTMLIFrameElement")):
return &HTMLIFrameElement{BasicHTMLElement: el}
case js.Global().Get("HTMLImageElement"):
case c.Equal(js.Global().Get("HTMLImageElement")):
return &HTMLImageElement{BasicHTMLElement: el}
case js.Global().Get("HTMLInputElement"):
case c.Equal(js.Global().Get("HTMLInputElement")):
return &HTMLInputElement{BasicHTMLElement: el}
case js.Global().Get("HTMLKeygenElement"):
case c.Equal(js.Global().Get("HTMLKeygenElement")):
return &HTMLKeygenElement{BasicHTMLElement: el}
case js.Global().Get("HTMLLabelElement"):
case c.Equal(js.Global().Get("HTMLLabelElement")):
return &HTMLLabelElement{BasicHTMLElement: el}
case js.Global().Get("HTMLLegendElement"):
case c.Equal(js.Global().Get("HTMLLegendElement")):
return &HTMLLegendElement{BasicHTMLElement: el}
case js.Global().Get("HTMLLIElement"):
case c.Equal(js.Global().Get("HTMLLIElement")):
return &HTMLLIElement{BasicHTMLElement: el}
case js.Global().Get("HTMLLinkElement"):
case c.Equal(js.Global().Get("HTMLLinkElement")):
return &HTMLLinkElement{BasicHTMLElement: el}
case js.Global().Get("HTMLMapElement"):
case c.Equal(js.Global().Get("HTMLMapElement")):
return &HTMLMapElement{BasicHTMLElement: el}
case js.Global().Get("HTMLMediaElement"):
case c.Equal(js.Global().Get("HTMLMediaElement")):
return &HTMLMediaElement{BasicHTMLElement: el}
case js.Global().Get("HTMLMenuElement"):
case c.Equal(js.Global().Get("HTMLMenuElement")):
return &HTMLMenuElement{BasicHTMLElement: el}
case js.Global().Get("HTMLMetaElement"):
case c.Equal(js.Global().Get("HTMLMetaElement")):
return &HTMLMetaElement{BasicHTMLElement: el}
case js.Global().Get("HTMLMeterElement"):
case c.Equal(js.Global().Get("HTMLMeterElement")):
return &HTMLMeterElement{BasicHTMLElement: el}
case js.Global().Get("HTMLModElement"):
case c.Equal(js.Global().Get("HTMLModElement")):
return &HTMLModElement{BasicHTMLElement: el}
case js.Global().Get("HTMLObjectElement"):
case c.Equal(js.Global().Get("HTMLObjectElement")):
return &HTMLObjectElement{BasicHTMLElement: el}
case js.Global().Get("HTMLOListElement"):
case c.Equal(js.Global().Get("HTMLOListElement")):
return &HTMLOListElement{BasicHTMLElement: el}
case js.Global().Get("HTMLOptGroupElement"):
case c.Equal(js.Global().Get("HTMLOptGroupElement")):
return &HTMLOptGroupElement{BasicHTMLElement: el}
case js.Global().Get("HTMLOptionElement"):
case c.Equal(js.Global().Get("HTMLOptionElement")):
return &HTMLOptionElement{BasicHTMLElement: el}
case js.Global().Get("HTMLOutputElement"):
case c.Equal(js.Global().Get("HTMLOutputElement")):
return &HTMLOutputElement{BasicHTMLElement: el}
case js.Global().Get("HTMLParagraphElement"):
case c.Equal(js.Global().Get("HTMLParagraphElement")):
return &HTMLParagraphElement{BasicHTMLElement: el}
case js.Global().Get("HTMLParamElement"):
case c.Equal(js.Global().Get("HTMLParamElement")):
return &HTMLParamElement{BasicHTMLElement: el}
case js.Global().Get("HTMLPreElement"):
case c.Equal(js.Global().Get("HTMLPreElement")):
return &HTMLPreElement{BasicHTMLElement: el}
case js.Global().Get("HTMLProgressElement"):
case c.Equal(js.Global().Get("HTMLProgressElement")):
return &HTMLProgressElement{BasicHTMLElement: el}
case js.Global().Get("HTMLQuoteElement"):
case c.Equal(js.Global().Get("HTMLQuoteElement")):
return &HTMLQuoteElement{BasicHTMLElement: el}
case js.Global().Get("HTMLScriptElement"):
case c.Equal(js.Global().Get("HTMLScriptElement")):
return &HTMLScriptElement{BasicHTMLElement: el}
case js.Global().Get("HTMLSelectElement"):
case c.Equal(js.Global().Get("HTMLSelectElement")):
return &HTMLSelectElement{BasicHTMLElement: el}
case js.Global().Get("HTMLSourceElement"):
case c.Equal(js.Global().Get("HTMLSourceElement")):
return &HTMLSourceElement{BasicHTMLElement: el}
case js.Global().Get("HTMLSpanElement"):
case c.Equal(js.Global().Get("HTMLSpanElement")):
return &HTMLSpanElement{BasicHTMLElement: el}
case js.Global().Get("HTMLStyleElement"):
case c.Equal(js.Global().Get("HTMLStyleElement")):
return &HTMLStyleElement{BasicHTMLElement: el}
case js.Global().Get("HTMLTableElement"):
case c.Equal(js.Global().Get("HTMLTableElement")):
return &HTMLTableElement{BasicHTMLElement: el}
case js.Global().Get("HTMLTableCaptionElement"):
case c.Equal(js.Global().Get("HTMLTableCaptionElement")):
return &HTMLTableCaptionElement{BasicHTMLElement: el}
case js.Global().Get("HTMLTableCellElement"):
case c.Equal(js.Global().Get("HTMLTableCellElement")):
return &HTMLTableCellElement{BasicHTMLElement: el}
case js.Global().Get("HTMLTableDataCellElement"):
case c.Equal(js.Global().Get("HTMLTableDataCellElement")):
return &HTMLTableDataCellElement{BasicHTMLElement: el}
case js.Global().Get("HTMLTableHeaderCellElement"):
case c.Equal(js.Global().Get("HTMLTableHeaderCellElement")):
return &HTMLTableHeaderCellElement{BasicHTMLElement: el}
case js.Global().Get("HTMLTableColElement"):
case c.Equal(js.Global().Get("HTMLTableColElement")):
return &HTMLTableColElement{BasicHTMLElement: el}
case js.Global().Get("HTMLTableRowElement"):
case c.Equal(js.Global().Get("HTMLTableRowElement")):
return &HTMLTableRowElement{BasicHTMLElement: el}
case js.Global().Get("HTMLTableSectionElement"):
case c.Equal(js.Global().Get("HTMLTableSectionElement")):
return &HTMLTableSectionElement{BasicHTMLElement: el}
case js.Global().Get("HTMLTemplateElement"):
case c.Equal(js.Global().Get("HTMLTemplateElement")):
return &HTMLTemplateElement{BasicHTMLElement: el}
case js.Global().Get("HTMLTextAreaElement"):
case c.Equal(js.Global().Get("HTMLTextAreaElement")):
return &HTMLTextAreaElement{BasicHTMLElement: el}
case js.Global().Get("HTMLTimeElement"):
case c.Equal(js.Global().Get("HTMLTimeElement")):
return &HTMLTimeElement{BasicHTMLElement: el}
case js.Global().Get("HTMLTitleElement"):
case c.Equal(js.Global().Get("HTMLTitleElement")):
return &HTMLTitleElement{BasicHTMLElement: el}
case js.Global().Get("HTMLTrackElement"):
case c.Equal(js.Global().Get("HTMLTrackElement")):
return &HTMLTrackElement{BasicHTMLElement: el}
case js.Global().Get("HTMLUListElement"):
case c.Equal(js.Global().Get("HTMLUListElement")):
return &HTMLUListElement{BasicHTMLElement: el}
case js.Global().Get("HTMLUnknownElement"):
case c.Equal(js.Global().Get("HTMLUnknownElement")):
return &HTMLUnknownElement{BasicHTMLElement: el}
case js.Global().Get("HTMLVideoElement"):
case c.Equal(js.Global().Get("HTMLVideoElement")):
return &HTMLVideoElement{HTMLMediaElement: &HTMLMediaElement{BasicHTMLElement: el}}
case js.Global().Get("HTMLElement"):
case c.Equal(js.Global().Get("HTMLElement")):
return el
default:
return el
Expand Down Expand Up @@ -470,7 +471,7 @@ func (tl *TokenList) String() string {
if tl.sa != "" {
return tl.o.Get(tl.sa).String()
}
if tl.dtl.Get("constructor") == js.Global().Get("DOMSettableTokenList") {
if tl.dtl.Get("constructor").Equal(js.Global().Get("DOMSettableTokenList")) {
return tl.dtl.Get("value").String()
}
// We could manually construct the string, but I am not aware of
Expand All @@ -495,7 +496,7 @@ func (tl *TokenList) SetString(s string) {
tl.o.Set(tl.sa, s)
return
}
if tl.dtl.Get("constructor") == js.Global().Get("DOMSettableTokenList") {
if tl.dtl.Get("constructor").Equal(js.Global().Get("DOMSettableTokenList")) {
tl.dtl.Set("value", s)
return
}
Expand Down Expand Up @@ -1654,7 +1655,7 @@ func (e *BasicHTMLElement) Dataset() map[string]string {

// jsKeys returns the keys of the given JavaScript object.
func jsKeys(o js.Value) []string {
if o == js.Null() || o == js.Undefined() {
if o.IsNull() || o.IsUndefined() {
return nil
}
a := js.Global().Get("Object").Call("keys", o)
Expand Down
Loading

0 comments on commit 2e7dad8

Please sign in to comment.