WebViewDelegate.m 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. //
  2. // WebViewDelegate.m
  3. // MG
  4. //
  5. // Created by Tim Debo on 5/20/14.
  6. //
  7. //
  8. #import <JavaScriptCore/JavaScriptCore.h>
  9. #import "WebViewDelegate.h"
  10. #import "WindowController.h"
  11. #import "MacGap.h"
  12. @implementation WebViewDelegate
  13. @synthesize windowController, app, menu, window;
  14. - (id) initWithMenu:(NSMenu*)aMenu
  15. {
  16. self = [super init];
  17. if (!self)
  18. return nil;
  19. mainMenu = aMenu;
  20. return self;
  21. }
  22. - (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id < WebOpenPanelResultListener >)resultListener allowMultipleFiles:(BOOL)allowMultipleFiles{
  23. NSOpenPanel * openDlg = [NSOpenPanel openPanel];
  24. [openDlg setCanChooseFiles:YES];
  25. [openDlg setCanChooseDirectories:NO];
  26. [openDlg setAllowsMultipleSelection: allowMultipleFiles];
  27. [openDlg beginWithCompletionHandler:^(NSInteger result){
  28. if (result == NSFileHandlingPanelOKButton) {
  29. NSArray * files = [[openDlg URLs] valueForKey: @"relativePath"];
  30. [resultListener chooseFilenames: files];
  31. } else {
  32. [resultListener cancel];
  33. }
  34. }];
  35. }
  36. - (void)webView:(WebView *)sender willPerformDragDestinationAction:(WebDragDestinationAction)action forDraggingInfo:(id < NSDraggingInfo >)draggingInfo
  37. {
  38. NSArray *files = nil;
  39. if (action == WebDragDestinationActionDHTML) {
  40. NSPasteboard *pboard = [draggingInfo draggingPasteboard];
  41. if([[pboard types] containsObject:NSURLPboardType] ) {
  42. files = [pboard propertyListForType:NSFilenamesPboardType];
  43. }
  44. }
  45. if(files) {
  46. [app addFiles:files];
  47. }
  48. }
  49. - (void) webView:(WebView*)webView addMessageToConsole:(NSDictionary*)message
  50. {
  51. if (![message isKindOfClass:[NSDictionary class]]) {
  52. return;
  53. }
  54. NSLog(@"JavaScript console: %@:%@: %@",
  55. [[message objectForKey:@"sourceURL"] lastPathComponent], // could be nil
  56. [message objectForKey:@"lineNumber"],
  57. [message objectForKey:@"message"]);
  58. }
  59. - (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame
  60. {
  61. NSAlert *alert = [[NSAlert alloc] init];
  62. [alert addButtonWithTitle:@"OK"];
  63. [alert setMessageText:message];
  64. [alert setAlertStyle:NSWarningAlertStyle];
  65. [alert runModal];
  66. }
  67. - (BOOL)webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame
  68. {
  69. NSAlert *alert = [[NSAlert alloc] init];
  70. [alert addButtonWithTitle:@"Yes"];
  71. [alert addButtonWithTitle:@"No"];
  72. [alert setMessageText:message];
  73. [alert setAlertStyle:NSWarningAlertStyle];
  74. if ([alert runModal] == NSAlertFirstButtonReturn)
  75. return YES;
  76. else
  77. return NO;
  78. }
  79. /*
  80. By default the size of a database is set to 0 [1]. When a database is being created
  81. it calls this delegate method to get an increase in quota size - or call an error.
  82. PS this method is defined in WebUIDelegatePrivate and may make it difficult, but
  83. not impossible [2], to get an app accepted into the mac app store.
  84. Further reading:
  85. [1] http://stackoverflow.com/questions/353808/implementing-a-webview-database-quota-delegate
  86. [2] http://stackoverflow.com/questions/4527905/how-do-i-enable-local-storage-in-my-webkit-based-application/4608549#4608549
  87. */
  88. - (void)webView:(WebView *)sender frame:(WebFrame *)frame exceededDatabaseQuotaForSecurityOrigin:(id) origin database:(NSString *)databaseIdentifier
  89. {
  90. static const unsigned long long defaultQuota = 5 * 1024 * 1024;
  91. if ([origin respondsToSelector: @selector(setQuota:)]) {
  92. [origin performSelector:@selector(setQuota:) withObject:[NSNumber numberWithLongLong: defaultQuota]];
  93. } else {
  94. NSLog(@"could not increase quota for %lld", defaultQuota);
  95. }
  96. }
  97. - (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems
  98. {
  99. NSMutableArray *webViewMenuItems = [defaultMenuItems mutableCopy];
  100. if (webViewMenuItems)
  101. {
  102. NSEnumerator *itemEnumerator = [defaultMenuItems objectEnumerator];
  103. NSMenuItem *menuItem = nil;
  104. while ((menuItem = [itemEnumerator nextObject]))
  105. {
  106. NSInteger tag = [menuItem tag];
  107. switch (tag)
  108. {
  109. case WebMenuItemTagOpenLinkInNewWindow:
  110. case WebMenuItemTagDownloadLinkToDisk:
  111. case WebMenuItemTagCopyLinkToClipboard:
  112. case WebMenuItemTagOpenImageInNewWindow:
  113. case WebMenuItemTagDownloadImageToDisk:
  114. case WebMenuItemTagCopyImageToClipboard:
  115. case WebMenuItemTagOpenFrameInNewWindow:
  116. case WebMenuItemTagGoBack:
  117. case WebMenuItemTagGoForward:
  118. case WebMenuItemTagStop:
  119. case WebMenuItemTagOpenWithDefaultApplication:
  120. case WebMenuItemTagReload:
  121. [webViewMenuItems removeObjectIdenticalTo: menuItem];
  122. }
  123. }
  124. }
  125. return webViewMenuItems;
  126. }
  127. - (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request{
  128. windowController = [[WindowController alloc] initWithRequest:request];
  129. return windowController.webView;
  130. }
  131. - (void)webViewShow:(WebView *)sender{
  132. [windowController showWindow:sender];
  133. }
  134. - (void)webView:(WebView *)webView decidePolicyForNewWindowAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request newFrameName:(NSString *)frameName decisionListener:(id < WebPolicyDecisionListener >)listener
  135. {
  136. [[NSWorkspace sharedWorkspace] openURL:[request URL]];
  137. [listener ignore];
  138. }
  139. - (void) webView: (WebView*) webView didCreateJavaScriptContext:(JSContext *)context forFrame:(WebFrame *)frame
  140. {
  141. windowController.jsContext = context;
  142. //Initialize "Always On" commands
  143. if (app == nil) {
  144. app = [[App alloc] initWithWebView:webView];
  145. }
  146. if(window == nil) {
  147. window = [[Window alloc] initWithWindowController:self.windowController andWebview:webView];
  148. }
  149. if(menu == nil) {
  150. menu = [Menu menuWithContext:context andMenu:mainMenu ];
  151. }
  152. context[kWebScriptNamespace] = app;
  153. context[kWebScriptNamespace][@"Window"] = window;
  154. context[kWebScriptNamespace][@"Menu"] = menu;
  155. //Init user selected plugins
  156. for( NSString* plugin in windowController.pluginsMap) {
  157. id obj = [[NSClassFromString(plugin)alloc] initWithWindowController: windowController];
  158. NSString *exportName = [obj exportName];
  159. context[kWebScriptNamespace][exportName] = obj;
  160. }
  161. }
  162. - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
  163. {
  164. [Event triggerEvent:@"MacGap.load.complete" forWebView:sender];
  165. }
  166. @end