diff --git a/AppKit/CPWebView.j b/AppKit/CPWebView.j index cd4876675..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) { @@ -181,7 +206,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 +229,8 @@ CPWebViewScrollNative = 2; [_frameView setFrameSize:CGSizeMake(800, 1600)]; } + + [_frameView scrollRectToVisible:visibleRect]; } } } @@ -256,6 +284,8 @@ CPWebViewScrollNative = 2; [self _setScrollMode:CPWebViewScrollAppKit]; + [_frameView setFrameSize:[_scrollView contentSize]]; + [self _startedLoading]; _ignoreLoadStart = YES; @@ -315,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]; 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;