Modified: trunk/Source/WebKit2/ChangeLog (176482 => 176483)
--- trunk/Source/WebKit2/ChangeLog 2014-11-22 00:04:58 UTC (rev 176482)
+++ trunk/Source/WebKit2/ChangeLog 2014-11-22 00:07:46 UTC (rev 176483)
@@ -1,3 +1,29 @@
+2014-11-21 Conrad Shultz <conrad_shu...@apple.com>
+
+ Page previews should have a margin.
+ https://bugs.webkit.org/show_bug.cgi?id=138990
+
+ Reviewed by Beth Dakin.
+
+ Enclose the WKWebView (or client-supplied preview view) in a container slightly larger
+ than the preview view. Adjust sizing code to accommodate the margin.
+
+ * UIProcess/mac/WKActionMenuController.mm:
+ (+[WKPagePreviewViewController previewPadding]):
+ Return the total amount of fixed padding surrounding the preview
+ (-[WKPagePreviewViewController loadView]):
+ Store the actual previewView in an ivar so that clients can distinguish it from the container
+ view; wrap the preview in a container view; set frames appropriately.
+ (-[WKActionMenuController _createPreviewPopover]):
+ Update to reflect method rename; supplement the popover size with the fixed padding.
+ (-[WKActionMenuController _preferredPopoverSizeWithPreviewPadding:]):
+ Renamed from -_preferredPopoverSize; account for the fixed padding when computing the preferred size.
+ (-[WKActionMenuController _clearPreviewPopover]):
+ Use the previewView ivar instead of the view controller's view.
+ (-[WKActionMenuController pagePreviewViewControllerWasClicked:]):
+ Ditto.
+ (-[WKActionMenuController _preferredPopoverSize]): Deleted.
+
2014-11-21 Tim Horton <timothy_hor...@apple.com>
REGRESSION (r176415): Can get stuck, unable to invoke any DataDetectors popovers
Modified: trunk/Source/WebKit2/UIProcess/mac/WKActionMenuController.mm (176482 => 176483)
--- trunk/Source/WebKit2/UIProcess/mac/WKActionMenuController.mm 2014-11-22 00:04:58 UTC (rev 176482)
+++ trunk/Source/WebKit2/UIProcess/mac/WKActionMenuController.mm 2014-11-22 00:07:46 UTC (rev 176483)
@@ -71,6 +71,8 @@
#if WK_API_ENABLED
+static const CGFloat previewViewInset = 3;
+
@class WKPagePreviewViewController;
@protocol WKPagePreviewViewControllerDelegate <NSObject>
@@ -82,12 +84,15 @@
@public
NSSize _mainViewSize;
RetainPtr<NSURL> _url;
+ RetainPtr<NSView> _previewView;
id <WKPagePreviewViewControllerDelegate> _delegate;
CGFloat _popoverToViewScale;
}
- (instancetype)initWithPageURL:(NSURL *)URL mainViewSize:(NSSize)size popoverToViewScale:(CGFloat)scale;
++ (NSSize)previewPadding;
+
@end
@implementation WKPagePreviewViewController
@@ -104,26 +109,42 @@
return self;
}
++ (NSSize)previewPadding
+{
+ return NSMakeSize(2 * previewViewInset, 2 * previewViewInset);
+}
+
- (void)loadView
{
NSRect defaultFrame = NSMakeRect(0, 0, _mainViewSize.width, _mainViewSize.height);
- RetainPtr<NSView> previewView = [_delegate pagePreviewViewController:self viewForPreviewingURL:_url.get() initialFrameSize:defaultFrame.size];
- if (!previewView) {
+ _previewView = [_delegate pagePreviewViewController:self viewForPreviewingURL:_url.get() initialFrameSize:defaultFrame.size];
+ if (!_previewView) {
RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:defaultFrame]);
[webView _setIgnoresNonWheelMouseEvents:YES];
if (_url) {
NSURLRequest *request = [NSURLRequest requestWithURL:_url.get()];
[webView loadRequest:request];
}
- previewView = webView;
+ _previewView = webView;
}
+ RetainPtr<NSClickGestureRecognizer> clickRecognizer = adoptNS([[NSClickGestureRecognizer alloc] initWithTarget:self action:@selector(_clickRecognized:)]);
+ [_previewView addGestureRecognizer:clickRecognizer.get()];
+
+ NSRect previewFrame = [_previewView frame];
+ NSRect containerFrame = previewFrame;
+ containerFrame.size.width += 2 * previewViewInset;
+ containerFrame.size.height += 2 * previewViewInset;
+ previewFrame = NSOffsetRect(previewFrame, previewViewInset, previewViewInset);
+
+ RetainPtr<NSView> containerView = adoptNS([[NSView alloc] initWithFrame:containerFrame]);
+ [containerView addSubview:_previewView.get()];
+ [_previewView setFrame:previewFrame];
+
// Setting the webView bounds will scale it to 75% of the _mainViewSize.
- [previewView setBounds:NSMakeRect(0, 0, _mainViewSize.width / _popoverToViewScale, _mainViewSize.height / _popoverToViewScale)];
+ [_previewView setBounds:NSMakeRect(0, 0, _mainViewSize.width / _popoverToViewScale, _mainViewSize.height / _popoverToViewScale)];
- RetainPtr<NSClickGestureRecognizer> clickRecognizer = adoptNS([[NSClickGestureRecognizer alloc] initWithTarget:self action:@selector(_clickRecognized:)]);
- [previewView addGestureRecognizer:clickRecognizer.get()];
- self.view = previewView.get();
+ self.view = containerView.get();
}
- (void)_clickRecognized:(NSGestureRecognizer *)gestureRecognizer
@@ -350,8 +371,12 @@
NSURL *url = "" _web_URLWithWTFString:hitTestResult->absoluteLinkURL()];
_popoverOriginRect = hitTestResult->elementBoundingBox();
- NSSize popoverSize = [self _preferredPopoverSize];
+ NSSize previewPadding = [WKPagePreviewViewController previewPadding];
+ NSSize popoverSize = [self _preferredPopoverSizeWithPreviewPadding:previewPadding];
CGFloat actualPopoverToViewScale = popoverSize.width / NSWidth(_wkView.bounds);
+ popoverSize.width += previewPadding.width;
+ popoverSize.height += previewPadding.height;
+
_previewViewController = adoptNS([[WKPagePreviewViewController alloc] initWithPageURL:url mainViewSize:_wkView.bounds.size popoverToViewScale:actualPopoverToViewScale]);
_previewViewController->_delegate = self;
[_previewViewController loadView];
@@ -387,12 +412,14 @@
return NSMakeSize(1324, 940);
}
-- (NSSize)_preferredPopoverSize
+- (NSSize)_preferredPopoverSizeWithPreviewPadding:(NSSize)previewPadding
{
static const CGFloat preferredPopoverToViewScale = 0.75;
- static const CGFloat screenPadding = 40;
+ static const NSSize screenPadding = {40, 40};
static const NSSize smallestPopoverSize = NSMakeSize(500, 300);
+ 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;
@@ -403,15 +430,15 @@
CGFloat availableSpaceAbove = NSMaxY(screenFrame) - NSMaxY(originScreenRect);
CGFloat availableSpaceBelow = NSMinY(originScreenRect) - NSMinY(screenFrame);
- CGFloat maxAvailableVerticalSpace = fmax(availableSpaceAbove, availableSpaceBelow) - screenPadding;
- NSSize maxSpaceAvailableOnYEdge = NSMakeSize(screenFrame.size.width - screenPadding, maxAvailableVerticalSpace);
+ CGFloat maxAvailableVerticalSpace = fmax(availableSpaceAbove, availableSpaceBelow) - effectivePadding.height;
+ NSSize maxSpaceAvailableOnYEdge = NSMakeSize(screenFrame.size.width - effectivePadding.height, maxAvailableVerticalSpace);
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) - screenPadding;
- NSSize maxSpaceAvailableOnXEdge = NSMakeSize(maxAvailableHorizontalSpace, screenFrame.size.height - screenPadding);
+ CGFloat maxAvailableHorizontalSpace = fmax(availableSpaceAtLeft, availableSpaceAtRight) - effectivePadding.width;
+ NSSize maxSpaceAvailableOnXEdge = NSMakeSize(maxAvailableHorizontalSpace, screenFrame.size.height - effectivePadding.width);
if (targetSizeFitsInAvailableSpace(targetSize, maxSpaceAvailableOnXEdge) && targetSizeFitsInAvailableSpace(targetSize, largestPopoverSize))
return targetSize;
@@ -458,7 +485,7 @@
#if WK_API_ENABLED
if (_previewViewController) {
_previewViewController->_delegate = nil;
- [_wkView _finishPreviewingURL:_previewViewController->_url.get() withPreviewView:[_previewViewController view]];
+ [_wkView _finishPreviewingURL:_previewViewController->_url.get() withPreviewView:_previewViewController->_previewView.get()];
_previewViewController = nil;
}
#endif
@@ -1063,7 +1090,7 @@
- (void)pagePreviewViewControllerWasClicked:(WKPagePreviewViewController *)pagePreviewViewController
{
if (NSURL *url = ""
- [_wkView _handleClickInPreviewView:pagePreviewViewController.view URL:url];
+ [_wkView _handleClickInPreviewView:pagePreviewViewController->_previewView.get() URL:url];
}
#endif