Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DOMKit? #21

Closed
j-f1 opened this issue Jul 22, 2020 · 6 comments
Closed

DOMKit? #21

j-f1 opened this issue Jul 22, 2020 · 6 comments
Labels
enhancement New feature or request

Comments

@j-f1
Copy link
Member

j-f1 commented Jul 22, 2020

It would be great to have some sort of type-safe DOM API that better matches DOM as exposed to JS (for example document.querySelector('foo')?.appendChild(document.createElement('bar'))) without having to go through the ceremony of .object! and .function!. It looks like there’s some work in this direction in webidl2swift but I’m not sure how much more is needed.

@MaxDesiatov MaxDesiatov added the enhancement New feature or request label Jul 22, 2020
@MaxDesiatov
Copy link
Contributor

Generating the WebAPI module as described in the webidl2swift example worked for me, but they have a dependency on a fork of JavaScriptKit. I think upstreaming changes from that fork could be the first step.

@j-f1
Copy link
Member Author

j-f1 commented Aug 2, 2020

I tried to merge but it seems like they made a bunch of unrelated changes in the fork which seem vaguely like a good idea since they reduce memory usage (I think) and cut down on the number of arguments that need to be passed around on the JS side but that means it’s hard to extract just the new stuff

And of course this repo has changed a bunch too so there were a lot of conflicts and now it doesn’t build

This was referenced Aug 2, 2020
@j-f1
Copy link
Member Author

j-f1 commented Aug 4, 2020

I’ve got DOMKit building! (haven’t tried running it yet)

https://github.com/j-f1/DOMKit

let document = DOMKit.Document(jsValue: JSObjectRef.global.document)

let button = document.createElement(localName: "button")
button.textContent = "Hello, world"

class ClickListener: EventListener {
    required init(objectRef: JSObjectRef) {
        self.objectRef = objectRef
    }

    var objectRef: JSObjectRef
    static func canDecode(from jsValue: JSValue) -> Bool { false }
    func handleEvent(event: Event) {
        (event.target as? HTMLElement)?.textContent = "Clicked!"
    }
}

let emptyObject = JSObjectRef.global.Object.function!(.new)

button.addEventListener(type: "click", callback: ClickListener(objectRef: emptyObject))
_ = document.querySelector(selectors: "body")?.appendChild(node: button)

I’ll try it out tomorrow then clean up #26 so the commits are more meaningful.

@j-f1
Copy link
Member Author

j-f1 commented Aug 4, 2020

While this is a start, several changes are needed for a truly great native swift DOM API. We need to be able to modify the default function signatures to change or remove parameter names. Well some named parameters would be a great addition to the usability of the DOM API, I think that most of them provide little benefit. Dude also be great to extend the DON API with methods that make use of native Swift types and best practices. For example, options that are passed as an object in JavaScript could be expanded out to named parameters in Swift. It would also be good to allow passing Swift closures as an event handler, as the current way of creating a event handler object is extremely cumbersome.

I'm not sure if these additions should replace the current signatures or instead augment the current signatures — perhaps in a different file from the automatically generated bindings.

@j-f1
Copy link
Member Author

j-f1 commented Aug 15, 2020

With a ton of tweaks, I have got it working* again with perhaps fewer changes!

*I’m too scared to actually run it rn but it type checks!

@j-f1 j-f1 mentioned this issue Aug 16, 2020
@MaxDesiatov
Copy link
Contributor

Closing this as we got it working more or less, appropriate discussions should happen in the DOMKit repository https://github.com/swiftwasm/DOMKit

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants