Title: [177601] trunk/Source/WebKit2
Revision
177601
Author
bda...@apple.com
Date
2014-12-19 16:13:14 -0800 (Fri, 19 Dec 2014)

Log Message

Preview popovers don't show an arrow for large links
https://bugs.webkit.org/show_bug.cgi?id=139842
-and corresponding-
<rdar://problem/19301470>

Reviewed by Tim Horton.

This patch addresses the case where the link is so large that there is no 
available space on any side once you factor in screen padding. In that case, we 
should give up early on not obscuring the link.
* UIProcess/mac/WKPreviewPopoverAnimationController.mm:
(-[WKPreviewPopoverAnimationController _targetSizeForPagePreview]):
(-[WKPreviewPopoverAnimationController _effectivePaddingWithPreviewPadding:]):
(-[WKPreviewPopoverAnimationController _maxSpaceAvailableOnYEdgeForOriginRect:withScreenRect:previewPadding:]):
(-[WKPreviewPopoverAnimationController _maxSpaceAvailableOnXEdgeForOriginRect:withScreenRect:previewPadding:]):
(-[WKPreviewPopoverAnimationController _preferredPopoverSizeWithPreviewPadding:forTargetSize:]):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (177600 => 177601)


--- trunk/Source/WebKit2/ChangeLog	2014-12-19 23:54:14 UTC (rev 177600)
+++ trunk/Source/WebKit2/ChangeLog	2014-12-20 00:13:14 UTC (rev 177601)
@@ -1,3 +1,22 @@
+2014-12-19  Beth Dakin  <bda...@apple.com>
+
+        Preview popovers don't show an arrow for large links
+        https://bugs.webkit.org/show_bug.cgi?id=139842
+        -and corresponding-
+        <rdar://problem/19301470>
+
+        Reviewed by Tim Horton.
+
+        This patch addresses the case where the link is so large that there is no 
+        available space on any side once you factor in screen padding. In that case, we 
+        should give up early on not obscuring the link.
+        * UIProcess/mac/WKPreviewPopoverAnimationController.mm:
+        (-[WKPreviewPopoverAnimationController _targetSizeForPagePreview]):
+        (-[WKPreviewPopoverAnimationController _effectivePaddingWithPreviewPadding:]):
+        (-[WKPreviewPopoverAnimationController _maxSpaceAvailableOnYEdgeForOriginRect:withScreenRect:previewPadding:]):
+        (-[WKPreviewPopoverAnimationController _maxSpaceAvailableOnXEdgeForOriginRect:withScreenRect:previewPadding:]):
+        (-[WKPreviewPopoverAnimationController _preferredPopoverSizeWithPreviewPadding:forTargetSize:]):
+
 2014-12-19  Timothy Horton  <timothy_hor...@apple.com>
 
         WKView's ignoresNonWheelEvents should ignore immediate actions

Modified: trunk/Source/WebKit2/UIProcess/mac/WKPreviewPopoverAnimationController.mm (177600 => 177601)


--- trunk/Source/WebKit2/UIProcess/mac/WKPreviewPopoverAnimationController.mm	2014-12-19 23:54:14 UTC (rev 177600)
+++ trunk/Source/WebKit2/UIProcess/mac/WKPreviewPopoverAnimationController.mm	2014-12-20 00:13:14 UTC (rev 177601)
@@ -42,6 +42,8 @@
 @interface WKPreviewPopoverAnimationController () <WKPagePreviewViewControllerDelegate, NSPopoverDelegate>
 @end
 
+static const CGFloat preferredPopoverToViewScale = 0.75;
+
 @implementation WKPreviewPopoverAnimationController
 
 + (bool)_shouldImmediatelyShowPreview
@@ -193,38 +195,63 @@
 
 - (NSSize)_targetSizeForPagePreview
 {
-    static const CGFloat preferredPopoverToViewScale = 0.75;
     NSRect wkViewBounds = _wkView.bounds;
     return NSMakeSize(NSWidth(wkViewBounds) * preferredPopoverToViewScale, NSHeight(wkViewBounds) * preferredPopoverToViewScale);
 }
 
+- (NSSize)_effectivePaddingWithPreviewPadding:(NSSize)previewPadding
+{
+    static const NSSize screenPadding = NSMakeSize(40, 40);
+    NSSize effectivePadding = NSMakeSize(screenPadding.width + previewPadding.width, screenPadding.height + previewPadding.height);
+    return effectivePadding;
+}
+
+- (NSSize)_maxSpaceAvailableOnYEdgeForOriginRect:(NSRect)originRect withScreenRect:(NSRect)screenRect previewPadding:(NSSize)previewPadding
+{
+    CGFloat availableSpaceAbove = NSMaxY(screenRect) - NSMaxY(originRect);
+    CGFloat availableSpaceBelow = NSMinY(originRect) - NSMinY(screenRect);
+    NSSize effectivePadding = [self _effectivePaddingWithPreviewPadding:previewPadding];
+    CGFloat maxAvailableVerticalSpace = fmax(availableSpaceAbove, availableSpaceBelow) - effectivePadding.height;
+    return NSMakeSize(screenRect.size.width - effectivePadding.height, maxAvailableVerticalSpace);
+}
+
+- (NSSize)_maxSpaceAvailableOnXEdgeForOriginRect:(NSRect)originRect withScreenRect:(NSRect)screenRect previewPadding:(NSSize)previewPadding
+{
+    CGFloat availableSpaceAtLeft = NSMinX(originRect) - NSMinX(screenRect);
+    CGFloat availableSpaceAtRight = NSMaxX(screenRect) - NSMaxX(originRect);
+    NSSize effectivePadding = [self _effectivePaddingWithPreviewPadding:previewPadding];
+    CGFloat maxAvailableHorizontalSpace = fmax(availableSpaceAtLeft, availableSpaceAtRight) - effectivePadding.width;
+    return NSMakeSize(maxAvailableHorizontalSpace, screenRect.size.height - effectivePadding.width);
+}
+
 - (NSSize)_preferredPopoverSizeWithPreviewPadding:(NSSize)previewPadding forTargetSize:(NSSize)targetSize
 {
-    static const NSSize screenPadding = NSMakeSize(40, 40);
     static const NSSize smallestPopoverSize = NSMakeSize(500, 500);
 
-    const NSSize effectivePadding = NSMakeSize(screenPadding.width + previewPadding.width, screenPadding.height + previewPadding.height);
-
     NSWindow *window = _wkView.window;
     NSRect originScreenRect = [window convertRectToScreen:[_wkView convertRect:_popoverOriginRect toView:nil]];
     NSRect screenFrame = window.screen.visibleFrame;
 
     NSSize largestPopoverSize = [self largestPopoverSize];
 
-    CGFloat availableSpaceAbove = NSMaxY(screenFrame) - NSMaxY(originScreenRect);
-    CGFloat availableSpaceBelow = NSMinY(originScreenRect) - NSMinY(screenFrame);
-    CGFloat maxAvailableVerticalSpace = fmax(availableSpaceAbove, availableSpaceBelow) - effectivePadding.height;
-    NSSize maxSpaceAvailableOnYEdge = NSMakeSize(screenFrame.size.width - effectivePadding.height, maxAvailableVerticalSpace);
+    NSSize maxSpaceAvailableOnYEdge = [self _maxSpaceAvailableOnYEdgeForOriginRect:originScreenRect withScreenRect:screenFrame previewPadding:previewPadding];
     if (targetSizeFitsInAvailableSpace(targetSize, maxSpaceAvailableOnYEdge) && targetSizeFitsInAvailableSpace(targetSize, largestPopoverSize))
         return targetSize;
 
-    CGFloat availableSpaceAtLeft = NSMinX(originScreenRect) - NSMinX(screenFrame);
-    CGFloat availableSpaceAtRight = NSMaxX(screenFrame) - NSMaxX(originScreenRect);
-    CGFloat maxAvailableHorizontalSpace = fmax(availableSpaceAtLeft, availableSpaceAtRight) - effectivePadding.width;
-    NSSize maxSpaceAvailableOnXEdge = NSMakeSize(maxAvailableHorizontalSpace, screenFrame.size.height - effectivePadding.width);
+    NSSize maxSpaceAvailableOnXEdge = [self _maxSpaceAvailableOnXEdgeForOriginRect:originScreenRect withScreenRect:screenFrame previewPadding:previewPadding];
     if (targetSizeFitsInAvailableSpace(targetSize, maxSpaceAvailableOnXEdge) && targetSizeFitsInAvailableSpace(targetSize, largestPopoverSize))
         return targetSize;
 
+    // If the originScreenRect is very large, then it's possible that we have negative available space once the screen padding
+    // was taken into account. If that is the case, give up not on not trying to obscure the origin URL.
+    if ((maxSpaceAvailableOnYEdge.width < 0 || maxSpaceAvailableOnYEdge.height < 0) && (maxSpaceAvailableOnXEdge.width < 0 || maxSpaceAvailableOnXEdge.height < 0)) {
+        _popoverOriginRect.origin = _eventLocationInView;
+        _popoverOriginRect.size = NSMakeSize(1, 1);
+        originScreenRect = [window convertRectToScreen:[_wkView convertRect:_popoverOriginRect toView:nil]];
+        maxSpaceAvailableOnYEdge = [self _maxSpaceAvailableOnYEdgeForOriginRect:originScreenRect withScreenRect:screenFrame previewPadding:previewPadding];
+        maxSpaceAvailableOnXEdge = [self _maxSpaceAvailableOnXEdgeForOriginRect:originScreenRect withScreenRect:screenFrame previewPadding:previewPadding];
+    }
+
     // Adjust the maximum space available if it is larger than the largest popover size.
     if (maxSpaceAvailableOnYEdge.width > largestPopoverSize.width && maxSpaceAvailableOnYEdge.height > largestPopoverSize.height)
         maxSpaceAvailableOnYEdge = largestPopoverSize;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to