- Revision
- 249171
- Author
- [email protected]
- Date
- 2019-08-27 14:14:56 -0700 (Tue, 27 Aug 2019)
Log Message
Populate alternate URL for _WKActivatedElementInfo in UIContextMenu SPI.
https://bugs.webkit.org/show_bug.cgi?id=201165.
rdar://problem/54729648.
Patch by James Savage <[email protected]> on 2019-08-27
Reviewed by Dean Jackson.
* UIProcess/API/APIContextMenuElementInfo.h:
* UIProcess/API/APIContextMenuElementInfo.cpp:
(API::ContextMenuElementInfo::ContextMenuElementInfo): Initialize new memeber.
* UIProcess/API/Cocoa/WKContextMenuElementInfo.mm:
(-[WKContextMenuElementInfo _activatedElementInfo]): Use new initializer.
* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _requestActivatedElementAtPosition:completionBlock:]): Ditto.
* UIProcess/API/Cocoa/_WKActivatedElementInfoInternal.h:
* UIProcess/API/Cocoa/_WKActivatedElementInfo.mm:
(+[_WKActivatedElementInfo activatedElementInfoWithInteractionInformationAtPosition:userInfo:]):
Ditto.
(-[_WKActivatedElementInfo _initWithInteractionInformationAtPosition:userInfo:]): Set new ivar.
(+[_WKActivatedElementInfo activatedElementInfoWithInteractionInformationAtPosition:]): Deleted.
(-[_WKActivatedElementInfo _initWithInteractionInformationAtPosition:]): Deleted.
* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView assignLegacyDataForContextMenuInteraction]): Use new initializer.
(-[WKContentView continueContextMenuInteraction:]): If the context menu is being generated for
an image, and we do not have a URL associated with the position information, try to
generate one using existing SPI. This change also passes through the userInfo via a new
property on _WKActivatedElementInfo. We only do this for the SPI version of this delegate
method, because the API is not called for image previews.
(-[WKContentView _contextMenuInteraction:overrideSuggestedActionsForConfiguration:]): Use new
initializer.
Modified Paths
Diff
Modified: trunk/Source/WebKit/ChangeLog (249170 => 249171)
--- trunk/Source/WebKit/ChangeLog 2019-08-27 21:09:47 UTC (rev 249170)
+++ trunk/Source/WebKit/ChangeLog 2019-08-27 21:14:56 UTC (rev 249171)
@@ -1,3 +1,39 @@
+2019-08-27 James Savage <[email protected]>
+
+ Populate alternate URL for _WKActivatedElementInfo in UIContextMenu SPI.
+ https://bugs.webkit.org/show_bug.cgi?id=201165.
+ rdar://problem/54729648.
+
+ Reviewed by Dean Jackson.
+
+ * UIProcess/API/APIContextMenuElementInfo.h:
+ * UIProcess/API/APIContextMenuElementInfo.cpp:
+ (API::ContextMenuElementInfo::ContextMenuElementInfo): Initialize new memeber.
+
+ * UIProcess/API/Cocoa/WKContextMenuElementInfo.mm:
+ (-[WKContextMenuElementInfo _activatedElementInfo]): Use new initializer.
+
+ * UIProcess/API/Cocoa/WKWebView.mm:
+ (-[WKWebView _requestActivatedElementAtPosition:completionBlock:]): Ditto.
+
+ * UIProcess/API/Cocoa/_WKActivatedElementInfoInternal.h:
+ * UIProcess/API/Cocoa/_WKActivatedElementInfo.mm:
+ (+[_WKActivatedElementInfo activatedElementInfoWithInteractionInformationAtPosition:userInfo:]):
+ Ditto.
+ (-[_WKActivatedElementInfo _initWithInteractionInformationAtPosition:userInfo:]): Set new ivar.
+ (+[_WKActivatedElementInfo activatedElementInfoWithInteractionInformationAtPosition:]): Deleted.
+ (-[_WKActivatedElementInfo _initWithInteractionInformationAtPosition:]): Deleted.
+
+ * UIProcess/ios/WKContentViewInteraction.mm:
+ (-[WKContentView assignLegacyDataForContextMenuInteraction]): Use new initializer.
+ (-[WKContentView continueContextMenuInteraction:]): If the context menu is being generated for
+ an image, and we do not have a URL associated with the position information, try to
+ generate one using existing SPI. This change also passes through the userInfo via a new
+ property on _WKActivatedElementInfo. We only do this for the SPI version of this delegate
+ method, because the API is not called for image previews.
+ (-[WKContentView _contextMenuInteraction:overrideSuggestedActionsForConfiguration:]): Use new
+ initializer.
+
2019-08-27 Basuke Suzuki <[email protected]>
[RemoteInspector][Socket] Restructuring the components of Socket implementation
Modified: trunk/Source/WebKit/UIProcess/API/APIContextMenuElementInfo.cpp (249170 => 249171)
--- trunk/Source/WebKit/UIProcess/API/APIContextMenuElementInfo.cpp 2019-08-27 21:09:47 UTC (rev 249170)
+++ trunk/Source/WebKit/UIProcess/API/APIContextMenuElementInfo.cpp 2019-08-27 21:14:56 UTC (rev 249171)
@@ -32,9 +32,16 @@
ContextMenuElementInfo::ContextMenuElementInfo(const WebKit::InteractionInformationAtPosition& info)
: m_interactionInformation(info)
+ , m_userInfo(nullptr)
{
}
+ContextMenuElementInfo::ContextMenuElementInfo(const WebKit::InteractionInformationAtPosition& info, NSDictionary *userInfo)
+ : m_interactionInformation(info)
+ , m_userInfo(userInfo)
+{
+}
+
} // namespace API
#endif // PLATFORM(IOS_FAMILY)
Modified: trunk/Source/WebKit/UIProcess/API/APIContextMenuElementInfo.h (249170 => 249171)
--- trunk/Source/WebKit/UIProcess/API/APIContextMenuElementInfo.h 2019-08-27 21:09:47 UTC (rev 249170)
+++ trunk/Source/WebKit/UIProcess/API/APIContextMenuElementInfo.h 2019-08-27 21:14:56 UTC (rev 249171)
@@ -43,10 +43,14 @@
const WebKit::InteractionInformationAtPosition& interactionInformation() const { return m_interactionInformation; }
+ const RetainPtr<NSDictionary> userInfo() const { return m_userInfo; }
+
private:
ContextMenuElementInfo(const WebKit::InteractionInformationAtPosition&);
+ ContextMenuElementInfo(const WebKit::InteractionInformationAtPosition&, NSDictionary *);
WebKit::InteractionInformationAtPosition m_interactionInformation;
+ RetainPtr<NSDictionary> m_userInfo;
};
} // namespace API
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKContextMenuElementInfo.mm (249170 => 249171)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKContextMenuElementInfo.mm 2019-08-27 21:09:47 UTC (rev 249170)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKContextMenuElementInfo.mm 2019-08-27 21:14:56 UTC (rev 249171)
@@ -48,7 +48,7 @@
- (_WKActivatedElementInfo *)_activatedElementInfo
{
- return [_WKActivatedElementInfo activatedElementInfoWithInteractionInformationAtPosition:_elementInfo->interactionInformation()];
+ return [_WKActivatedElementInfo activatedElementInfoWithInteractionInformationAtPosition:_elementInfo->interactionInformation() userInfo:_elementInfo->userInfo().get()];
}
@end
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (249170 => 249171)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm 2019-08-27 21:09:47 UTC (rev 249170)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm 2019-08-27 21:14:56 UTC (rev 249171)
@@ -6739,7 +6739,7 @@
infoRequest.includeSnapshot = true;
[_contentView doAfterPositionInformationUpdate:[capturedBlock = makeBlockPtr(block)] (WebKit::InteractionInformationAtPosition information) {
- capturedBlock([_WKActivatedElementInfo activatedElementInfoWithInteractionInformationAtPosition:information]);
+ capturedBlock([_WKActivatedElementInfo activatedElementInfoWithInteractionInformationAtPosition:information userInfo:nil]);
} forRequest:infoRequest];
}
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKActivatedElementInfo.mm (249170 => 249171)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKActivatedElementInfo.mm 2019-08-27 21:09:47 UTC (rev 249170)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKActivatedElementInfo.mm 2019-08-27 21:14:56 UTC (rev 249171)
@@ -55,12 +55,12 @@
}
#if PLATFORM(IOS_FAMILY)
-+ (instancetype)activatedElementInfoWithInteractionInformationAtPosition:(const WebKit::InteractionInformationAtPosition&)information
++ (instancetype)activatedElementInfoWithInteractionInformationAtPosition:(const WebKit::InteractionInformationAtPosition&)information userInfo:(NSDictionary *)userInfo
{
- return [[[self alloc] _initWithInteractionInformationAtPosition:information] autorelease];
+ return [[[self alloc] _initWithInteractionInformationAtPosition:information userInfo:userInfo] autorelease];
}
-- (instancetype)_initWithInteractionInformationAtPosition:(const WebKit::InteractionInformationAtPosition&)information
+- (instancetype)_initWithInteractionInformationAtPosition:(const WebKit::InteractionInformationAtPosition&)information userInfo:(NSDictionary *)userInfo
{
if (!(self = [super init]))
return nil;
@@ -83,6 +83,8 @@
_image = information.image;
_ID = information.idAttribute;
_animatedImage = information.isAnimatedImage;
+
+ _userInfo = userInfo;
return self;
}
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKActivatedElementInfoInternal.h (249170 => 249171)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKActivatedElementInfoInternal.h 2019-08-27 21:09:47 UTC (rev 249170)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKActivatedElementInfoInternal.h 2019-08-27 21:14:56 UTC (rev 249171)
@@ -37,8 +37,8 @@
@interface _WKActivatedElementInfo ()
#if PLATFORM(IOS_FAMILY)
-+ (instancetype)activatedElementInfoWithInteractionInformationAtPosition:(const WebKit::InteractionInformationAtPosition&)information;
-- (instancetype)_initWithInteractionInformationAtPosition:(const WebKit::InteractionInformationAtPosition&)information;
++ (instancetype)activatedElementInfoWithInteractionInformationAtPosition:(const WebKit::InteractionInformationAtPosition&)information userInfo:(NSDictionary *)userInfo;
+- (instancetype)_initWithInteractionInformationAtPosition:(const WebKit::InteractionInformationAtPosition&)information userInfo:(NSDictionary *)userInfo;
#endif
- (instancetype)_initWithType:(_WKActivatedElementType)type URL:(NSURL *)url imageURL:(NSURL *)imageURL location:(const WebCore::IntPoint&)location title:(NSString *)title ID:(NSString *)ID rect:(CGRect)rect image:(WebKit::ShareableBitmap*)image;
- (instancetype)_initWithType:(_WKActivatedElementType)type URL:(NSURL *)url imageURL:(NSURL *)imageURL location:(const WebCore::IntPoint&)location title:(NSString *)title ID:(NSString *)ID rect:(CGRect)rect image:(WebKit::ShareableBitmap*)image userInfo:(NSDictionary *)userInfo;
Modified: trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm (249170 => 249171)
--- trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm 2019-08-27 21:09:47 UTC (rev 249170)
+++ trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm 2019-08-27 21:14:56 UTC (rev 249171)
@@ -45,6 +45,7 @@
#import "VersionChecks.h"
#import "WKActionSheetAssistant.h"
#import "WKContextMenuElementInfoInternal.h"
+#import "WKContextMenuElementInfoPrivate.h"
#import "WKDatePickerViewController.h"
#import "WKDrawingCoordinator.h"
#import "WKError.h"
@@ -7870,7 +7871,7 @@
UIViewController *previewViewController = nil;
- auto elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithInteractionInformationAtPosition:_positionInformation]);
+ auto elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithInteractionInformationAtPosition:_positionInformation userInfo:nil]);
if (_positionInformation.isLink) {
_longPressCanClick = NO;
@@ -8073,7 +8074,7 @@
strongSelf->_contextMenuActionProviderDelegateNeedsOverride = NO;
- auto elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithInteractionInformationAtPosition:strongSelf->_positionInformation]);
+ auto elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithInteractionInformationAtPosition:strongSelf->_positionInformation userInfo:nil]);
UIContextMenuActionProvider actionMenuProvider = [weakSelf, elementInfo] (NSArray<UIMenuElement *> *) -> UIMenu * {
auto strongSelf = weakSelf.get();
@@ -8117,8 +8118,16 @@
});
_contextMenuActionProviderDelegateNeedsOverride = NO;
- _contextMenuElementInfo = wrapper(API::ContextMenuElementInfo::create(_positionInformation));
+ _contextMenuElementInfo = wrapper(API::ContextMenuElementInfo::create(_positionInformation, nil));
if ([uiDelegate respondsToSelector:@selector(_webView:contextMenuConfigurationForElement:completionHandler:)]) {
+ if (_positionInformation.isImage && _positionInformation.url.isNull() && [uiDelegate respondsToSelector:@selector(_webView:alternateURLFromImage:userInfo:)]) {
+ UIImage *uiImage = [[_contextMenuElementInfo _activatedElementInfo] image];
+ NSDictionary *userInfo = nil;
+ NSURL *nsURL = [uiDelegate _webView:_webView alternateURLFromImage:uiImage userInfo:&userInfo];
+ _positionInformation.url = ""
+ _contextMenuElementInfo = wrapper(API::ContextMenuElementInfo::create(_positionInformation, userInfo));
+ }
+
auto checker = WebKit::CompletionHandlerCallChecker::create(uiDelegate, @selector(_webView:contextMenuConfigurationForElement:completionHandler:));
[uiDelegate _webView:_webView contextMenuConfigurationForElement:_contextMenuElementInfo.get() completionHandler:makeBlockPtr([completionBlock = WTFMove(completionBlock), checker = WTFMove(checker)] (UIContextMenuConfiguration *configuration) {
if (checker->completionHandlerHasBeenCalled())
@@ -8161,7 +8170,7 @@
- (NSArray<UIMenuElement *> *)_contextMenuInteraction:(UIContextMenuInteraction *)interaction overrideSuggestedActionsForConfiguration:(UIContextMenuConfiguration *)configuration
{
if (_contextMenuActionProviderDelegateNeedsOverride) {
- auto elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithInteractionInformationAtPosition:_positionInformation]);
+ auto elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithInteractionInformationAtPosition:_positionInformation userInfo:nil]);
RetainPtr<NSArray<_WKElementAction *>> defaultActionsFromAssistant = _positionInformation.isLink ? [_actionSheetAssistant defaultActionsForLinkSheet:elementInfo.get()] : [_actionSheetAssistant defaultActionsForImageSheet:elementInfo.get()];
return menuElementsFromDefaultActions(defaultActionsFromAssistant, elementInfo);
}