-
Notifications
You must be signed in to change notification settings - Fork 28
/
jscocoa-sample.m
78 lines (62 loc) · 2.21 KB
/
jscocoa-sample.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//
// Sample code to use JSCocoa in a WebView instead of the existing WebKit bridge.
// by Fabien Franzen on 20090906
//
// Init JSCocoa with initWithGlobalContext:[[webView mainFrame] globalContext]
//
// Use JSCocoa via the global 'OSX' property :
// var objCDate = OSX.NSDate.alloc.init
// var point = new OSX.NSPoint(123, 456)
// var delegate = OSX.NSApplication.sharedApplication.delegate
// var array = delegate.testArray( ['hello', 'world', [4, 5, 6], 'end' ] )
//
// The Javascript context (JSGlobalContextRef) is only valid for the current webpage : it will be released when navigating to a new URL.
// Destroy and recreate JSCocoa upon WebFrameLoadDelegate.didClearWindowObject:forFrame:
//
@interface Report : NSObject {
WebView *webView;
JSCocoaController *JSController;
}
@property (nonatomic, assign) IBOutlet WebView *webView; // weak ref
@property (nonatomic, retain) JSCocoaController *JSController;
- (id)initWithWebView:(WebView *)wView;
- (void)initJSController;
@end
@implementation Report
- (id)initWithWebView:(WebView *)wView {
if (self = [super init]) {
[self setWebView:wView];
[self initJSController];
[[self webView] setFrameLoadDelegate:self]
}
return self;
}
- (void)initJSController {
JSGlobalContextRef ctx = [[[self webView] mainFrame] globalContext];
if ([self JSController] == nil || ([self JSController] && ctx != [[self JSController] ctx])) {
[self setJSController:[[JSCocoa alloc] initWithGlobalContext:ctx]];
}
}
#pragma mark WebFrameLoadDelegate Methods
- (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowObject forFrame:(WebFrame *)frame {
[self initJSController];
[[self JSController] setObject:self withName:@"report"];
}
#pragma mark -
- (void)dealloc {
webView = nil;
[JSController release], JSController = nil;
[super dealloc];
}
@end
// used with jquery.js and chain.js
jQuery(function($) {
$('#overview').items([]).chain();
});
function update() {
var objects = window.report.representedObjects;
var items = $.map(objects, function(item, idx) {
return { name: item.name.valueOf(), country: item.country.name.valueOf() };
});
$('#overview').items('replace', items);
}