How to call C# method in javascript by using GeckoFX as the wrapper of XULRunner

c#, geckofx, javascript

Solution

You can use a MessageEvent to invoke code in c#, but as far as I know you can't then return a string like you're wanting to. One of the unit tests demonstrates how to invoke the c# code:

[Test]
public void AddEventListener_JScriptFiresEvent_ListenerIsCalledWithMessage()
{
    string payload = null;

    browser.AddMessageEventListener("callMe", ((string p) => payload = p));

    browser.LoadHtml(
        @"<!DOCTYPE html>
                     <html><head>
                     <script type='text/javascript'>
                        window.onload= function() {
                            event = document.createEvent('MessageEvent');
                            var origin = window.location.protocol + '//' + window.location.host;
                            event.initMessageEvent ('callMe', true, true, 'some data', origin, 1234, window, null);
                            document.dispatchEvent (event);
                        }
                    </script>
                    </head><body></body></html>");

    browser.NavigateFinishedNotifier.BlockUntilNavigationFinished();
    Assert.AreEqual("some data", payload);
}

I know it's awkward, but you could then use a c#-->javascript call to get data back to javascript-land. See This Question for how to do that. So your javascript would first send this message to c# land, then it would get a callback with the string value you need.

Hope that helps.

Problem

I am using GeckoFX16 and xulrunner-16.0.2.en-US.win32 in my project. The thing is, I want to call a C# method in javascript. I am curious, is there a way to do this? Just like below: `C#` part: ``` private GeckoWebBrowser weBrowser; public browser() { InitializeComponent(); Gecko.Xpcom.Initialize("xulrunner"); weBrowser = new GeckoWebBrowser(); weBrowser.Parent = this; weBrowser.Dock = DockStyle.Fill; weBrowser.Navigate("test.html"); } public string loadData(){ //load data from local file. return str; } ``` `javascript` part: ``` <script type='text/javascript'> var data = window.loadData(); alert(data); </script> ``` I am new in this area, I’ll appreciate if it is possible!

Original source