I have a new MacRuby application. I'm trying to call a MacRuby method from JavaScript loaded in a webView within the application.
The Calling Objective-C Methods From JavaScript tutorial shows how to add a key to the webScriptObject that's value is an Objective-C object. Thus you can call Obj-C methods from JavaScript.
Unfortunately this does not work with MacRuby classes/methods. Below is a shorten version of my WebView's loadDelegate:
class WebLoadDelegate
attr_accessor :objc_bridge, :mr_bridge
def webView(sender, windowScriptObjectAvailable:windowScriptObject)
scriptObject = windowScriptObject
self.mr_bridge = MacRubyBridge.new();
self.objc_bridge = JavaScriptBridge.instance();
scriptObject.setValue(self.objc_bridge, forKey:"ObjCInstance")
scriptObject.setValue(self.mr_bridge, forKey:"MacRubyInstance")
end
end
When the webScriptObject is available i add two keys to it: ObjCInstance and MacRubyInstance.
Here's the implementation of the ObjC class:
#import "JavaScriptBridge.h"
static JavaScriptBridge *gInstance = NULL;
@implementation JavaScriptBridge
+ (JavaScriptBridge *)instance {
gInstance = [[self alloc] init];
return gInstance;
}
+ (NSString *) webScriptNameForSelector:(SEL)sel
{
return @"nameAtIndex";
}
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector
{
if (aSelector == @selector(nameAtIndex:)) return NO;
return YES;
}
- (NSString *)nameAtIndex:(int)index {
return @"works";
}
@end
And here's what's supposed to be the same thing in Ruby:
class MacRubyBridge
def nameAtIndex(i)
return "fails"
end
def self.webScriptNameForSelector(sel)
return "nameAtIndex";
end
def self.isSelectorExcludedFromWebScript(sel)
if (sel == :nameAtIndex)
false
else
true
end
end
end
The only problem is the Objective-C implementation works fine. On the JS side you can call:
window.ObjCInstance.nameAtIndex_(1)
Which returns the string "works".
But the MacRuby implementation fails. When you call:
window.MacRubyInstance.nameAtIndex_(1)
You get:
Result of expression 'window.MacRubyInstance.nameAtIndex_' [undefined] is not a function
The webScriptNameForSelector
and isSelectorExcludedFromWebScript
methods never get called on the MacRuby implementation. I think that's the problem, but I don't know why they aren't getting called.
Any help would be greatly appreciated.