<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>... reposting, forgot to send this from my webkit email address (moderators can ignore the rejected posting)...</div><div><br></div>I'm not positive this is the best way, but this is the way we implemented augmenting the JavaScript context...<div><br></div><div>We declare a "Bar" function for the object's "bar" function and create two structs to describe the "foo" object and it's properties.<br><div><br></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span style="color: rgb(170, 13, 145); ">static</span> <span style="color: rgb(63, 110, 116); ">JSValueRef</span> Bar(JSContextRef ctx, JSObjectRef <span style="color: rgb(0, 116, 0); ">/*function*/</span>, JSObjectRef thisObject, <span style="color: rgb(92, 38, 153); ">size_t</span> argumentCount, <span style="color: rgb(170, 13, 145); ">const</span> <span style="color: rgb(63, 110, 116); ">JSValueRef</span> arguments[], <span style="color: rgb(63, 110, 116); ">JSValueRef</span>* <span style="color: rgb(92, 38, 153); ">exception</span>);</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">        </span><span style="color: rgb(170, 13, 145); ">static</span> JSStaticFunction <span style="color: rgb(63, 110, 116); ">sFooStaticFunctions</span>[] = {</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">                </span>{ <span style="color: rgb(196, 26, 22); ">"bar"</span>, Bar, kJSPropertyAttributeNone },</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">                </span>{ <span style="color: rgb(28, 0, 207); ">0</span>, <span style="color: rgb(28, 0, 207); ">0</span>, <span style="color: rgb(28, 0, 207); ">0</span> }</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">        </span>};</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; min-height: 14px; "><span class="Apple-tab-span" style="white-space: pre; ">        </span><br class="webkit-block-placeholder"></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">        </span>JSClassDefinition <span style="color: rgb(63, 110, 116); ">fooDef</span> = {</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">                </span><span style="color: rgb(28, 0, 207); ">0</span>, kJSClassAttributeNone, <span style="color: rgb(196, 26, 22); ">"foo"</span>, <span style="color: rgb(28, 0, 207); ">0</span>, </div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(0, 116, 0); "><span style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; ">                </span></span><span style="color: rgb(28, 0, 207); ">0</span><span style="color: rgb(0, 0, 0); ">, </span>// currently no foo properties... </div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(63, 110, 116); "><span style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; ">                </span></span>sFooStaticFunctions<span style="color: rgb(0, 0, 0); ">,</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(0, 116, 0); "><span style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; ">                </span></span><span style="color: rgb(28, 0, 207); ">0</span><span style="color: rgb(0, 0, 0); ">, </span>// Initialize</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(0, 116, 0); "><span style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; ">                </span></span><span style="color: rgb(28, 0, 207); ">0</span><span style="color: rgb(0, 0, 0); ">, </span>// Finalize</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(0, 116, 0); "><span style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; ">                </span></span><span style="color: rgb(28, 0, 207); ">0</span><span style="color: rgb(0, 0, 0); ">, </span>// has Property</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(0, 116, 0); "><span style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; ">                </span></span><span style="color: rgb(28, 0, 207); ">0</span><span style="color: rgb(0, 0, 0); ">, </span>// get Property </div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; color: rgb(0, 116, 0); "><span style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; ">                </span></span><span style="color: rgb(28, 0, 207); ">0</span><span style="color: rgb(0, 0, 0); ">, </span>// set Property callback...</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">                </span><span style="color: rgb(28, 0, 207); ">0</span>, <span style="color: rgb(28, 0, 207); ">0</span>, <span style="color: rgb(28, 0, 207); ">0</span>, <span style="color: rgb(28, 0, 207); ">0</span>, <span style="color: rgb(28, 0, 207); ">0</span>, <span style="color: rgb(28, 0, 207); ">0</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">        </span>};</div><div><font class="Apple-style-span" face="Monaco" size="2"><br></font></div><div>Here's a simple Bar function that just does a printf()</div><div><font class="Apple-style-span" face="Monaco" size="2"><br></font></div><div><font class="Apple-style-span" face="Monaco" size="2"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span style="color: rgb(170, 13, 145); ">static</span> <span style="color: rgb(63, 110, 116); ">JSValueRef</span> Bar(JSContextRef <span style="color: rgb(63, 110, 116); ">context</span>, JSObjectRef object, JSStringRef propertyName, <span style="color: rgb(63, 110, 116); ">JSValueRef</span>* <span style="color: rgb(92, 38, 153); ">exception</span>)</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; ">{</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-style-span" style="color: rgb(196, 26, 22); "><span style="color: rgb(0, 0, 0); "><span class="Apple-tab-span" style="white-space: pre; ">        </span></span><span style="color: rgb(46, 13, 110); ">printf</span><span style="color: rgb(0, 0, 0); ">(</span>"Bar Called\n"<span style="color: rgb(0, 0, 0); ">);</span></span></div><div><span style="color: rgb(170, 13, 145); "><span class="Apple-tab-span" style="white-space: pre; "><font class="Apple-style-span" color="#000000">        </font></span>return</span> JSValueMakeUndefined(<span style="color: rgb(63, 110, 116); ">context</span>);</div><div>}</div></font></div><div><font class="Apple-style-span" face="Monaco" size="2"><br></font></div><div>Then we wait until we get the didFinishDocumentLoad notification (which occurs after the document is loaded, but before the OnLoad() handlers are called in JavaScript).</div><div><br></div><div>Then we register our object in the global context...</div><div><br></div><div><font class="Apple-style-span" face="Monaco" size="2"><br></font></div><div><font class="Apple-style-span" face="Monaco" size="2"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">        </span><span style="color: rgb(92, 38, 153); ">Frame</span>* coreFrame;</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">        </span><span style="color: rgb(92, 38, 153); ">WebFrame</span>* targetFrame; <span class="Apple-style-span" style="color: rgb(0, 116, 0); ">// Make sure to set this from the loading client</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">        </span>coreFrame = core(targetFrame);</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">        </span>JSContextRef scriptCtx;</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">        </span>scriptCtx = toRef(coreFrame-><span style="color: rgb(92, 38, 153); ">script</span>()-><span style="color: rgb(46, 13, 110); ">globalObject</span>()->globalExec());</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; min-height: 14px; "><span class="Apple-tab-span" style="white-space: pre; ">        </span><br class="webkit-block-placeholder"></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">        </span>JSObjectRef global = JSContextGetGlobalObject(scriptCtx);</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-style-span" style="white-space: pre; ">        </span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">        </span>JSClassRef<span class="Apple-tab-span" style="white-space: pre; ">        </span>fooClass = JSClassCreate(fooDef);</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-style-span" style="white-space: pre; ">        </span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">        </span>JSObjectRef <span class="Apple-tab-span" style="white-space: pre; ">        </span>fooScriptObject = JSObjectMake(scriptCtx, fooClass, <span style="color: rgb(170, 13, 145); ">NULL</span>);</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-style-span" style="white-space: pre; ">        </span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 10px/normal Monaco; "><span class="Apple-tab-span" style="white-space: pre; ">        </span>JSObjectSetProperty(scriptCtx, global, jsStringRef(<span class="Apple-style-span" style="color: rgb(196, 26, 22); ">"foo"<span class="Apple-style-span" style="color: rgb(0, 0, 0); ">, fooScriptObject, kJSPropertyAttributeNone, <span style="color: rgb(28, 0, 207); ">0</span>);</span></span></div><div><br></div><div><br></div><div><font class="Apple-style-span" face="Helvetica" size="3">Most of this was stolen/figured-out from the testapi.c code and the InspectorController.cpp code. Within a JavaScript function in the page, you could now do "foo.bar()" to call the Bar() function.</font></div><div><font class="Apple-style-span" face="Helvetica" size="3"><br></font></div><div><font class="Apple-style-span" face="Helvetica" size="3">Feel free to point out things I've done wrong here.</font></div><div><font class="Apple-style-span" face="Helvetica" size="3"><br></font></div></font></div><div><br><div></div></div></div></div><div><div>On Jan 17, 2009, at 7:57 AM, <a href="mailto:webkitdev@aol.com">webkitdev@aol.com</a> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><font face="Arial, Helvetica, sans-serif">Hi,<br> <br> I am trying to extend the javascript to invoke custom C code in webkit. <br> Basically my requirement is to load a webpage that contains the UI built in Java script and on some user actions, I need to call C library functions on Linux. I looked at the testapi.c in API directory and added similar functions in GtkLauncher program(main.c) to add "MyObject". But when a I load a webpage containing "MyObject" I am getting error "ReferenceError: Can't find variable: MyObject". Then I copied the entire testapi.c into GtkLauncher main.c, replaced main() with test_main() and invoked the test_api() (along with a few tweaks for the header files .). This way I am able to get all the tests (testapi.js) succeed, but I am still getting the "ReferenceError". Looking at the code, I see that there is a context that is passed, which I believe is not passed to the webview. Is there a way in which I can use the same context as the webview and add my object?<br> <br> Regards,<br> WebK<br> </font><div id="MAILCIAMB023-5c394971ffea35" class="aol_ad_footer"><br><font style="color: black; font: normal 10pt ARIAL, SAN-SERIF;"><hr style="MARGIN-TOP: 10px">Which stars will make the biggest headlines in 2009? <a href="http://toolbar.aol.com/popeater/download.html?ncid=emlweusdown00000025">Get Hollywood predictions, celebrity holiday photos and more with the PopEater Toolbar</a>. </font></div><font style="color: black; font: normal 10pt ARIAL, SAN-SERIF;"> _______________________________________________<br>webkit-dev mailing list<br><a href="mailto:webkit-dev@lists.webkit.org">webkit-dev@lists.webkit.org</a><br>http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev<br></font></blockquote></div><br></body></html>