darwin-webkit

Crates.iodarwin-webkit
lib.rsdarwin-webkit
version0.2.0
sourcesrc
created_at2020-10-31 04:35:25.730006
updated_at2023-11-15 10:40:51.486723
descriptionBindings to some of the WebKit's API on MacOS for Rust
homepage
repositoryhttps://github.com/yamadapc/rust-darwin-webkit
max_upload_size
id307167
size211,285
Pedro Tacla Yamada (yamadapc)

documentation

README

rust-darwin-webkit

Crates.io


darwin_webkit exposes bindings to some of the WebKit's API on MacOS for Rust. It uses the objc and cocoa crates to bind with Objective-C.

This has not been tested properly yet.

Can be embedded onto audio plug-ins by getting the native webview handle and adding it to a plug-ins native NSWindowView handle.

Closure captures are unsafe as we'll just pass pointers around.

Install

cargo add darwin-webkit

Example

extern crate cocoa;
extern crate darwin_webkit;

use darwin_webkit::helpers::dwk_app::DarwinWKApp;

fn main() {
    unsafe {
        let app = DarwinWKApp::new("Simple WebView");
        let webview = app.create_webview();
        webview.load_url("https://www.google.com.br");
        app.set_webview(&webview);
        app.run();
    }
}

Communication example

extern crate cocoa;
extern crate darwin_webkit;

use cocoa::base::id;
use darwin_webkit::helpers::dwk_app::DarwinWKApp;
use std::rc::Rc;

fn main() {
    unsafe {
        let app = DarwinWKApp::new("Host an app");
        let webview = Rc::new(app.create_webview());

        let callback = Box::into_raw(Box::new(Box::new(|_: id, _: id| {
            println!("JavaScript called rust!");
            webview.evaluate_javascript("document.body.innerHTML += ' -> response from rust';");
        })));
        webview.add_message_handler("hello", callback);
        webview.load_html_string(
            "
            <script>
                document.body.innerHTML += 'start';
                window.webkit.messageHandlers.hello.postMessage('hello');
                document.body.innerHTML += ' -> success';
            </script>
            ",
            "",
        );

        app.set_webview(&webview);
        app.run();
    }
}

Missing

  • Callbacks from JavaScript to Rust.
  • TODOs in raw bindings
    • serverTrust in WKWebView
    • In NSURLRequest
      • Working with a Cache Policy
      • Accessing Request Components
      • Getting Header Fields
      • Controlling Request Behavior
      • Accessing the Service Type
      • Supporting Secure Coding
  • ...

Linting

cargo clippy
Commit count: 67

cargo fmt