Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does Awesomium allow me to call/use C++ variables/methods in JS?

Awesomium easily allows for C++ code to call Javascript methods, but I haven't found a definite answer as to if it can do the opposite. This site seems to say that you can, but looking through the text and examples doesn't enlighten me.

So, I'm looking for a definite answer: can I call C++ variables/methods in my Javascript(Jquery), or not?

If you could include a simple example, that would be extremely appreciated as well.

Thank you!

like image 288
Briz Avatar asked Dec 09 '22 09:12

Briz


1 Answers

You definitely can-- you'll just need to build an extra layer on top of WebView::setObjectCallback and WebViewListener::onCallback using delegates/function-pointers.

I wrote a quick JSDelegate.h class (view it here) that you can use to hookup "onCallback" events directly to C++ member functions.

The basic idea is to maintain a mapping of callback names to delegates:

typedef std::map<std::wstring, Awesomium::JSDelegate> DelegateMap;
DelegateMap _delegateMap;

And call the corresponding function from your WebViewListener::onCallback:

void MyListener::onCallback(Awesomium::WebView* caller, const std::wstring& objectName, 
    const std::wstring& callbackName, const Awesomium::JSArguments& args)
{
    DelegateMap::iterator i = _delegateMap.find(callbackName);

    if(i != _delegateMap.end())
        i->second(caller, args);
}

And then, each time you wish to bind a specific C++ function, you would do it like so:

// Member function we wish to bind, must have this signature for JSDelegate
void MyClass::myFunction(Awesomium::WebView* caller, const Awesomium::JSArguments& args)
{
    // handle args here
}

// Instantiate MyClass instance in C++
MyClass* myClass = new MyClass();

// Create corresponding 'MyClass' object in Javascript
webView->createObject(L"MyClass");

// Do the following for each member function:    
// Bind MyClass::myFunction delegate to MyClass.myFunction in JS
_delegateMap[L"myFunction"] = Awesomium::JSDelegate(myClass, &MyClass::myFunction);
webView->setObjectCallback(L"MyClass", L"myFunction");

Then, you should be able to call MyClass::myFunction directly from Javascript like so:

MyClass.myFunction("foo", 1, 2 3)

Hope this helps! I haven't tested any of the code but I wrote it with Awesomium v1.6 RC4 SDK in mind.

like image 185
Adam Avatar answered Dec 11 '22 22:12

Adam