ARC: Update HTMLOutput framework

This commit is contained in:
Allan Odgaard
2012-09-24 20:05:47 +02:00
parent 53bd39b636
commit d178263cca
15 changed files with 159 additions and 215 deletions

View File

@@ -156,7 +156,7 @@ namespace
- (void)startLoading
{
NSURLResponse* response = [[[NSURLResponse alloc] initWithURL:[[self request] URL] MIMEType:@"text/html" expectedContentLength:-1 textEncodingName:@"utf-8"] autorelease];
NSURLResponse* response = [[NSURLResponse alloc] initWithURL:[[self request] URL] MIMEType:@"text/html" expectedContentLength:-1 textEncodingName:@"utf-8"];
[[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
// WebView seems to stall until it has received at least 1024 bytes

View File

@@ -1,13 +1,6 @@
#import <oak/debug.h>
#import "browser/HOBrowserView.h"
@class HOAutoScroll;
#import <oak/misc.h>
PUBLIC @interface OakHTMLOutputView : HOBrowserView
{
HOAutoScroll* autoScrollHelper;
std::map<std::string, std::string> environment;
BOOL runningCommand;
}
@property (nonatomic, readonly) BOOL runningCommand;
@end

View File

@@ -8,26 +8,23 @@ extern NSString* const kCommandRunnerURLScheme; // from HTMLOutput.h
@interface OakHTMLOutputView ()
@property (nonatomic, assign) BOOL runningCommand;
@property (nonatomic, retain) HOAutoScroll* autoScrollHelper;
@end
@implementation OakHTMLOutputView
@synthesize runningCommand;
{
std::map<std::string, std::string> environment;
}
- (id)initWithFrame:(NSRect)frame
{
if(self = [super initWithFrame:frame])
{
autoScrollHelper = [HOAutoScroll new];
self.autoScrollHelper = [HOAutoScroll new];
}
return self;
}
- (void)dealloc
{
[autoScrollHelper release];
[super dealloc];
}
- (BOOL)isOpaque
{
return YES;
@@ -44,20 +41,20 @@ extern NSString* const kCommandRunnerURLScheme; // from HTMLOutput.h
- (void)loadRequest:(NSURLRequest*)aRequest autoScrolls:(BOOL)flag
{
autoScrollHelper.webFrame = flag ? webView.mainFrame.frameView : nil;
_autoScrollHelper.webFrame = flag ? self.webView.mainFrame.frameView : nil;
self.runningCommand = [[[aRequest URL] scheme] isEqualToString:kCommandRunnerURLScheme];
[webView.mainFrame loadRequest:aRequest];
[self.webView.mainFrame loadRequest:aRequest];
}
- (void)stopLoading
{
[webView.mainFrame stopLoading];
[self.webView.mainFrame stopLoading];
}
- (void)webView:(WebView*)sender didStartProvisionalLoadForFrame:(WebFrame*)frame
{
statusBar.isBusy = YES;
if(NSString* scheme = [[[[[webView mainFrame] provisionalDataSource] request] URL] scheme])
self.statusBar.isBusy = YES;
if(NSString* scheme = [[[[[self.webView mainFrame] provisionalDataSource] request] URL] scheme])
[self setUpdatesProgress:![scheme isEqualToString:kCommandRunnerURLScheme]];
}
@@ -67,11 +64,11 @@ extern NSString* const kCommandRunnerURLScheme; // from HTMLOutput.h
- (void)webView:(WebView*)sender didClearWindowObject:(WebScriptObject*)windowScriptObject forFrame:(WebFrame*)frame
{
NSString* scheme = [[[[[webView mainFrame] dataSource] request] URL] scheme];
NSString* scheme = [[[[[self.webView mainFrame] dataSource] request] URL] scheme];
if([@[ kCommandRunnerURLScheme, @"tm-file", @"file" ] containsObject:scheme])
{
HOJSBridge* bridge = [[HOJSBridge new] autorelease];
[bridge setDelegate:statusBar];
HOJSBridge* bridge = [HOJSBridge new];
[bridge setDelegate:self.statusBar];
[bridge setEnvironment:environment];
[windowScriptObject setValue:bridge forKey:@"TextMate"];
}

View File

@@ -1,16 +1,10 @@
#import <oak/debug.h>
#import <oak/misc.h>
@class HOStatusBar;
@class HOWebViewDelegateHelper;
@interface HOBrowserView : NSView
{
OBJC_WATCH_LEAKS(HOBrowserView);
WebView* webView;
HOStatusBar* statusBar;
HOWebViewDelegateHelper* webViewDelegateHelper;
}
@property (nonatomic, readonly) WebView* webView;
@property (nonatomic, readonly) HOStatusBar* statusBar;
@property (nonatomic, retain) NSString* projectUUID;
- (void)setUpdatesProgress:(BOOL)flag;
@end

View File

@@ -4,9 +4,13 @@
#import <OakAppKit/OakAppKit.h>
#import <OakAppKit/NSColor Additions.h>
@implementation HOBrowserView
@synthesize webView;
@interface HOBrowserView ()
@property (nonatomic, readwrite) WebView* webView;
@property (nonatomic, readwrite) HOStatusBar* statusBar;
@property (nonatomic, retain) HOWebViewDelegateHelper* webViewDelegateHelper;
@end
@implementation HOBrowserView
+ (BOOL)requiresConstraintBasedLayout
{
return YES;
@@ -21,52 +25,50 @@
{
if(self = [super initWithFrame:frame])
{
webView = [[WebView alloc] initWithFrame:NSZeroRect];
_webView = [[WebView alloc] initWithFrame:NSZeroRect];
statusBar = [[HOStatusBar alloc] initWithFrame:NSZeroRect];
statusBar.delegate = webView;
_statusBar = [[HOStatusBar alloc] initWithFrame:NSZeroRect];
_statusBar.delegate = _webView;
webViewDelegateHelper = [HOWebViewDelegateHelper new];
webViewDelegateHelper.delegate = statusBar;
webView.policyDelegate = webViewDelegateHelper;
webView.resourceLoadDelegate = webViewDelegateHelper;
webView.UIDelegate = webViewDelegateHelper;
webView.frameLoadDelegate = self;
_webViewDelegateHelper = [HOWebViewDelegateHelper new];
_webViewDelegateHelper.delegate = _statusBar;
_webView.policyDelegate = _webViewDelegateHelper;
_webView.resourceLoadDelegate = _webViewDelegateHelper;
_webView.UIDelegate = _webViewDelegateHelper;
_webView.frameLoadDelegate = self;
NSBox* divider = OakCreateViewWithColor([NSColor colorWithString:@"#9d9d9d"]);
NSDictionary* views = @{
@"webView" : _webView,
@"divider" : OakCreateViewWithColor([NSColor colorWithString:@"#9d9d9d"]),
@"statusBar" : _statusBar
};
NSDictionary* views = NSDictionaryOfVariableBindings(webView, divider, statusBar);
for(NSView* view in [views allValues])
{
[view setTranslatesAutoresizingMaskIntoConstraints:NO];
[self addSubview:view];
}
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[webView(==statusBar,==divider)]|" options:NSLayoutFormatAlignAllTop metrics:nil views:views]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[webView(==statusBar,==divider)]|" options:NSLayoutFormatAlignAllTop metrics:nil views:views]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[webView(>=10)][divider(==1)][statusBar]|" options:NSLayoutFormatAlignAllLeading metrics:nil views:views]];
}
return self;
}
- (NSString*)projectUUID { return webViewDelegateHelper.projectUUID; }
- (void)setProjectUUID:(NSString*)aProjectUUID { webViewDelegateHelper.projectUUID = aProjectUUID; }
- (NSString*)projectUUID { return _webViewDelegateHelper.projectUUID; }
- (void)setProjectUUID:(NSString*)aProjectUUID { _webViewDelegateHelper.projectUUID = aProjectUUID; }
- (void)webViewProgressEstimateChanged:(NSNotification*)notification
{
statusBar.progress = webView.estimatedProgress;
_statusBar.progress = _webView.estimatedProgress;
}
- (void)dealloc
{
[self setUpdatesProgress:NO];
[webView setResourceLoadDelegate:nil];
[webView setFrameLoadDelegate:nil];
[[webView mainFrame] stopLoading];
[webView release];
[webViewDelegateHelper release];
[statusBar release];
[super dealloc];
[_webView setResourceLoadDelegate:nil];
[_webView setFrameLoadDelegate:nil];
[[_webView mainFrame] stopLoading];
}
- (BOOL)isOpaque
@@ -76,25 +78,25 @@
- (void)swipeWithEvent:(NSEvent*)anEvent
{
if([anEvent deltaX] == +1 && webView.canGoBack)
[webView goBack:self];
else if([anEvent deltaX] == -1 && webView.canGoForward)
[webView goForward:self];
if([anEvent deltaX] == +1 && _webView.canGoBack)
[_webView goBack:self];
else if([anEvent deltaX] == -1 && _webView.canGoForward)
[_webView goForward:self];
}
- (void)setUpdatesProgress:(BOOL)flag
{
if(flag)
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(webViewProgressEstimateChanged:) name:WebViewProgressFinishedNotification object:webView];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(webViewProgressEstimateChanged:) name:WebViewProgressEstimateChangedNotification object:webView];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(webViewProgressEstimateChanged:) name:WebViewProgressStartedNotification object:webView];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(webViewProgressEstimateChanged:) name:WebViewProgressFinishedNotification object:_webView];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(webViewProgressEstimateChanged:) name:WebViewProgressEstimateChangedNotification object:_webView];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(webViewProgressEstimateChanged:) name:WebViewProgressStartedNotification object:_webView];
}
else
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:WebViewProgressStartedNotification object:webView];
[[NSNotificationCenter defaultCenter] removeObserver:self name:WebViewProgressEstimateChangedNotification object:webView];
[[NSNotificationCenter defaultCenter] removeObserver:self name:WebViewProgressFinishedNotification object:webView];
[[NSNotificationCenter defaultCenter] removeObserver:self name:WebViewProgressStartedNotification object:_webView];
[[NSNotificationCenter defaultCenter] removeObserver:self name:WebViewProgressEstimateChangedNotification object:_webView];
[[NSNotificationCenter defaultCenter] removeObserver:self name:WebViewProgressFinishedNotification object:_webView];
}
}
@@ -104,15 +106,15 @@
- (void)webView:(WebView*)sender didStartProvisionalLoadForFrame:(WebFrame*)frame
{
statusBar.isBusy = YES;
_statusBar.isBusy = YES;
[self setUpdatesProgress:YES];
}
- (void)webView:(WebView*)sender didFinishLoadForFrame:(WebFrame*)frame
{
statusBar.canGoBack = webView.canGoBack;
statusBar.canGoForward = webView.canGoForward;
statusBar.isBusy = NO;
statusBar.progress = 0;
_statusBar.canGoBack = _webView.canGoBack;
_statusBar.canGoForward = _webView.canGoForward;
_statusBar.isBusy = NO;
_statusBar.progress = 0;
}
@end

