mirror of
https://github.com/ZeroTier/ZeroTierOne
synced 2025-08-14 02:27:38 -07:00
Pass authtoken in from user, and add a wrapper for web UI on Mac.
This commit is contained in:
parent
e58047eaa0
commit
5b54612d91
68 changed files with 7537 additions and 1 deletions
206
ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.m
Normal file
206
ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.m
Normal file
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue