summaryrefslogtreecommitdiff
path: root/ext/mac-ui-macgap1-wrapper/src/MacGap/Classes/WebViewDelegate.m
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2015-05-08 12:35:41 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2015-05-08 12:35:41 -0700
commit8594e17f2b07976c006bca1c5531e56ead9b065a (patch)
tree0a123b99f45ef614193dd591e2e0a5254fb8f875 /ext/mac-ui-macgap1-wrapper/src/MacGap/Classes/WebViewDelegate.m
parenta40192a40bdf81b9d2a78ae69e059e41d78604ea (diff)
downloadinfinitytier-8594e17f2b07976c006bca1c5531e56ead9b065a.tar.gz
infinitytier-8594e17f2b07976c006bca1c5531e56ead9b065a.zip
Move mac-ui into src/
Diffstat (limited to 'ext/mac-ui-macgap1-wrapper/src/MacGap/Classes/WebViewDelegate.m')
-rw-r--r--ext/mac-ui-macgap1-wrapper/src/MacGap/Classes/WebViewDelegate.m206
1 files changed, 206 insertions, 0 deletions
diff --git a/ext/mac-ui-macgap1-wrapper/src/MacGap/Classes/WebViewDelegate.m b/ext/mac-ui-macgap1-wrapper/src/MacGap/Classes/WebViewDelegate.m
new file mode 100644
index 00000000..50578018
--- /dev/null
+++ b/ext/mac-ui-macgap1-wrapper/src/MacGap/Classes/WebViewDelegate.m
@@ -0,0 +1,206 @@
+#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