View File

@@ -4,11 +4,11 @@
@end
@interface HOStatusBar : NSView
@property (nonatomic, assign) BOOL isBusy;
@property (nonatomic, assign) CGFloat progress;
@property (nonatomic, retain) NSString* statusText;
@property (nonatomic, assign) BOOL canGoBack;
@property (nonatomic, assign) BOOL canGoForward;
@property (nonatomic, weak) id delegate;
@property (nonatomic, assign) id delegate;
@property (nonatomic) NSString* statusText;
@property (nonatomic) CGFloat progress;
@property (nonatomic) BOOL isBusy;
@property (nonatomic) BOOL canGoBack;
@property (nonatomic) BOOL canGoForward;
@end

View File

@@ -3,12 +3,12 @@
static NSButton* OakCreateImageButton (NSString* imageName)
{
NSButton* res = [[NSButton new] autorelease];
NSButton* res = [NSButton new];
[res setButtonType:NSMomentaryChangeButton];
[res setBezelStyle:NSSmallSquareBezelStyle];
[res setBordered:NO];
NSImage* image = [[[NSImage imageNamed:imageName] copy] autorelease];
NSImage* image = [[NSImage imageNamed:imageName] copy];
[image setSize:NSMakeSize(13, 13)];
[res setImage:image];
[res setImagePosition:NSImageOnly];
@@ -18,7 +18,7 @@ static NSButton* OakCreateImageButton (NSString* imageName)
static NSTextField* OakCreateTextField ()
{
NSTextField* res = [[[NSTextField alloc] initWithFrame:NSZeroRect] autorelease];
NSTextField* res = [[NSTextField alloc] initWithFrame:NSZeroRect];
[res setBordered:NO];
[res setEditable:NO];
[res setSelectable:NO];
@@ -30,22 +30,22 @@ static NSTextField* OakCreateTextField ()
static NSImageView* OakCreateImageView (NSImage* image)
{
NSImageView* res = [[[NSImageView alloc] initWithFrame:NSZeroRect] autorelease];
NSImageView* res = [[NSImageView alloc] initWithFrame:NSZeroRect];
[res setImage:image];
return res;
}
@interface HOStatusBar ()
@property (nonatomic, retain) NSImage* backgroundImage;
@property (nonatomic, retain) NSImageView* firstSeparatorImageView;
@property (nonatomic, retain) NSImageView* secondSeparatorImageView;
@property (nonatomic, retain) NSButton* goBackButton;
@property (nonatomic, retain) NSButton* goForwardButton;
@property (nonatomic, retain) NSTextField* statusTextField;
@property (nonatomic, retain) NSProgressIndicator* progressIndicator;
@property (nonatomic, retain) NSProgressIndicator* spinner;
@property (nonatomic, retain) NSMutableArray* layoutConstraints;
@property (nonatomic, assign) BOOL indeterminateProgress;
@property (nonatomic) NSImage* backgroundImage;
@property (nonatomic) NSImageView* firstSeparatorImageView;
@property (nonatomic) NSImageView* secondSeparatorImageView;
@property (nonatomic) NSButton* goBackButton;
@property (nonatomic) NSButton* goForwardButton;
@property (nonatomic) NSTextField* statusTextField;
@property (nonatomic) NSProgressIndicator* progressIndicator;
@property (nonatomic) NSProgressIndicator* spinner;
@property (nonatomic) NSMutableArray* layoutConstraints;
@property (nonatomic) BOOL indeterminateProgress;
@end
@implementation HOStatusBar
@@ -55,25 +55,25 @@ static NSImageView* OakCreateImageView (NSImage* image)
{
_indeterminateProgress = YES;
self.backgroundImage = [NSImage imageNamed:@"Statusbar Background" inSameBundleAsClass:NSClassFromString(@"OakStatusBar")];
self.firstSeparatorImageView = OakCreateImageView([NSImage imageNamed:@"Statusbar Separator" inSameBundleAsClass:NSClassFromString(@"OakStatusBar")]);
self.secondSeparatorImageView = OakCreateImageView([NSImage imageNamed:@"Statusbar Separator" inSameBundleAsClass:NSClassFromString(@"OakStatusBar")]);
_backgroundImage = [NSImage imageNamed:@"Statusbar Background" inSameBundleAsClass:NSClassFromString(@"OakStatusBar")];
_firstSeparatorImageView = OakCreateImageView([NSImage imageNamed:@"Statusbar Separator" inSameBundleAsClass:NSClassFromString(@"OakStatusBar")]);
_secondSeparatorImageView = OakCreateImageView([NSImage imageNamed:@"Statusbar Separator" inSameBundleAsClass:NSClassFromString(@"OakStatusBar")]);
self.goBackButton = OakCreateImageButton(NSImageNameGoLeftTemplate);
self.goBackButton.toolTip = @"Show the previous page";
self.goBackButton.enabled = NO;
self.goBackButton.target = self;
self.goBackButton.action = @selector(goBack:);
_goBackButton = OakCreateImageButton(NSImageNameGoLeftTemplate);
_goBackButton.toolTip = @"Show the previous page";
_goBackButton.enabled = NO;
_goBackButton.target = self;
_goBackButton.action = @selector(goBack:);
self.goForwardButton = OakCreateImageButton(NSImageNameGoRightTemplate);
self.goForwardButton.toolTip = @"Show the next page";
self.goForwardButton.enabled = NO;
self.goForwardButton.target = self;
self.goForwardButton.action = @selector(goForward:);
_goForwardButton = OakCreateImageButton(NSImageNameGoRightTemplate);
_goForwardButton.toolTip = @"Show the next page";
_goForwardButton.enabled = NO;
_goForwardButton.target = self;
_goForwardButton.action = @selector(goForward:);
self.statusTextField = OakCreateTextField();
[self.statusTextField setContentCompressionResistancePriority:NSLayoutPriorityDefaultLow forOrientation:NSLayoutConstraintOrientationHorizontal];
[self.statusTextField.cell setLineBreakMode:NSLineBreakByTruncatingMiddle];
_statusTextField = OakCreateTextField();
[_statusTextField setContentCompressionResistancePriority:NSLayoutPriorityDefaultLow forOrientation:NSLayoutConstraintOrientationHorizontal];
[_statusTextField.cell setLineBreakMode:NSLineBreakByTruncatingMiddle];
_progressIndicator = [NSProgressIndicator new];
_progressIndicator.controlSize = NSSmallControlSize;
@@ -99,31 +99,16 @@ static NSImageView* OakCreateImageView (NSImage* image)
return self;
}
- (void)dealloc
{
self.backgroundImage = nil;
self.firstSeparatorImageView = nil;
self.secondSeparatorImageView = nil;
self.goBackButton = nil;
self.goForwardButton = nil;
self.statusTextField = nil;
self.progressIndicator = nil;
self.spinner = nil;
self.layoutConstraints = nil;
[super dealloc];
}
- (NSSize)intrinsicContentSize
{
return NSMakeSize(NSViewNoInstrinsicMetric, self.backgroundImage.size.height);
return NSMakeSize(NSViewNoInstrinsicMetric, _backgroundImage.size.height);
}
- (void)updateConstraints
{
if(self.layoutConstraints)
[self removeConstraints:self.layoutConstraints];
self.layoutConstraints = [NSMutableArray array];
if(_layoutConstraints)
[self removeConstraints:_layoutConstraints];
_layoutConstraints = [NSMutableArray array];
[super updateConstraints];

View File

@@ -1,13 +1,8 @@
@protocol HOWebViewDelegateHelperProtocol
- (NSString*)statusText;
- (void)setStatusText:(NSString*)text;
@property (nonatomic, retain) NSString* statusText;
@end
@interface HOWebViewDelegateHelper : NSObject
{
id delegate;
NSString* projectUUID;
}
@property (nonatomic, assign) id delegate;
@property (nonatomic, weak) id /*<HOWebViewDelegateHelperProtocol>*/ delegate;
@property (nonatomic, retain) NSString* projectUUID;
@end

View File

@@ -4,26 +4,18 @@
#import <OakFoundation/NSString Additions.h>
@implementation HOWebViewDelegateHelper
@synthesize delegate, projectUUID;
- (void)dealloc
{
[projectUUID release];
[super dealloc];
}
// =====================
// = WebViewUIDelegate =
// =====================
- (void)webView:(WebView*)sender setStatusText:(NSString*)text
{
[delegate setStatusText:(text ?: @"")];
[_delegate setStatusText:(text ?: @"")];
}
- (NSString*)webViewStatusText:(WebView*)sender
{
return [delegate statusText];
return [_delegate statusText];
}
- (void)webView:(WebView*)sender mouseDidMoveOverElement:(NSDictionary*)elementInformation modifierFlags:(NSUInteger)modifierFlags
@@ -56,7 +48,7 @@
NSPoint origin = [sender.window cascadeTopLeftFromPoint:NSMakePoint(NSMinX(sender.window.frame), NSMaxY(sender.window.frame))];
origin.y -= NSHeight(sender.window.frame);
HOBrowserView* view = [[HOBrowserView new] autorelease];
HOBrowserView* view = [HOBrowserView new];
NSWindow* window = [[NSWindow alloc] initWithContentRect:(NSRect){origin, NSMakeSize(750, 800)}
styleMask:(NSTitledWindowMask|NSClosableWindowMask|NSResizableWindowMask|NSMiniaturizableWindowMask)
backing:NSBackingStoreBuffered
@@ -96,8 +88,8 @@
NSURL* url = request.URL;
if([[url scheme] isEqualToString:@"txmt"])
{
if(projectUUID)
url = [NSURL URLWithString:[[url absoluteString] stringByAppendingFormat:@"&project=%@", projectUUID]];
if(_projectUUID)
url = [NSURL URLWithString:[[url absoluteString] stringByAppendingFormat:@"&project=%@", _projectUUID]];
[NSApp sendAction:@selector(handleTxMtURL:) to:nil from:url];
}
else

View File

@@ -1,7 +1,3 @@
@interface HOAutoScroll : NSObject
{
WebFrameView* webFrame;
NSRect lastFrame, lastVisibleRect;
}
@property (nonatomic, retain) WebFrameView* webFrame;
@property (nonatomic) WebFrameView* webFrame;
@end

View File

@@ -3,9 +3,12 @@
OAK_DEBUG_VAR(HTMLOutput_AutoScroll);
@implementation HOAutoScroll
@synthesize webFrame;
@interface HOAutoScroll ()
@property (nonatomic) NSRect lastFrame;
@property (nonatomic) NSRect lastVisibleRect;
@end
@implementation HOAutoScroll
- (void)scrollViewToBottom:(NSView*)aView
{
NSRect visibleRect = [aView visibleRect];
@@ -17,25 +20,21 @@ OAK_DEBUG_VAR(HTMLOutput_AutoScroll);
{
D(DBF_HTMLOutput_AutoScroll, bug("\n"););
self.webFrame = nil;
[super dealloc];
}
- (void)setWebFrame:(WebFrameView*)aWebFrame
{
D(DBF_HTMLOutput_AutoScroll, bug("%s\n", [aWebFrame description].UTF8String););
if(aWebFrame == webFrame)
if(aWebFrame == _webFrame)
return;
[webFrame release];
webFrame = [aWebFrame retain];
if(webFrame)
if(_webFrame = aWebFrame)
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(webViewDidChangeFrame:) name:NSViewFrameDidChangeNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(webViewDidChangeBounds:) name:NSViewBoundsDidChangeNotification object:nil];
lastFrame = [[webFrame documentView] frame];
lastVisibleRect = [[webFrame documentView] visibleRect];
_lastFrame = [[_webFrame documentView] frame];
_lastVisibleRect = [[_webFrame documentView] visibleRect];
}
else
{
@@ -46,39 +45,39 @@ OAK_DEBUG_VAR(HTMLOutput_AutoScroll);
- (void)webViewDidChangeBounds:(NSNotification*)aNotification
{
NSClipView* clipView = [[[webFrame documentView] enclosingScrollView] contentView];
NSClipView* clipView = [[[_webFrame documentView] enclosingScrollView] contentView];
if(clipView != [aNotification object])
return;
D(DBF_HTMLOutput_AutoScroll, bug("bounds changed: %s → %s\n", NSStringFromRect(lastVisibleRect).UTF8String, NSStringFromRect([[clipView documentView] visibleRect]).UTF8String););
lastVisibleRect = [[clipView documentView] visibleRect];
D(DBF_HTMLOutput_AutoScroll, bug("bounds changed: %s → %s\n", NSStringFromRect(_lastVisibleRect).UTF8String, NSStringFromRect([[clipView documentView] visibleRect]).UTF8String););
_lastVisibleRect = [[clipView documentView] visibleRect];
}
- (void)webViewDidChangeFrame:(NSNotification*)aNotification
{
NSView* view = [aNotification object];
if(view != webFrame && view != [webFrame documentView])
if(view != _webFrame && view != [_webFrame documentView])
return;
if(view == [webFrame documentView])
if(view == [_webFrame documentView])
{
D(DBF_HTMLOutput_AutoScroll, bug("frame changed: %s → %s\n", NSStringFromRect(lastFrame).UTF8String, NSStringFromRect([view frame]).UTF8String););
if(NSMaxY(lastVisibleRect) >= NSMaxY(lastFrame))
D(DBF_HTMLOutput_AutoScroll, bug("frame changed: %s → %s\n", NSStringFromRect(_lastFrame).UTF8String, NSStringFromRect([view frame]).UTF8String););
if(NSMaxY(_lastVisibleRect) >= NSMaxY(_lastFrame))
{
D(DBF_HTMLOutput_AutoScroll, bug("scroll to bottom\n"););
[self scrollViewToBottom:view];
lastVisibleRect = [view visibleRect];
_lastVisibleRect = [view visibleRect];
}
lastFrame = [view frame];
_lastFrame = [view frame];
}
if(view == webFrame)
if(view == _webFrame)
{
D(DBF_HTMLOutput_AutoScroll, bug("vislble rect changed: %s → %s\n", NSStringFromRect(lastVisibleRect).UTF8String, NSStringFromRect([[webFrame documentView] visibleRect]).UTF8String););
if(NSMaxY(lastVisibleRect) >= NSMaxY(lastFrame))
D(DBF_HTMLOutput_AutoScroll, bug("vislble rect changed: %s → %s\n", NSStringFromRect(_lastVisibleRect).UTF8String, NSStringFromRect([[webFrame documentView] visibleRect]).UTF8String););
if(NSMaxY(_lastVisibleRect) >= NSMaxY(_lastFrame))
{
D(DBF_HTMLOutput_AutoScroll, bug("scroll to bottom\n"););
[self scrollViewToBottom:[webFrame documentView]];
[self scrollViewToBottom:[_webFrame documentView]];
}
}
}

View File

@@ -4,15 +4,11 @@
@end
@interface HOJSBridge : NSObject
{
id <HOJSBridgeDelegate> delegate;
std::map<std::string, std::string> environment;
BOOL isBusy; // dummy key
float progress; // dummy key
}
@property (nonatomic, weak) id /*<HOJSBridgeDelegate>*/ delegate;
- (void)setEnvironment:(const std::map<std::string, std::string>&)variables;
- (std::map<std::string, std::string> const&)environment;
- (id)system:(NSString*)aCommand handler:(id)aHandler;
- (void)log:(NSString*)aMessage;
- (std::map<std::string, std::string> const&)environment;
- (void)setDelegate:(id)aDelegate;
- (void)setEnvironment:(const std::map<std::string, std::string>&)variables;
@end

View File

@@ -20,8 +20,6 @@
std::vector<char> outputData, errorData;
int status;
id outputHandler, errorHandler, exitHandler;
oak::process_t* process;
bool didCloseInput;
io::reader_t* outputReader;
@@ -56,6 +54,14 @@
OAK_DEBUG_VAR(HTMLOutput_JSBridge);
@implementation HOJSBridge
{
std::map<std::string, std::string> environment;
// unused dummy keys to get them exposed to javascript
BOOL isBusy;
float progress;
}
- (std::map<std::string, std::string> const&)environment;
{
return environment;
@@ -94,22 +100,17 @@ OAK_DEBUG_VAR(HTMLOutput_JSBridge);
- (void)setIsBusy:(BOOL)flag
{
[delegate setIsBusy:flag];
[_delegate setIsBusy:flag];
}
- (void)setProgress:(id)newProgress;
{
[delegate setProgress:[newProgress floatValue]];
[(id <HOJSBridgeDelegate>)_delegate setProgress:[newProgress floatValue]];
}
- (double)progress
{
return [delegate progress];
}
- (void)setDelegate:(id)aDelegate
{
delegate = aDelegate;
return [_delegate progress];
}
- (void)log:(NSString*)aMessage
@@ -180,8 +181,6 @@ OAK_DEBUG_VAR(HTMLOutput_JSShellCommand);
@end
@implementation HOJSShellCommand
@synthesize outputHandler, errorHandler, exitHandler;
- (id)initWithCommand:(NSString*)aCommand andEnvironment:(const std::map<std::string, std::string>&)someEnvironment
{
if(self = [super init])
@@ -198,8 +197,8 @@ OAK_DEBUG_VAR(HTMLOutput_JSShellCommand);
{
if(++completeCounter == 3)
{
if(exitHandler)
[exitHandler callWebScriptMethod:@"call" withArguments:@[ exitHandler, self ]];
if(_exitHandler)
[_exitHandler callWebScriptMethod:@"call" withArguments:@[ _exitHandler, self ]];
else runLoop.stop();
}
}
@@ -207,27 +206,27 @@ OAK_DEBUG_VAR(HTMLOutput_JSShellCommand);
- (void)outputDataReceived:(char const*)bytes length:(size_t)len
{
D(DBF_HTMLOutput_JSShellCommand, bug("%zu bytes\n", len););
if(exitHandler)
if(_exitHandler)
outputData.erase(outputData.begin(), utf8::find_safe_end(outputData.begin(), outputData.end()));
outputData.insert(outputData.end(), bytes, bytes + len);
if(len == 0)
[self increaseCompleteCounter];
else if(outputHandler)
[outputHandler callWebScriptMethod:@"call" withArguments:@[ outputHandler, [self valueForKey:@"outputString"] ]];
else if(_outputHandler)
[_outputHandler callWebScriptMethod:@"call" withArguments:@[ _outputHandler, [self valueForKey:@"outputString"] ]];
}
- (void)errorDataReceived:(char const*)bytes length:(size_t)len
{
D(DBF_HTMLOutput_JSShellCommand, bug("%zu bytes\n", len););
if(exitHandler)
if(_exitHandler)
errorData.erase(errorData.begin(), utf8::find_safe_end(errorData.begin(), errorData.end()));
errorData.insert(errorData.end(), bytes, bytes + len);
if(len == 0)
[self increaseCompleteCounter];
else if(errorHandler)
[errorHandler callWebScriptMethod:@"call" withArguments:@[ errorHandler, [self valueForKey:@"errorString"] ]];
else if(_errorHandler)
[_errorHandler callWebScriptMethod:@"call" withArguments:@[ _errorHandler, [self valueForKey:@"errorString"] ]];
}
- (void)processDidExit:(int)rc
@@ -340,7 +339,7 @@ OAK_DEBUG_VAR(HTMLOutput_JSShellCommand);
+ (HOJSShellCommand*)runShellCommand:(NSString*)aCommand withEnvironment:(const std::map<std::string, std::string>&)someEnvironment andExitHandler:(id)aHandler
{
D(DBF_HTMLOutput_JSShellCommand, bug("%s (handler: %s)\n", [aCommand UTF8String], [[aHandler description] UTF8String]););
HOJSShellCommand* res = [[[self alloc] initWithCommand:aCommand andEnvironment:someEnvironment] autorelease];
HOJSShellCommand* res = [[self alloc] initWithCommand:aCommand andEnvironment:someEnvironment];
res.exitHandler = aHandler;
[res launchAndWait:aHandler == nil];
return res;
@@ -349,9 +348,7 @@ OAK_DEBUG_VAR(HTMLOutput_JSShellCommand);
- (void)dealloc
{
D(DBF_HTMLOutput_JSShellCommand, bug("\n"););
[self cancelCommand];
[super dealloc];
}
// =========================
@@ -402,14 +399,14 @@ OAK_DEBUG_VAR(HTMLOutput_JSShellCommand);
{
D(DBF_HTMLOutput_JSShellCommand, bug("%s\n", [[aHandler description] UTF8String]););
self.outputHandler = aHandler;
[outputHandler callWebScriptMethod:@"call" withArguments:@[ outputHandler, [self outputString] ]];
[_outputHandler callWebScriptMethod:@"call" withArguments:@[ _outputHandler, [self outputString] ]];
}
- (void)setOnreaderror:(id)aHandler
{
D(DBF_HTMLOutput_JSShellCommand, bug("%s\n", [[aHandler description] UTF8String]););
self.errorHandler = aHandler;
[errorHandler callWebScriptMethod:@"call" withArguments:@[ errorHandler, [self errorString] ]];
[_errorHandler callWebScriptMethod:@"call" withArguments:@[ _errorHandler, [self errorString] ]];
}
- (void)finalizeForWebScript

View File

@@ -85,11 +85,11 @@
std::string str;
if([encoding isEqualToString:@"utf-8"])
str = to_s((NSString*)[[[NSString alloc] initWithData:[dataSource data] encoding:NSUTF8StringEncoding] autorelease]);
str = to_s((NSString*)[[NSString alloc] initWithData:[dataSource data] encoding:NSUTF8StringEncoding]);
else if([encoding isEqualToString:@"utf-16"] || [encoding isEqualToString:@"utf16"])
str = to_s((NSString*)[[[NSString alloc] initWithData:[dataSource data] encoding:NSUnicodeStringEncoding] autorelease]);
str = to_s((NSString*)[[NSString alloc] initWithData:[dataSource data] encoding:NSUnicodeStringEncoding]);
else if([encoding isEqualToString:@"macintosh"])
str = to_s((NSString*)[[[NSString alloc] initWithData:[dataSource data] encoding:NSMacOSRomanStringEncoding] autorelease]);
str = to_s((NSString*)[[NSString alloc] initWithData:[dataSource data] encoding:NSMacOSRomanStringEncoding]);
else
return (void)NSRunAlertPanel(@"Unknown Encoding", @"The encoding used for this HTML buffer (“%@”) is unsupported.\nPlease file a bug report stating the encoding name and how you got to it.", @"Continue", nil, nil, [dataSource textEncodingName]);