[webkit-dev] Calling JavaScript function from within DumpRenderTree

2010-01-01 Thread Chris Fleizach
I need to have a layout test register a callback with DRT, then have that 
callback be called at the appropriate time (in order to test accessibility 
notifications)

I can't figure out the right incantations to do so. 

I'd like to do something like this in the LayoutTest

var addedNotification = liveRegion.addNotificationListener(ariaCallback);

then have a function in the test like

function ariaCallback(notification) {
   // do stuff with notification
}

DRT knows when to call this method, but I'm not sure how.. This is what I have 
so far, which does not work.

// The JavaScript callback we'll use when we get a notification
static JSStringRef AXNotificationFunctionCallback = 0;

static void _accessibilityNotificationCallback(id element, NSString* 
notification)
{
if (!AXNotificationFunctionCallback)
return;

JSObjectRef function = JSObjectMakeFunction([mainFrame globalContext], 
NULL, 0, NULL, AXNotificationFunctionCallback, NULL, 1, NULL);
JSValueRef argument = JSValueMakeString([mainFrame globalContext], 
JSStringCreateWithCFString((CFStringRef)notification));


JSObjectCallAsFunction([mainFrame globalContext], function, NULL, 1, 
argument, NULL);
}___
webkit-dev mailing list
webkit-dev@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev


Re: [webkit-dev] Calling JavaScript function from within DumpRenderTree

2010-01-01 Thread Sam Weinig
On Fri, Jan 1, 2010 at 7:13 PM, Chris Fleizach cfleiz...@apple.com wrote:

 I need to have a layout test register a callback with DRT, then have that
 callback be called at the appropriate time (in order to test accessibility
 notifications)

 I can't figure out the right incantations to do so.

 I'd like to do something like this in the LayoutTest

 var addedNotification = liveRegion.addNotificationListener(ariaCallback);

 then have a function in the test like

 function ariaCallback(notification) {
// do stuff with notification
 }

 DRT knows when to call this method, but I'm not sure how.. This is what I
 have so far, which does not work.

 // The JavaScript callback we'll use when we get a notification
 static JSStringRef AXNotificationFunctionCallback = 0;

 static void _accessibilityNotificationCallback(id element, NSString*
 notification)
 {
 if (!AXNotificationFunctionCallback)
 return;


 JSObjectRef function = JSObjectMakeFunction([mainFrame globalContext],
 NULL, 0, NULL, AXNotificationFunctionCallback, NULL, 1, NULL);
 JSValueRef argument = JSValueMakeString([mainFrame globalContext],
 JSStringCreateWithCFString((CFStringRef)notification));




 JSObjectCallAsFunction([mainFrame globalContext], function, NULL, 1,
 argument, NULL);
 }


What you need to do is lookup the function object on the global object. Your
function would look more like:

static void _accessibilityNotificationCallback(id element, NSString*
notification)
{
if (!AXNotificationFunctionCallback)
return;

JSValueRef functionValue = JSObjectGetProperty([mainFrame
globalContext], JSContextGetGlobalObject([mainFrame globalContext]),
AXNotificationFunctionCallback, NULL);
if (!JSValueIsObject(functionValue))
return;

JSObjectRef functionObject = static_castJSObjectRef(functionValue);
JSValueRef argument = JSValueMakeString([mainFrame globalContext],
JSStringCreateWithCFString((CFStringRef)notification));
JSObjectCallAsFunction([mainFrame globalContext], function, NULL, 1,
argument, NULL);
}

(You probably would want to add some more exception checks).

That said, a more javascripty way to do this would be to pass the function
object to liveRegion.addNotificationListener itself.  That way, in the test
file, you would have,

liveRegion.addNotificationListener(function(notification) {
   // do stuff with notification
});

In the implementation of addNotificationListener, you would save the
function object off instead of saving off the string, and then call it in
_accessibilityNotificationCallback.

-Sam
___
webkit-dev mailing list
webkit-dev@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev