sciter-sdk/rust-sciter

How to use `set_variable`?

thecodrr opened this issue · 8 comments

I tried doing this:

    window
        .set_variable("hello", Value::from("world"))
        .expect("Could not set variable.");

But I don't know how to retrieve the set variable. Window.this.hello and globalThis.hello both return undefined. Even get_variable returns undefined.

	// set the global to all windows
	if let Err(e) = sciter::set_variable("svglobal", Value::from("hello, globals")) {
		// ignore this
		eprintln!("sciter.set_variable: {:?}", e);
	}

	frame.load_html(html, Some("example://minimal.htm"));

	// set the global only for this window
	if let Err(e) = frame.set_variable("svdocument", Value::from("hello, document")) {
		eprintln!("frame.set_variable: {:?}", e);
	}
globalThis.svdocument;
globalThis.svglobal;

Also, ignore the first error: https://sciter.com/forums/topic/hruntimeset_global_variable-always-returns-false/

And get:

	println!("document: {:?}", frame.get_variable("svglobal"));
	println!("document: {:?}", frame.get_variable("svdocument"));
	println!("location: {:?}", frame.get_variable("location"));

	// doesn't work:
	println!("Window.this: {:?}", frame.get_variable("Window.this"));

Keep in mind that this API was introduced (yet disabled) in Sciter 4.4.4.6. but properly enabled only in 4.4.8.26.
Available in rust-sciter since 0.5.58, see 8507e91.

Tried doing as you suggested. No luck.

    sciter::set_library("./lib/libsciter-gtk.so").expect("Invalid library path.");

    println!("Version: {:?}", sciter::version());

    let mut frame = sciter::Window::new();
    // let mut root = frame.get_host().get_root().expect("hello");

    // set the global to all windows
    if let Err(e) = sciter::set_variable("svglobal", Value::from("hello, globals")) {
        // ignore this
        eprintln!("sciter.set_variable: {:?}", e);
    }

    frame.load_file("./host/main.htm");

    // set the global only for this window
    if let Err(e) = frame.set_variable("svdocument", Value::from("hello, document")) {
        eprintln!("frame.set_variable: {:?}", e);
    }

    println!("document: {:?}", frame.get_variable("svglobal"));
    println!("document: {:?}", frame.get_variable("svdocument"));
    println!("location: {:?}", frame.get_variable("location"));

    frame.run_app();

Result:

Version: "4.4.8.28"
INFO:TIS: HELLO!,undefined,undefined
frame.set_variable: ()
document: Err(())
document: Err(())
location: Err(())

The JS part:

console.log("HELLO!", globalThis.svdocument, globalThis.svglobal);

Edit: oh wait. From the output, i can see the variables are getting set after the initialization. Let me put this into an event handler.

From the output, i can see the variables are getting set after the initialization. Let me put this into an event handler

Well, on Windows load_file is synchronous, but it may differ on Linux. Any luck?

No, it's sync everywhere. The load_file function loads everything and since I am doing the console.log in a different script file which is then loaded from the main.htm file, it executes before everything else.

This is a good use case for the document_complete event handler. Is there a way to pass the frame to the EventHandler?

Okay, didn't work.

No idea why this is resulting in an error.

 // set the global only for this window
    if let Err(e) = frame.set_variable("svdocument", Value::from("hello, document")) {
        eprintln!("frame.set_variable: {:?}", e);
    }

Any way to see the error message?

Any way to see the error message?

Well, it does print something like "frame.set_variable: INVALID_PARAMETER". Nothing more: https://github.com/c-smile/sciter-js-sdk/blob/main/include/sciter-x-dom.h#L59-L79