mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-01-30 16:13:55 +00:00
207 lines
6.5 KiB
Objective-C
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
|