Changeset 186008 in webkit


Ignore:
Timestamp:
Jun 26, 2015 2:24:03 PM (9 years ago)
Author:
Beth Dakin
Message:

Add support for image previews
https://bugs.webkit.org/show_bug.cgi?id=146350
-and corresponding-
rdar://problem/20640234

Reviewed by Tim Horton.

For images, use the actual image instead of a snapshot.

  • WebProcess/WebPage/ios/WebPageIOS.mm:

(WebKit::WebPage::getPositionInformation):

ViewController for image preview.

  • UIProcess/WKImagePreviewViewController.h: Added.
  • UIProcess/WKImagePreviewViewController.mm: Added.

(-[WKImagePreviewViewController loadView]):
(-[WKImagePreviewViewController initWithCGImage:]):
(-[WKImagePreviewViewController viewDidLayoutSubviews]):
(_scaleSizeWithinSize):

New enum and member variable to keep track of preview type.

  • UIProcess/ios/WKContentViewInteraction.h:
  • UIProcess/ios/WKContentViewInteraction.mm:

Only apply the http restriction to non-image links since we can still preview the
image of a non-http image link.
(-[WKContentView gestureRecognizerShouldBegin:]):

Handle links and images.
(-[WKContentView previewViewControllerForPosition:inSourceView:]):

Return early for non-link previews.
(-[WKContentView commitPreviewViewController:]):

New files.

  • WebKit2.xcodeproj/project.pbxproj:

Just use the actual image in the PositionInformation for image elements rather
than taking a screen shot.

  • WebProcess/WebPage/ios/WebPageIOS.mm:

(WebKit::WebPage::getPositionInformation):

