Title: [167740] trunk/Source/WebKit2
- Revision
- 167740
- Author
- simon.fra...@apple.com
- Date
- 2014-04-23 20:31:30 -0700 (Wed, 23 Apr 2014)
Log Message
[iOS WK2] Make -webkit-overflow-scrolling:touch work
https://bugs.webkit.org/show_bug.cgi?id=132097
Reviewed by Tim Horton.
Scrolling of UIScrollViews in content (for -webkit-overflow-scrolling:touch)
depends on them getting hit-tested correctly. UIKit hit testing assumes
that subviews are enclosed by their ancestors, but this is not true of
web content. In addition, we had a root layer that was zero sized.
Fix by overriding hitTest:withEvent: on our content WKViews to hit
test subviews even if they are not enclosed.
* UIProcess/ios/RemoteLayerTreeHostIOS.mm:
(-[UIView _recursiveFindDescendantViewAtPoint:withEvent:]):
(-[UIView _findDescendantViewAtPoint:withEvent:]):
(-[WKCompositingView hitTest:withEvent:]):
(-[WKTransformView hitTest:withEvent:]):
(-[WKRemoteView hitTest:withEvent:]):
(WebKit::RemoteLayerTreeHost::createLayer):
* WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm:
(WebKit::RemoteLayerTreeDrawingArea::updatePreferences):
Update debug borders on the root layer.
(WebKit::RemoteLayerTreeDrawingArea::mainFrameContentSizeChanged):
Size the root layer to the contents size. This isn't strictly necessary
given the hit testing overrides, but seems sensible to do anyway.
Modified Paths
Diff
Modified: trunk/Source/WebKit2/ChangeLog (167739 => 167740)
--- trunk/Source/WebKit2/ChangeLog 2014-04-24 03:31:28 UTC (rev 167739)
+++ trunk/Source/WebKit2/ChangeLog 2014-04-24 03:31:30 UTC (rev 167740)
@@ -1,5 +1,34 @@
2014-04-23 Simon Fraser <simon.fra...@apple.com>
+ [iOS WK2] Make -webkit-overflow-scrolling:touch work
+ https://bugs.webkit.org/show_bug.cgi?id=132097
+
+ Reviewed by Tim Horton.
+
+ Scrolling of UIScrollViews in content (for -webkit-overflow-scrolling:touch)
+ depends on them getting hit-tested correctly. UIKit hit testing assumes
+ that subviews are enclosed by their ancestors, but this is not true of
+ web content. In addition, we had a root layer that was zero sized.
+
+ Fix by overriding hitTest:withEvent: on our content WKViews to hit
+ test subviews even if they are not enclosed.
+
+ * UIProcess/ios/RemoteLayerTreeHostIOS.mm:
+ (-[UIView _recursiveFindDescendantViewAtPoint:withEvent:]):
+ (-[UIView _findDescendantViewAtPoint:withEvent:]):
+ (-[WKCompositingView hitTest:withEvent:]):
+ (-[WKTransformView hitTest:withEvent:]):
+ (-[WKRemoteView hitTest:withEvent:]):
+ (WebKit::RemoteLayerTreeHost::createLayer):
+ * WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm:
+ (WebKit::RemoteLayerTreeDrawingArea::updatePreferences):
+ Update debug borders on the root layer.
+ (WebKit::RemoteLayerTreeDrawingArea::mainFrameContentSizeChanged):
+ Size the root layer to the contents size. This isn't strictly necessary
+ given the hit testing overrides, but seems sensible to do anyway.
+
+2014-04-23 Simon Fraser <simon.fra...@apple.com>
+
Nonopaque layers double-paint with UI-side compositing
https://bugs.webkit.org/show_bug.cgi?id=132101
Modified: trunk/Source/WebKit2/UIProcess/ios/RemoteLayerTreeHostIOS.mm (167739 => 167740)
--- trunk/Source/WebKit2/UIProcess/ios/RemoteLayerTreeHostIOS.mm 2014-04-24 03:31:28 UTC (rev 167739)
+++ trunk/Source/WebKit2/UIProcess/ios/RemoteLayerTreeHostIOS.mm 2014-04-24 03:31:30 UTC (rev 167740)
@@ -41,6 +41,53 @@
- (void)setContextId:(uint32_t)contextID;
@end
+@interface UIView (WKHitTesting)
+- (UIView *)_findDescendantViewAtPoint:(CGPoint)point withEvent:(UIEvent *)event;
+@end
+
+@implementation UIView (WKHitTesting)
+
+// UIView hit testing assumes that views should only hit test subviews that are entirely contained
+// in the view. This is not true of web content.
+- (UIView *)_recursiveFindDescendantViewAtPoint:(CGPoint)point withEvent:(UIEvent *)event
+{
+ if (self.clipsToBounds && ![self pointInside:point withEvent:event])
+ return nil;
+
+ __block UIView *foundView = nil;
+ [[self subviews] enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) {
+ CGPoint subviewPoint = [view convertPoint:point fromView:self];
+
+ if ([view pointInside:subviewPoint withEvent:event])
+ foundView = view;
+
+ if (![view subviews])
+ return;
+
+ if (UIView *hitView = [view _recursiveFindDescendantViewAtPoint:subviewPoint withEvent:event])
+ foundView = hitView;
+ }];
+
+ return foundView;
+}
+
+- (UIView *)_findDescendantViewAtPoint:(CGPoint)point withEvent:(UIEvent *)event
+{
+ return [self _recursiveFindDescendantViewAtPoint:point withEvent:event];
+}
+
+@end
+
+@interface WKCompositingView : UIView
+@end
+
+@implementation WKCompositingView
+- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
+{
+ return [self _findDescendantViewAtPoint:point withEvent:event];
+}
+@end
+
@interface WKTransformView : UIView
@end
@@ -49,6 +96,11 @@
{
return [CATransformLayer self];
}
+
+- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
+{
+ return [self _findDescendantViewAtPoint:point withEvent:event];
+}
@end
@interface WKRemoteView : UIView
@@ -68,6 +120,12 @@
{
return NSClassFromString(@"CALayerHost");
}
+
+- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
+{
+ return [self _findDescendantViewAtPoint:point withEvent:event];
+}
+
@end
namespace WebKit {
@@ -89,7 +147,7 @@
if (layerProperties && layerProperties->customBehavior == GraphicsLayer::CustomScrollingBehavior)
layerOrView = adoptNS([[UIScrollView alloc] init]);
else
- layerOrView = adoptNS([[UIView alloc] init]);
+ layerOrView = adoptNS([[WKCompositingView alloc] init]);
break;
case PlatformCALayer::LayerTypeTransformLayer:
layerOrView = adoptNS([[WKTransformView alloc] init]);
@@ -98,7 +156,7 @@
if (!m_isDebugLayerTreeHost)
layerOrView = adoptNS([[WKRemoteView alloc] initWithFrame:CGRectZero contextID:properties.hostingContextID]);
else
- layerOrView = adoptNS([[UIView alloc] init]);
+ layerOrView = adoptNS([[WKCompositingView alloc] init]);
break;
default:
ASSERT_NOT_REACHED();
Modified: trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm (167739 => 167740)
--- trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm 2014-04-24 03:31:28 UTC (rev 167739)
+++ trunk/Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm 2014-04-24 03:31:30 UTC (rev 167740)
@@ -119,6 +119,8 @@
// in order to be scrolled by the ScrollingCoordinator.
settings.setAcceleratedCompositingForFixedPositionEnabled(true);
settings.setFixedPositionCreatesStackingContext(true);
+
+ m_rootLayer->setShowDebugBorder(settings.showDebugBorders());
}
#if PLATFORM(IOS)
@@ -295,8 +297,9 @@
}
}
-void RemoteLayerTreeDrawingArea::mainFrameContentSizeChanged(const IntSize&)
+void RemoteLayerTreeDrawingArea::mainFrameContentSizeChanged(const IntSize& contentsSize)
{
+ m_rootLayer->setSize(contentsSize);
m_webPage->pageOverlayController().didChangeDocumentSize();
}
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes