<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[177601] trunk/Source/WebKit2</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/177601">177601</a></dd>
<dt>Author</dt> <dd>bdakin@apple.com</dd>
<dt>Date</dt> <dd>2014-12-19 16:13:14 -0800 (Fri, 19 Dec 2014)</dd>
</dl>

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

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:]):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessmacWKPreviewPopoverAnimationControllermm">trunk/Source/WebKit2/UIProcess/mac/WKPreviewPopoverAnimationController.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (177600 => 177601)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2014-12-19  Beth Dakin  &lt;bdakin@apple.com&gt;
+
+        Preview popovers don't show an arrow for large links
+        https://bugs.webkit.org/show_bug.cgi?id=139842
+        -and corresponding-
+        &lt;rdar://problem/19301470&gt;
+
+        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:]):
+
</ins><span class="cx"> 2014-12-19  Timothy Horton  &lt;timothy_horton@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         WKView's ignoresNonWheelEvents should ignore immediate actions
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessmacWKPreviewPopoverAnimationControllermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/mac/WKPreviewPopoverAnimationController.mm (177600 => 177601)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -42,6 +42,8 @@
</span><span class="cx"> @interface WKPreviewPopoverAnimationController () &lt;WKPagePreviewViewControllerDelegate, NSPopoverDelegate&gt;
</span><span class="cx"> @end
</span><span class="cx"> 
</span><ins>+static const CGFloat preferredPopoverToViewScale = 0.75;
+
</ins><span class="cx"> @implementation WKPreviewPopoverAnimationController
</span><span class="cx"> 
</span><span class="cx"> + (bool)_shouldImmediatelyShowPreview
</span><span class="lines">@@ -193,38 +195,63 @@
</span><span class="cx"> 
</span><span class="cx"> - (NSSize)_targetSizeForPagePreview
</span><span class="cx"> {
</span><del>-    static const CGFloat preferredPopoverToViewScale = 0.75;
</del><span class="cx">     NSRect wkViewBounds = _wkView.bounds;
</span><span class="cx">     return NSMakeSize(NSWidth(wkViewBounds) * preferredPopoverToViewScale, NSHeight(wkViewBounds) * preferredPopoverToViewScale);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (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);
+}
+
</ins><span class="cx"> - (NSSize)_preferredPopoverSizeWithPreviewPadding:(NSSize)previewPadding forTargetSize:(NSSize)targetSize
</span><span class="cx"> {
</span><del>-    static const NSSize screenPadding = NSMakeSize(40, 40);
</del><span class="cx">     static const NSSize smallestPopoverSize = NSMakeSize(500, 500);
</span><span class="cx"> 
</span><del>-    const NSSize effectivePadding = NSMakeSize(screenPadding.width + previewPadding.width, screenPadding.height + previewPadding.height);
-
</del><span class="cx">     NSWindow *window = _wkView.window;
</span><span class="cx">     NSRect originScreenRect = [window convertRectToScreen:[_wkView convertRect:_popoverOriginRect toView:nil]];
</span><span class="cx">     NSRect screenFrame = window.screen.visibleFrame;
</span><span class="cx"> 
</span><span class="cx">     NSSize largestPopoverSize = [self largestPopoverSize];
</span><span class="cx"> 
</span><del>-    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);
</del><ins>+    NSSize maxSpaceAvailableOnYEdge = [self _maxSpaceAvailableOnYEdgeForOriginRect:originScreenRect withScreenRect:screenFrame previewPadding:previewPadding];
</ins><span class="cx">     if (targetSizeFitsInAvailableSpace(targetSize, maxSpaceAvailableOnYEdge) &amp;&amp; targetSizeFitsInAvailableSpace(targetSize, largestPopoverSize))
</span><span class="cx">         return targetSize;
</span><span class="cx"> 
</span><del>-    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);
</del><ins>+    NSSize maxSpaceAvailableOnXEdge = [self _maxSpaceAvailableOnXEdgeForOriginRect:originScreenRect withScreenRect:screenFrame previewPadding:previewPadding];
</ins><span class="cx">     if (targetSizeFitsInAvailableSpace(targetSize, maxSpaceAvailableOnXEdge) &amp;&amp; targetSizeFitsInAvailableSpace(targetSize, largestPopoverSize))
</span><span class="cx">         return targetSize;
</span><span class="cx"> 
</span><ins>+    // 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 &lt; 0 || maxSpaceAvailableOnYEdge.height &lt; 0) &amp;&amp; (maxSpaceAvailableOnXEdge.width &lt; 0 || maxSpaceAvailableOnXEdge.height &lt; 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];
+    }
+
</ins><span class="cx">     // Adjust the maximum space available if it is larger than the largest popover size.
</span><span class="cx">     if (maxSpaceAvailableOnYEdge.width &gt; largestPopoverSize.width &amp;&amp; maxSpaceAvailableOnYEdge.height &gt; largestPopoverSize.height)
</span><span class="cx">         maxSpaceAvailableOnYEdge = largestPopoverSize;
</span></span></pre>
</div>
</div>

</body>
</html>