207 lines
6.5 KiB
Objective-C

#import "WebViewDelegate.h"
#import "Sound.h"
#import "Dock.h"
#import "Notice.h"
#import "Path.h"
#import "App.h"
#import "Window.h"
#import "WindowController.h"
#import "Clipboard.h"
#import "Fonts.h"
#import "MenuProxy.h"
#import "UserDefaults.h"
@implementation WebViewDelegate
@synthesize sound;
@synthesize dock;
@synthesize growl;
@synthesize notice;
@synthesize path;
@synthesize app;
@synthesize window;
@synthesize requestedWindow;
@synthesize clipboard;
@synthesize fonts;
@synthesize menu;
@synthesize userDefaults;
- (id) initWithMenu:(NSMenu*)aMenu
{
self = [super init];
if (!self)
return nil;
mainMenu = aMenu;
return self;
}
- (void) webView:(WebView*)webView didClearWindowObject:(WebScriptObject*)windowScriptObject forFrame:(WebFrame *)frame
{
JSContextRef context = [frame globalContext];
if (self.sound == nil) { self.sound = [[Sound alloc] initWithContext:context]; }
if (self.dock == nil) { self.dock = [Dock new]; }
if (self.path == nil) { self.path = [Path new]; }
if (self.clipboard == nil) { self.clipboard = [Clipboard new]; }
if (self.fonts == nil) { self.fonts = [Fonts new]; }
if (self.notice == nil && [Notice available] == YES) {
self.notice = [[Notice alloc] initWithWebView:webView];
}
if (self.app == nil) {
self.app = [[App alloc] initWithWebView:webView];
}
if (self.window == nil) {
self.window = [[Window alloc] initWithWebView:webView];
}
if (self.menu == nil) {
self.menu = [MenuProxy proxyWithContext:context andMenu:mainMenu];
}
if (self.userDefaults == nil) {
self.userDefaults = [[UserDefaults alloc] initWithWebView:webView];
}
[windowScriptObject setValue:self forKey:kWebScriptNamespace];
}
- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id < WebOpenPanelResultListener >)resultListener allowMultipleFiles:(BOOL)allowMultipleFiles{
NSOpenPanel * openDlg = [NSOpenPanel openPanel];
[openDlg setCanChooseFiles:YES];
[openDlg setCanChooseDirectories:NO];
[openDlg beginWithCompletionHandler:^(NSInteger result){
if (result == NSFileHandlingPanelOKButton) {
NSArray * files = [[openDlg URLs] valueForKey: @"relativePath"];
[resultListener chooseFilenames: files];
} else {
[resultListener cancel];
}
}];
}
- (void) webView:(WebView*)webView addMessageToConsole:(NSDictionary*)message
{
if (![message isKindOfClass:[NSDictionary class]]) {
return;
}
NSLog(@"JavaScript console: %@:%@: %@",
[[message objectForKey:@"sourceURL"] lastPathComponent], // could be nil
[message objectForKey:@"lineNumber"],
[message objectForKey:@"message"]);
}
- (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame
{
NSAlert *alert = [[NSAlert alloc] init];
[alert addButtonWithTitle:@"OK"];
[alert setMessageText:message];
[alert setAlertStyle:NSWarningAlertStyle];
[alert runModal];
}
- (BOOL)webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame
{
NSAlert *alert = [[NSAlert alloc] init];
[alert addButtonWithTitle:@"Yes"];
[alert addButtonWithTitle:@"No"];
[alert setMessageText:message];
[alert setAlertStyle:NSWarningAlertStyle];
if ([alert runModal] == NSAlertFirstButtonReturn)
return YES;
else
return NO;
}
/*
By default the size of a database is set to 0 [1]. When a database is being created
it calls this delegate method to get an increase in quota size - or call an error.
PS this method is defined in WebUIDelegatePrivate and may make it difficult, but
not impossible [2], to get an app accepted into the mac app store.
Further reading:
[1] http://stackoverflow.com/questions/353808/implementing-a-webview-database-quota-delegate
[2] http://stackoverflow.com/questions/4527905/how-do-i-enable-local-storage-in-my-webkit-based-application/4608549#4608549
*/
- (void)webView:(WebView *)sender frame:(WebFrame *)frame exceededDatabaseQuotaForSecurityOrigin:(id) origin database:(NSString *)databaseIdentifier
{
static const unsigned long long defaultQuota = 5 * 1024 * 1024;
if ([origin respondsToSelector: @selector(setQuota:)]) {
[origin performSelector:@selector(setQuota:) withObject:[NSNumber numberWithLongLong: defaultQuota]];
} else {
NSLog(@"could not increase quota for %lld", defaultQuota);
}
}
- (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems
{
NSMutableArray *webViewMenuItems = [defaultMenuItems mutableCopy];
if (webViewMenuItems)
{
NSEnumerator *itemEnumerator = [defaultMenuItems objectEnumerator];
NSMenuItem *menuItem = nil;
while ((menuItem = [itemEnumerator nextObject]))
{
NSInteger tag = [menuItem tag];
switch (tag)
{
case WebMenuItemTagOpenLinkInNewWindow:
case WebMenuItemTagDownloadLinkToDisk:
case WebMenuItemTagCopyLinkToClipboard:
case WebMenuItemTagOpenImageInNewWindow:
case WebMenuItemTagDownloadImageToDisk:
case WebMenuItemTagCopyImageToClipboard:
case WebMenuItemTagOpenFrameInNewWindow:
case WebMenuItemTagGoBack:
case WebMenuItemTagGoForward:
case WebMenuItemTagStop:
case WebMenuItemTagOpenWithDefaultApplication:
case WebMenuItemTagReload:
[webViewMenuItems removeObjectIdenticalTo: menuItem];
}
}
}
return webViewMenuItems;
}
- (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request{
requestedWindow = [[WindowController alloc] initWithRequest:request];
return requestedWindow.contentView.webView;
}
- (void)webViewShow:(WebView *)sender{
[requestedWindow showWindow:sender];
}
- (void)webView:(WebView *)webView decidePolicyForNewWindowAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request newFrameName:(NSString *)frameName decisionListener:(id < WebPolicyDecisionListener >)listener
{
[[NSWorkspace sharedWorkspace] openURL:[request URL]];
[listener ignore];
}
#pragma mark WebScripting protocol
+ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector
{
return YES;
}
+ (BOOL) isKeyExcludedFromWebScript:(const char*)name
{
return NO;
}
@end