From 90975c96f9fbe8ca30eb1faf192844fdfe4b42c8 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Wed, 5 May 2010 14:05:09 -0700 Subject: [PATCH 1/4] Updates for scrolling behavior in webview. --- AppKit/CPWebView.j | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/AppKit/CPWebView.j b/AppKit/CPWebView.j index cd4876675..d8c7dff81 100644 --- a/AppKit/CPWebView.j +++ b/AppKit/CPWebView.j @@ -181,7 +181,8 @@ CPWebViewScrollNative = 2; } else { - [_frameView setFrameSize:[_scrollView contentSize]]; + var visibleRect = [_frameView visibleRect]; + [_frameView setFrameSize:CGSizeMake(CGRectGetMaxX(visibleRect), CGRectGetMaxY(visibleRect))]; // try to get the document size so we can correctly set the frame var win = null; @@ -203,6 +204,8 @@ CPWebViewScrollNative = 2; [_frameView setFrameSize:CGSizeMake(800, 1600)]; } + + [_frameView scrollRectToVisible:visibleRect]; } } } @@ -256,6 +259,8 @@ CPWebViewScrollNative = 2; [self _setScrollMode:CPWebViewScrollAppKit]; + [_frameView setFrameSize:[_scrollView contentSize]]; + [self _startedLoading]; _ignoreLoadStart = YES; From 9c9eb519dfe188c9d273df116d5d4eea21f2883d Mon Sep 17 00:00:00 2001 From: Klaas Pieter Annema Date: Thu, 6 May 2010 17:36:11 +0200 Subject: [PATCH 2/4] call willChange* and didChange* methods on the actual classes --- Foundation/CPKeyValueObserving.j | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Foundation/CPKeyValueObserving.j b/Foundation/CPKeyValueObserving.j index b88f766a0..39f29779d 100644 --- a/Foundation/CPKeyValueObserving.j +++ b/Foundation/CPKeyValueObserving.j @@ -480,6 +480,11 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld, - (void)willChangeValueForKey:(CPString)aKey { + var superClass = [self class], + methodSelector = @selector(willChangeValueForKey:), + methodImp = class_getMethodImplementation(superClass, methodSelector); + methodImp(self, methodSelector, aKey); + if (!aKey) return; @@ -490,6 +495,11 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld, - (void)didChangeValueForKey:(CPString)aKey { + var superClass = [self class], + methodSelector = @selector(didChangeValueForKey:), + methodImp = class_getMethodImplementation(superClass, methodSelector); + methodImp(self, methodSelector, aKey); + if (!aKey) return; @@ -498,6 +508,11 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld, - (void)willChange:(CPKeyValueChange)change valuesAtIndexes:(CPIndexSet)indexes forKey:(CPString)aKey { + var superClass = [self class], + methodSelector = @selector(willChange:valuesAtIndexes:forKey:), + methodImp = class_getMethodImplementation(superClass, methodSelector); + methodImp(self, methodSelector, change, indexes, aKey); + if (!aKey) return; @@ -508,6 +523,11 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld, - (void)didChange:(CPKeyValueChange)change valuesAtIndexes:(CPIndexSet)indexes forKey:(CPString)aKey { + var superClass = [self class], + methodSelector = @selector(didChange:valuesAtIndexes:forKey:), + methodImp = class_getMethodImplementation(superClass, methodSelector); + methodImp(self, methodSelector, change, indexes, aKey); + if (!aKey) return; From 542e491bb453ffa12de8d1946f9ec0386b04c655 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Thu, 6 May 2010 11:26:56 -0700 Subject: [PATCH 3/4] whitespace cleanup. --- Foundation/CPKeyValueObserving.j | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/Foundation/CPKeyValueObserving.j b/Foundation/CPKeyValueObserving.j index 39f29779d..9662d5064 100644 --- a/Foundation/CPKeyValueObserving.j +++ b/Foundation/CPKeyValueObserving.j @@ -481,10 +481,11 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld, - (void)willChangeValueForKey:(CPString)aKey { var superClass = [self class], - methodSelector = @selector(willChangeValueForKey:), - methodImp = class_getMethodImplementation(superClass, methodSelector); + methodSelector = @selector(willChangeValueForKey:), + methodImp = class_getMethodImplementation(superClass, methodSelector); + methodImp(self, methodSelector, aKey); - + if (!aKey) return; @@ -496,10 +497,11 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld, - (void)didChangeValueForKey:(CPString)aKey { var superClass = [self class], - methodSelector = @selector(didChangeValueForKey:), - methodImp = class_getMethodImplementation(superClass, methodSelector); + methodSelector = @selector(didChangeValueForKey:), + methodImp = class_getMethodImplementation(superClass, methodSelector); + methodImp(self, methodSelector, aKey); - + if (!aKey) return; @@ -509,10 +511,11 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld, - (void)willChange:(CPKeyValueChange)change valuesAtIndexes:(CPIndexSet)indexes forKey:(CPString)aKey { var superClass = [self class], - methodSelector = @selector(willChange:valuesAtIndexes:forKey:), - methodImp = class_getMethodImplementation(superClass, methodSelector); + methodSelector = @selector(willChange:valuesAtIndexes:forKey:), + methodImp = class_getMethodImplementation(superClass, methodSelector); + methodImp(self, methodSelector, change, indexes, aKey); - + if (!aKey) return; @@ -524,10 +527,11 @@ var kvoNewAndOld = CPKeyValueObservingOptionNew|CPKeyValueObservingOptionOld, - (void)didChange:(CPKeyValueChange)change valuesAtIndexes:(CPIndexSet)indexes forKey:(CPString)aKey { var superClass = [self class], - methodSelector = @selector(didChange:valuesAtIndexes:forKey:), - methodImp = class_getMethodImplementation(superClass, methodSelector); + methodSelector = @selector(didChange:valuesAtIndexes:forKey:), + methodImp = class_getMethodImplementation(superClass, methodSelector); + methodImp(self, methodSelector, change, indexes, aKey); - + if (!aKey) return; From c43b80cb91e92d29b28d7378c8d63be543565c85 Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Thu, 6 May 2010 12:41:01 -0700 Subject: [PATCH 4/4] Make mouse wheel events work in CPWebView in Firefox 3+ --- AppKit/CPWebView.j | 30 ++++++++++++++++++++-- AppKit/Platform/DOM/CPPlatformWindow+DOM.j | 17 +++++++----- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/AppKit/CPWebView.j b/AppKit/CPWebView.j index d8c7dff81..9da31436e 100644 --- a/AppKit/CPWebView.j +++ b/AppKit/CPWebView.j @@ -171,7 +171,32 @@ CPWebViewScrollNative = 2; [self _resizeWebFrame]; } -- (BOOL)_resizeWebFrame +- (void)_attachScrollEventIfNecessary +{ + if (_scrollMode !== CPWebViewScrollAppKit) + return; + + var win = null; + try { win = [self DOMWindow]; } catch (e) {} + + if (win && win.addEventListener) + { + var scrollEventHandler = function(anEvent) + { + var frameBounds = [self bounds], + frameCenter = CGPointMake(CGRectGetMidX(frameBounds), CGRectGetMidY(frameBounds)), + windowOrigin = [self convertPoint:frameCenter toView:nil], + globalOrigin = [[self window] convertBaseToBridge:windowOrigin]; + + anEvent._overrideLocation = globalOrigin; + [[[self window] platformWindow] scrollEvent:anEvent]; + }; + + win.addEventListener("DOMMouseScroll", scrollEventHandler, false); + } +} + +- (void)_resizeWebFrame { if (_scrollMode === CPWebViewScrollAppKit) { @@ -320,7 +345,8 @@ CPWebViewScrollNative = 2; - (void)_finishedLoading { [self _resizeWebFrame]; - + [self _attachScrollEventIfNecessary]; + [[CPNotificationCenter defaultCenter] postNotificationName:CPWebViewProgressFinishedNotification object:self]; if ([_frameLoadDelegate respondsToSelector:@selector(webView:didFinishLoadForFrame:)]) diff --git a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j index 96c542885..a0b9403bb 100644 --- a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j +++ b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j @@ -851,12 +851,13 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop]; if(!aDOMEvent) aDOMEvent = window.event; + var location = nil; if (CPFeatureIsCompatible(CPJavaScriptMouseWheelValues_8_15)) { - var x = 0.0, - y = 0.0, + var x = aDOMEvent._offsetX || 0.0, + y = aDOMEvent._offsetY || 0.0, element = aDOMEvent.target; - + while (element.nodeType !== 1) element = element.parentNode; @@ -870,11 +871,13 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop]; } while (element = element.offsetParent); } - var location = _CGPointMake((x + ((aDOMEvent.clientX - 8) / 15)), (y + ((aDOMEvent.clientY - 8) / 15))); + location = _CGPointMake((x + ((aDOMEvent.clientX - 8) / 15)), (y + ((aDOMEvent.clientY - 8) / 15))); } + else if (aDOMEvent._overrideLocation) + location = aDOMEvent._overrideLocation; else - var location = _CGPointMake(aDOMEvent.clientX, aDOMEvent.clientY); - + location = _CGPointMake(aDOMEvent.clientX, aDOMEvent.clientY); + var deltaX = 0.0, deltaY = 0.0, windowNumber = 0, @@ -883,7 +886,7 @@ var supportsNativeDragAndDrop = [CPPlatform supportsDragAndDrop]; (aDOMEvent.ctrlKey ? CPControlKeyMask : 0) | (aDOMEvent.altKey ? CPAlternateKeyMask : 0) | (aDOMEvent.metaKey ? CPCommandKeyMask : 0); - + StopDOMEventPropagation = YES; var theWindow = [self hitTest:location];