Getting/Setting JavaScript variables with WebKit
July 10, 2007
Further progress on the WebKit front. I’m working with Kevin Ollivier, the author of wxWebKit, to put C++ to JavaScript utilities into the framework itself. Right now this is focused mostly on calling JavaScript functions from C++, and translating C++ values into JSValues, but I suspect other things will come from this as well.
For example, this weekend (along with some C++ interface structuring) I was looking at my JavaScript function calling code and found something. Specifically, how to get and set JavaScript variables from C++. Not exactly what I was looking for, but very useful none-the-less.
void PutJSValue**(const std::string& memberName,** KJS::JSValue* val**)**
{
WebCore::KJSProxy* js = m_frame->scriptProxy**();**
KJS::ScriptInterpreter* interp = js->interpreter**();**
KJS::ExecState* exec = interp->globalExec**();**
//TODO: error checking ASSERT(!exec->hadException());
KJS::JSLock lock**;**
//look up the object
KJS::JSValue* JSMemberName = KJS::jsString**(** memberName**.c_str()** **);**
KJS::Identifier identifier**(** JSMemberName->toString**(exec)** )****;
KJS::JSObject* rootObj = interp->globalObject**();**
rootObj->put**(exec,** identifier**,** val**);**
if ( exec->hadException**()** )
{
KJS::JSValue* theEx = exec->exception**();**
//TODO: figure out how to convert UString to a wxString
//use JSValue.toString() gives us a UString
throw RuntimeJSError**(“Error while setting value in JavaScript”)****;**
}
}
There are still some things to do, of course. First, the matter of capturing exception information from JavaScript. Secondly, I don’t know if this method supports setting object members: say window.document.baseURI
. I can access window.something
, but I don’t know about anything more complex. Right now I’m not going to worry about it.
Next up: converting C++ values into JavaScript values (and back). Someday I will get to calling C++ functions from JavaScript…