WebViewDelegate.m 6.5 KB

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