Title: [176483] trunk/Source/WebKit2
Revision
176483
Author
conrad_shu...@apple.com
Date
2014-11-21 16:07:46 -0800 (Fri, 21 Nov 2014)

Log Message

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.

Modified Paths

Diff

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
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to