Location:
trunk/Source/WebKit2
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r186002 r186008  
     12015-06-26  Beth Dakin  <bdakin@apple.com>
     2
     3        Add support for image previews
     4        https://bugs.webkit.org/show_bug.cgi?id=146350
     5        -and corresponding-
     6        rdar://problem/20640234
     7
     8        Reviewed by Tim Horton.
     9
     10        For images, use the actual image instead of a snapshot.
     11        * WebProcess/WebPage/ios/WebPageIOS.mm:
     12        (WebKit::WebPage::getPositionInformation):
     13
     14        ViewController for image preview.
     15        * UIProcess/WKImagePreviewViewController.h: Added.
     16        * UIProcess/WKImagePreviewViewController.mm: Added.
     17        (-[WKImagePreviewViewController loadView]):
     18        (-[WKImagePreviewViewController initWithCGImage:]):
     19        (-[WKImagePreviewViewController viewDidLayoutSubviews]):
     20        (_scaleSizeWithinSize):
     21
     22        New enum and member variable to keep track of preview type.
     23        * UIProcess/ios/WKContentViewInteraction.h:
     24        * UIProcess/ios/WKContentViewInteraction.mm:
     25
     26        Only apply the http restriction to non-image links since we can still preview the
     27        image of a non-http image link.
     28        (-[WKContentView gestureRecognizerShouldBegin:]):
     29
     30        Handle links and images.
     31        (-[WKContentView previewViewControllerForPosition:inSourceView:]):
     32
     33        Return early for non-link previews.
     34        (-[WKContentView commitPreviewViewController:]):
     35
     36        New files.
     37        * WebKit2.xcodeproj/project.pbxproj:
     38
     39        Just use the actual image in the PositionInformation for image elements rather
     40        than taking a screen shot.
     41        * WebProcess/WebPage/ios/WebPageIOS.mm:
     42        (WebKit::WebPage::getPositionInformation):
     43
    1442015-06-26  Matt Rajca  <mrajca@apple.com>
    245
  • trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.h

    r184061 r186008  
    9494    UIWKAutocorrectionContextHandler autocorrectionContextHandler;
    9595};
     96
     97enum class PreviewElementType {
     98    None = 0,
     99    Link,
     100    Image
     101};
     102
    96103}
    97104
     
    121128    RetainPtr<WKFileUploadPanel> _fileUploadPanel;
    122129    RetainPtr<UIGestureRecognizer> _previewGestureRecognizer;
     130    WebKit::PreviewElementType _previewType;
    123131
    124132    std::unique_ptr<WebKit::SmartMagnificationController> _smartMagnificationController;
  • trunk/Source/WebKit2/UIProcess/ios/WKContentViewInteraction.mm

    r185748 r186008  
    4242#import "WKFormInputControl.h"
    4343#import "WKFormSelectControl.h"
     44#import "WKImagePreviewViewController.h"
    4445#import "WKInspectorNodeSearchGestureRecognizer.h"
     46#import "WKNSURLExtras.h"
    4547#import "WKUIDelegatePrivate.h"
    4648#import "WKWebViewConfiguration.h"
     
    959961
    960962        String absoluteLinkURL = _positionInformation.url;
    961         if (absoluteLinkURL.isEmpty() || !WebCore::protocolIsInHTTPFamily(absoluteLinkURL))
     963        if (_positionInformation.clickableElementName == "A" && (absoluteLinkURL.isEmpty() || !WebCore::protocolIsInHTTPFamily(absoluteLinkURL)))
    962964            return NO;
    963965    }
     
    31193121    ASSERT(self == sourceView);
    31203122
    3121     if (_positionInformation.clickableElementName != "A" && _positionInformation.clickableElementName != "IMG")
     3123    _previewType = PreviewElementType::None;
     3124
     3125    BOOL canShowImagePreview = _positionInformation.clickableElementName == "IMG";
     3126    BOOL canShowLinkPreview = _positionInformation.clickableElementName == "A" || canShowImagePreview;
     3127
     3128    if (!canShowLinkPreview && !canShowImagePreview)
    31223129        return nil;
    31233130
    31243131    String absoluteLinkURL = _positionInformation.url;
    3125     if (absoluteLinkURL.isEmpty() || !WebCore::protocolIsInHTTPFamily(absoluteLinkURL))
     3132    if (absoluteLinkURL.isEmpty() || !WebCore::protocolIsInHTTPFamily(absoluteLinkURL)) {
     3133        if (canShowLinkPreview && !canShowImagePreview)
     3134            return nil;
     3135        canShowLinkPreview = NO;
     3136    }
     3137
     3138    if (canShowLinkPreview) {
     3139        _previewType = PreviewElementType::Link;
     3140        NSURL *targetURL = [NSURL _web_URLWithWTFString:_positionInformation.url];
     3141        id<WKUIDelegatePrivate> uiDelegate = static_cast<id <WKUIDelegatePrivate>>([_webView UIDelegate]);
     3142        if ([uiDelegate respondsToSelector:@selector(_webView:previewViewControllerForURL:)]) {
     3143            _highlightLongPressCanClick = NO;
     3144            return [uiDelegate _webView:_webView previewViewControllerForURL:targetURL];
     3145        }
     3146#if HAVE(SAFARI_SERVICES_FRAMEWORK)
     3147        SFSafariViewController *previewViewController = [allocSFSafariViewControllerInstance() initWithURL:targetURL];
     3148        previewViewController._showingLinkPreview = YES;
     3149        _highlightLongPressCanClick = NO;
     3150        return [previewViewController autorelease];
     3151#else
    31263152        return nil;
    3127 
    3128     NSURL *targetURL = [NSURL URLWithString:_positionInformation.url];
    3129     id<WKUIDelegatePrivate> uiDelegate = static_cast<id <WKUIDelegatePrivate>>([_webView UIDelegate]);
    3130     if ([uiDelegate respondsToSelector:@selector(_webView:previewViewControllerForURL:)]) {
    3131         _highlightLongPressCanClick = NO;
    3132         return [uiDelegate _webView:_webView previewViewControllerForURL:targetURL];
    3133     }
    3134 
    3135 #if HAVE(SAFARI_SERVICES_FRAMEWORK)
    3136     SFSafariViewController *previewViewController = [allocSFSafariViewControllerInstance() initWithURL:targetURL];
    3137     previewViewController._showingLinkPreview = YES;
    3138     _highlightLongPressCanClick = NO;
    3139     return previewViewController;
    3140 #else
    3141     return nil;
    31423153#endif
     3154    }
     3155
     3156    if (canShowImagePreview) {
     3157        _previewType = PreviewElementType::Image;
     3158        return [[[WKImagePreviewViewController alloc] initWithCGImage:_positionInformation.image->makeCGImageCopy()] autorelease];
     3159    }
     3160
     3161    return nil;
    31433162}
    31443163
    31453164- (void)commitPreviewViewController:(UIViewController *)viewController
    31463165{
     3166    if (_previewType != PreviewElementType::Link)
     3167        return;
     3168
    31473169    id<WKUIDelegatePrivate> uiDelegate = static_cast<id <WKUIDelegatePrivate>>([_webView UIDelegate]);
    31483170    if ([uiDelegate respondsToSelector:@selector(_webView:commitPreviewedViewController:)]) {
  • trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj

    r185936 r186008  
    11871187                9321D58A1A38F196008052BE /* WKImmediateActionTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 9321D5891A38F196008052BE /* WKImmediateActionTypes.h */; settings = {ATTRIBUTES = (Private, ); }; };
    11881188                9323611E1B015DA800FA9232 /* _WKOverlayScrollbarStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 9323611D1B015DA800FA9232 /* _WKOverlayScrollbarStyle.h */; settings = {ATTRIBUTES = (Private, ); }; };
     1189                933DF82E1B3BC09000AEA9E3 /* WKImagePreviewViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 933DF82D1B3BC09000AEA9E3 /* WKImagePreviewViewController.h */; };
     1190                933DF8301B3BC0B400AEA9E3 /* WKImagePreviewViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 933DF82F1B3BC0B400AEA9E3 /* WKImagePreviewViewController.mm */; };
    11891191                934B724419F5B9BE00AE96D6 /* WKActionMenuItemTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 934B724319F5B9BE00AE96D6 /* WKActionMenuItemTypes.h */; settings = {ATTRIBUTES = (Private, ); }; };
    11901192                935EEB9B1277617C003322B8 /* WKBundleBackForwardListItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 935EEB981277616D003322B8 /* WKBundleBackForwardListItem.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    33753377                9321D5891A38F196008052BE /* WKImmediateActionTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKImmediateActionTypes.h; sourceTree = "<group>"; };
    33763378                9323611D1B015DA800FA9232 /* _WKOverlayScrollbarStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKOverlayScrollbarStyle.h; sourceTree = "<group>"; };
     3379                933DF82D1B3BC09000AEA9E3 /* WKImagePreviewViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKImagePreviewViewController.h; sourceTree = "<group>"; };
     3380                933DF82F1B3BC0B400AEA9E3 /* WKImagePreviewViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKImagePreviewViewController.mm; sourceTree = "<group>"; };
    33773381                934B724319F5B9BE00AE96D6 /* WKActionMenuItemTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKActionMenuItemTypes.h; sourceTree = "<group>"; };
    33783382                935EEB8F1277615D003322B8 /* InjectedBundleBackForwardList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundleBackForwardList.cpp; sourceTree = "<group>"; };
     
    51415145                                0FCB4E4018BBE044000FCFC9 /* WKGeolocationProviderIOS.mm */,
    51425146                                0FCB4E4118BBE044000FCFC9 /* WKGeolocationProviderIOSObjCSecurityOrigin.mm */,
     5147                                933DF82D1B3BC09000AEA9E3 /* WKImagePreviewViewController.h */,
     5148                                933DF82F1B3BC0B400AEA9E3 /* WKImagePreviewViewController.mm */,
    51435149                                0F3C7259196F5F6800AEDD0C /* WKInspectorHighlightView.h */,
    51445150                                0F3C7257196F5F5000AEDD0C /* WKInspectorHighlightView.mm */,
     
    80238029                                BC306824125A6B9400E71278 /* WebProcessCreationParameters.h in Headers */,
    80248030                                2DB9C4AC1B3251BD0070F27F /* SafariServicesSPI.h in Headers */,
     8031                                933DF82E1B3BC09000AEA9E3 /* WKImagePreviewViewController.h in Headers */,
    80258032                                1AFA4B901A65A9E2006C4AB4 /* WebProcessLifetimeObserver.h in Headers */,
    80268033                                1AFA4B8C1A65A1D0006C4AB4 /* WebProcessLifetimeTracker.h in Headers */,
     
    95649571                                1AC7537B183A9FDB0072CB15 /* PageLoadState.cpp in Sources */,
    95659572                                C574A58212E66681002DFE98 /* PasteboardTypes.mm in Sources */,
     9573                                933DF8301B3BC0B400AEA9E3 /* WKImagePreviewViewController.mm in Sources */,
    95669574                                E19582D6153CC05400B60875 /* PDFKitImports.mm in Sources */,
    95679575                                2D870D1016234FFE000A3F20 /* PDFPlugin.mm in Sources */,
  • trunk/Source/WebKit2/WebProcess/WebPage/ios/WebPageIOS.mm

    r185123 r186008  
    21322132
    21332133            if (elementIsLinkOrImage) {
    2134                 // Ensure that the image contains at most 600K pixels, so that it is not too big.
    2135                 if (RefPtr<WebImage> snapshot = snapshotNode(*element, SnapshotOptionsShareable, 600 * 1024))
    2136                     info.image = snapshot->bitmap();
     2134                if (linkElement) {
     2135                    // Ensure that the image contains at most 600K pixels, so that it is not too big.
     2136                    if (RefPtr<WebImage> snapshot = snapshotNode(*element, SnapshotOptionsShareable, 600 * 1024))
     2137                        info.image = snapshot->bitmap();
     2138                } else if (element->renderer() && element->renderer()->isRenderImage()) {
     2139                    auto& renderImage = downcast<RenderImage>(*(element->renderer()));
     2140                    if (renderImage.cachedImage() && !renderImage.cachedImage()->errorOccurred()) {
     2141                        if (Image* image = renderImage.cachedImage()->imageForRenderer(&renderImage)) {
     2142                            if (RefPtr<ShareableBitmap> sharedBitmap = ShareableBitmap::createShareable(IntSize(image->size()), ShareableBitmap::SupportsAlpha)) {
     2143                                auto graphicsContext = sharedBitmap->createGraphicsContext();
     2144                                graphicsContext->drawImage(image, ColorSpaceDeviceRGB, FloatPoint(0, 0));
     2145                                info.image = sharedBitmap;
     2146                            }
     2147                        }
     2148                    }
     2149                }
    21372150            }
    21382151            if (linkElement)
Note: See TracChangeset for help on using the changeset viewer.