Changeset 250876 in webkit


Ignore:
Timestamp:
Oct 8, 2019 4:23:01 PM (5 years ago)
Author:
aestes@apple.com
Message:

[iOS] Add a fast path that avoids hit testing during context menu interactions on elements
https://bugs.webkit.org/show_bug.cgi?id=202510
<rdar://problem/55939313>

Reviewed by Tim Horton.

When computing position information for an element, we can store sufficient context
information in InteractionInformationAtPosition such that the same element could be
retrieved again without hit testing. The existing TextInputContext can already store an
element's page identifier, document identifier, and element identifier, which is sufficient
context for such a task.

This patch renames TextInputContext to ElementContext and uses it when populating new
InteractionInformationAtPosition structs in elementPositionInformation(). When a context
menu interaction occurs, WebPage::startInteractionWithElementContextOrPosition() uses this
context to look up the interaction element by its identifier triplet, falling back to hit
testing if this lookup fails.

  • Scripts/webkit/messages.py:
  • Shared/DocumentEditingContext.h:
  • Shared/DocumentEditingContext.mm:

(IPC::ArgumentCoder<WebKit::DocumentEditingContextRequest>::decode):

  • Shared/ElementContext.cpp: Renamed from Source/WebKit/Shared/TextInputContext.cpp.

(IPC::ArgumentCoder<WebKit::ElementContext>::encode):
(IPC::ArgumentCoder<WebKit::ElementContext>::decode):

  • Shared/ElementContext.h: Renamed from Source/WebKit/Shared/TextInputContext.h.

(WebKit::operator==):

  • Shared/ios/InteractionInformationAtPosition.h:
  • Shared/ios/InteractionInformationAtPosition.mm:

(WebKit::InteractionInformationAtPosition::encode const):
(WebKit::InteractionInformationAtPosition::decode):

  • Sources.txt:
  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView _requestTextInputContextsInRect:completionHandler:]):

  • UIProcess/API/Cocoa/_WKTextInputContext.mm:

(-[_WKTextInputContext _initWithTextInputContext:]):
(-[_WKTextInputContext _textInputContext]):

  • UIProcess/API/Cocoa/_WKTextInputContextInternal.h:
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::textInputContextsInRect):
(WebKit::WebPageProxy::focusTextInputContext):

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

(-[WKContentView actionSheetAssistant:willStartInteractionWithElement:]):
(-[WKContentView assignLegacyDataForContextMenuInteraction]):
(-[WKContentView continueContextMenuInteraction:]):
(-[WKContentView continueContextMenuInteractionWithDataDetectors:]):
(-[WKContentView _presentedViewControllerForPreviewItemController:]):

  • UIProcess/ios/WebPageProxyIOS.mm:

(WebKit::WebPageProxy::startInteractionWithPositionInformation):
(WebKit::WebPageProxy::startInteractionWithElementAtPosition): Deleted.

  • WebKit.xcodeproj/project.pbxproj:
  • WebProcess/WebPage/WebPage.cpp:

(WebKit::WebPage::textInputContextsInRect):
(WebKit::WebPage::focusTextInputContext):
(WebKit::WebPage::elementForContext const):
(WebKit::WebPage::contextForElement const):
(WebKit::WebPage::elementForTextInputContext): Deleted.

  • WebProcess/WebPage/WebPage.h:
  • WebProcess/WebPage/WebPage.messages.in:
  • WebProcess/WebPage/ios/WebPageIOS.mm:

(WebKit::elementPositionInformation):
(WebKit::WebPage::startInteractionWithElementContextOrPosition):
(WebKit::WebPage::requestDocumentEditingContext):
(WebKit::WebPage::startInteractionWithElementAtPosition): Deleted.

Location:
trunk/Source/WebKit
Files:
19 edited
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r250870 r250876  
     12019-10-08  Andy Estes  <aestes@apple.com>
     2
     3        [iOS] Add a fast path that avoids hit testing during context menu interactions on elements
     4        https://bugs.webkit.org/show_bug.cgi?id=202510
     5        <rdar://problem/55939313>
     6
     7        Reviewed by Tim Horton.
     8
     9        When computing position information for an element, we can store sufficient context
     10        information in InteractionInformationAtPosition such that the same element could be
     11        retrieved again without hit testing. The existing TextInputContext can already store an
     12        element's page identifier, document identifier, and element identifier, which is sufficient
     13        context for such a task.
     14
     15        This patch renames TextInputContext to ElementContext and uses it when populating new
     16        InteractionInformationAtPosition structs in elementPositionInformation(). When a context
     17        menu interaction occurs, WebPage::startInteractionWithElementContextOrPosition() uses this
     18        context to look up the interaction element by its identifier triplet, falling back to hit
     19        testing if this lookup fails.
     20
     21        * Scripts/webkit/messages.py:
     22        * Shared/DocumentEditingContext.h:
     23        * Shared/DocumentEditingContext.mm:
     24        (IPC::ArgumentCoder<WebKit::DocumentEditingContextRequest>::decode):
     25        * Shared/ElementContext.cpp: Renamed from Source/WebKit/Shared/TextInputContext.cpp.
     26        (IPC::ArgumentCoder<WebKit::ElementContext>::encode):
     27        (IPC::ArgumentCoder<WebKit::ElementContext>::decode):
     28        * Shared/ElementContext.h: Renamed from Source/WebKit/Shared/TextInputContext.h.
     29        (WebKit::operator==):
     30        * Shared/ios/InteractionInformationAtPosition.h:
     31        * Shared/ios/InteractionInformationAtPosition.mm:
     32        (WebKit::InteractionInformationAtPosition::encode const):
     33        (WebKit::InteractionInformationAtPosition::decode):
     34        * Sources.txt:
     35        * UIProcess/API/Cocoa/WKWebView.mm:
     36        (-[WKWebView _requestTextInputContextsInRect:completionHandler:]):
     37        * UIProcess/API/Cocoa/_WKTextInputContext.mm:
     38        (-[_WKTextInputContext _initWithTextInputContext:]):
     39        (-[_WKTextInputContext _textInputContext]):
     40        * UIProcess/API/Cocoa/_WKTextInputContextInternal.h:
     41        * UIProcess/WebPageProxy.cpp:
     42        (WebKit::WebPageProxy::textInputContextsInRect):
     43        (WebKit::WebPageProxy::focusTextInputContext):
     44        * UIProcess/WebPageProxy.h:
     45        * UIProcess/ios/WKContentViewInteraction.mm:
     46        (-[WKContentView actionSheetAssistant:willStartInteractionWithElement:]):
     47        (-[WKContentView assignLegacyDataForContextMenuInteraction]):
     48        (-[WKContentView continueContextMenuInteraction:]):
     49        (-[WKContentView continueContextMenuInteractionWithDataDetectors:]):
     50        (-[WKContentView _presentedViewControllerForPreviewItemController:]):
     51        * UIProcess/ios/WebPageProxyIOS.mm:
     52        (WebKit::WebPageProxy::startInteractionWithPositionInformation):
     53        (WebKit::WebPageProxy::startInteractionWithElementAtPosition): Deleted.
     54        * WebKit.xcodeproj/project.pbxproj:
     55        * WebProcess/WebPage/WebPage.cpp:
     56        (WebKit::WebPage::textInputContextsInRect):
     57        (WebKit::WebPage::focusTextInputContext):
     58        (WebKit::WebPage::elementForContext const):
     59        (WebKit::WebPage::contextForElement const):
     60        (WebKit::WebPage::elementForTextInputContext): Deleted.
     61        * WebProcess/WebPage/WebPage.h:
     62        * WebProcess/WebPage/WebPage.messages.in:
     63        * WebProcess/WebPage/ios/WebPageIOS.mm:
     64        (WebKit::elementPositionInformation):
     65        (WebKit::WebPage::startInteractionWithElementContextOrPosition):
     66        (WebKit::WebPage::requestDocumentEditingContext):
     67        (WebKit::WebPage::startInteractionWithElementAtPosition): Deleted.
     68
    1692019-10-08  Adrian Perez de Castro  <aperez@igalia.com>
    270
  • trunk/Source/WebKit/Scripts/webkit/messages.py

    r250599 r250876  
    487487        'WebKit::WebTouchEvent': ['"WebEvent.h"'],
    488488        'WebKit::WebWheelEvent': ['"WebEvent.h"'],
    489         'struct WebKit::TextInputContext': ['"TextInputContext.h"'],
     489        'struct WebKit::ElementContext': ['"ElementContext.h"'],
    490490        'struct WebKit::WebUserScriptData': ['"WebUserContentControllerDataTypes.h"'],
    491491        'struct WebKit::WebUserStyleSheetData': ['"WebUserContentControllerDataTypes.h"'],
  • trunk/Source/WebKit/Shared/DocumentEditingContext.h

    r243354 r250876  
    3030#include "ArgumentCoders.h"
    3131#include "AttributedString.h"
    32 #include "TextInputContext.h"
     32#include "ElementContext.h"
    3333#include <WebCore/FloatRect.h>
    3434#include <WebCore/TextGranularity.h>
     
    5757    WebCore::FloatRect rect;
    5858
    59     Optional<WebKit::TextInputContext> textInputContext;
     59    Optional<WebKit::ElementContext> textInputContext;
    6060};
    6161
  • trunk/Source/WebKit/Shared/DocumentEditingContext.mm

    r244955 r250876  
    2929#if PLATFORM(IOS_FAMILY)
    3030
    31 #include "TextInputContext.h"
     31#include "ElementContext.h"
    3232#include "UIKitSPI.h"
    3333#include "WebCoreArgumentCoders.h"
     
    199199        return WTF::nullopt;
    200200
    201     Optional<Optional<WebKit::TextInputContext>> optionalTextInputContext;
     201    Optional<Optional<WebKit::ElementContext>> optionalTextInputContext;
    202202    decoder >> optionalTextInputContext;
    203203    if (!optionalTextInputContext)
  • trunk/Source/WebKit/Shared/ElementContext.cpp

    r250874 r250876  
    2525
    2626#include "config.h"
    27 #include "TextInputContext.h"
     27#include "ElementContext.h"
    2828
    2929#include "WebCoreArgumentCoders.h"
     
    3232namespace WebKit {
    3333
    34 TextInputContext::~TextInputContext() = default;
     34ElementContext::~ElementContext() = default;
    3535
    3636}
     
    3838namespace IPC {
    3939
    40 void ArgumentCoder<WebKit::TextInputContext>::encode(Encoder& encoder, const WebKit::TextInputContext& context)
     40void ArgumentCoder<WebKit::ElementContext>::encode(Encoder& encoder, const WebKit::ElementContext& context)
    4141{
    4242    encoder << context.boundingRect;
     
    4646}
    4747
    48 Optional<WebKit::TextInputContext> ArgumentCoder<WebKit::TextInputContext>::decode(Decoder& decoder)
     48Optional<WebKit::ElementContext> ArgumentCoder<WebKit::ElementContext>::decode(Decoder& decoder)
    4949{
    50     WebKit::TextInputContext context;
     50    WebKit::ElementContext context;
    5151    if (!decoder.decode(context.boundingRect))
    5252        return WTF::nullopt;
  • trunk/Source/WebKit/Shared/ElementContext.h

    r250874 r250876  
    3434namespace WebKit {
    3535
    36 struct TextInputContext {
     36struct ElementContext {
    3737    WebCore::FloatRect boundingRect;
    3838
     
    4141    WebCore::ElementIdentifier elementIdentifier;
    4242
    43     ~TextInputContext();
     43    ~ElementContext();
    4444};
    4545
    46 inline bool operator==(const TextInputContext& a, const TextInputContext& b)
     46inline bool operator==(const ElementContext& a, const ElementContext& b)
    4747{
    4848    return a.boundingRect == b.boundingRect
     
    5555
    5656namespace IPC {
    57 template<> struct ArgumentCoder<WebKit::TextInputContext> {
    58     static void encode(Encoder&, const WebKit::TextInputContext&);
    59     static Optional<WebKit::TextInputContext> decode(Decoder&);
     57template<> struct ArgumentCoder<WebKit::ElementContext> {
     58    static void encode(Encoder&, const WebKit::ElementContext&);
     59    static Optional<WebKit::ElementContext> decode(Decoder&);
    6060};
    6161}
  • trunk/Source/WebKit/Shared/ios/InteractionInformationAtPosition.h

    r250315 r250876  
    2929
    3030#include "ArgumentCoders.h"
     31#include "ElementContext.h"
    3132#include "InteractionInformationRequest.h"
    3233#include "ShareableBitmap.h"
     
    9091#endif
    9192
     93    Optional<ElementContext> elementContext;
     94
    9295    // Copy compatible optional bits forward (for example, if we have a InteractionInformationAtPosition
    9396    // with snapshots in it, and perform another request for the same point without requesting the snapshots,
  • trunk/Source/WebKit/Shared/ios/InteractionInformationAtPosition.mm

    r250315 r250876  
    8686    encoder << preventTextInteraction;
    8787#endif
     88    encoder << elementContext;
    8889}
    8990
     
    196197        return false;
    197198#endif
     199
     200    if (!decoder.decode(result.elementContext))
     201        return false;
    198202
    199203    return true;
  • trunk/Source/WebKit/Sources.txt

    r250729 r250876  
    122122Shared/EditingRange.cpp
    123123Shared/EditorState.cpp
     124Shared/ElementContext.cpp
    124125Shared/FontInfo.cpp
    125126Shared/FrameInfoData.cpp
     
    139140Shared/SharedStringHashTable.cpp
    140141Shared/StatisticsData.cpp
    141 Shared/TextInputContext.cpp
    142142Shared/TouchBarMenuData.cpp
    143143Shared/TouchBarMenuItemData.cpp
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm

    r250738 r250876  
    3434#import "DiagnosticLoggingClient.h"
    3535#import "DynamicViewportSizeUpdate.h"
     36#import "ElementContext.h"
    3637#import "FindClient.h"
    3738#import "FullscreenClient.h"
     
    5051#import "RemoteObjectRegistryMessages.h"
    5152#import "SafeBrowsingWarning.h"
    52 #import "TextInputContext.h"
    5353#import "UIDelegate.h"
    5454#import "UserMediaProcessManager.h"
     
    50555055    CGRect rectInRootViewCoordinates = [self _convertRectToRootViewCoordinates:rectInWebViewCoordinates];
    50565056    auto weakSelf = WeakObjCPtr<WKWebView>(self);
    5057     _page->textInputContextsInRect(rectInRootViewCoordinates, [weakSelf, capturedCompletionHandler = makeBlockPtr(completionHandler)] (const Vector<WebKit::TextInputContext>& contexts) {
     5057    _page->textInputContextsInRect(rectInRootViewCoordinates, [weakSelf, capturedCompletionHandler = makeBlockPtr(completionHandler)] (const Vector<WebKit::ElementContext>& contexts) {
    50585058        RetainPtr<NSMutableArray> elements = adoptNS([[NSMutableArray alloc] initWithCapacity:contexts.size()]);
    50595059
    50605060        auto strongSelf = weakSelf.get();
    50615061        for (const auto& context : contexts) {
    5062             WebKit::TextInputContext contextWithWebViewBoundingRect = context;
     5062            WebKit::ElementContext contextWithWebViewBoundingRect = context;
    50635063            contextWithWebViewBoundingRect.boundingRect = [strongSelf _convertRectFromRootViewCoordinates:context.boundingRect];
    50645064            [elements addObject:adoptNS([[_WKTextInputContext alloc] _initWithTextInputContext:contextWithWebViewBoundingRect]).get()];
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKTextInputContext.mm

    r242696 r250876  
    2727#import "_WKTextInputContext.h"
    2828
    29 #import "TextInputContext.h"
     29#import "ElementContext.h"
    3030#import "_WKTextInputContextInternal.h"
    3131
    3232@implementation _WKTextInputContext {
    33     WebKit::TextInputContext _textInputContext;
     33    WebKit::ElementContext _textInputContext;
    3434}
    3535
     
    3939}
    4040
    41 - (instancetype)_initWithTextInputContext:(const WebKit::TextInputContext&)context
     41- (instancetype)_initWithTextInputContext:(const WebKit::ElementContext&)context
    4242{
    4343    self = [super init];
     
    5555}
    5656
    57 - (const WebKit::TextInputContext&)_textInputContext
     57- (const WebKit::ElementContext&)_textInputContext
    5858{
    5959    return _textInputContext;
  • trunk/Source/WebKit/UIProcess/API/Cocoa/_WKTextInputContextInternal.h

    r242696 r250876  
    2727
    2828namespace WebKit {
    29 struct TextInputContext;
     29struct ElementContext;
    3030}
    3131
    3232@interface _WKTextInputContext ()
    3333
    34 - (instancetype)_initWithTextInputContext:(const WebKit::TextInputContext&)context;
     34- (instancetype)_initWithTextInputContext:(const WebKit::ElementContext&)context;
    3535
    36 - (const WebKit::TextInputContext&)_textInputContext;
     36- (const WebKit::ElementContext&)_textInputContext;
    3737
    3838@end
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r250773 r250876  
    5959#include "DrawingAreaMessages.h"
    6060#include "DrawingAreaProxy.h"
     61#include "ElementContext.h"
    6162#include "EventDispatcherMessages.h"
    6263#include "FormDataReference.h"
     
    8687#include "TextChecker.h"
    8788#include "TextCheckerState.h"
    88 #include "TextInputContext.h"
    8989#include "URLSchemeTaskParameters.h"
    9090#include "UndoOrRedo.h"
     
    93409340}
    93419341
    9342 void WebPageProxy::textInputContextsInRect(WebCore::FloatRect rect, CompletionHandler<void(const Vector<WebKit::TextInputContext>&)>&& completionHandler)
     9342void WebPageProxy::textInputContextsInRect(WebCore::FloatRect rect, CompletionHandler<void(const Vector<WebKit::ElementContext>&)>&& completionHandler)
    93439343{
    93449344    if (!hasRunningProcess()) {
     
    93509350}
    93519351
    9352 void WebPageProxy::focusTextInputContext(const TextInputContext& context, CompletionHandler<void(bool)>&& completionHandler)
     9352void WebPageProxy::focusTextInputContext(const ElementContext& context, CompletionHandler<void(bool)>&& completionHandler)
    93539353{
    93549354    if (!hasRunningProcess()) {
  • trunk/Source/WebKit/UIProcess/WebPageProxy.h

    r250780 r250876  
    289289struct EditingRange;
    290290struct EditorState;
     291struct ElementContext;
    291292struct FontInfo;
    292293struct FrameInfoData;
     
    296297struct PlatformPopupMenuData;
    297298struct PrintInfo;
    298 struct TextInputContext;
    299299struct WebAutocorrectionData;
    300300struct WebPopupItem;
     
    646646    void fontAttributesCallback(const WebCore::FontAttributes&, CallbackID);
    647647
    648     void textInputContextsInRect(WebCore::FloatRect, CompletionHandler<void(const Vector<TextInputContext>&)>&&);
    649     void focusTextInputContext(const TextInputContext&, CompletionHandler<void(bool)>&&);
     648    void textInputContextsInRect(WebCore::FloatRect, CompletionHandler<void(const Vector<ElementContext>&)>&&);
     649    void focusTextInputContext(const ElementContext&, CompletionHandler<void(bool)>&&);
    650650
    651651#if PLATFORM(IOS_FAMILY)
     
    704704    void didReceivePositionInformation(const InteractionInformationAtPosition&);
    705705    void requestPositionInformation(const InteractionInformationRequest&);
    706     void startInteractionWithElementAtPosition(const WebCore::IntPoint&);
     706    void startInteractionWithPositionInformation(const InteractionInformationAtPosition&);
    707707    void stopInteraction();
    708708    void performActionOnElement(uint32_t action);
  • trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm

    r250780 r250876  
    65176517- (void)actionSheetAssistant:(WKActionSheetAssistant *)assistant willStartInteractionWithElement:(_WKActivatedElementInfo *)element
    65186518{
    6519     _page->startInteractionWithElementAtPosition(_positionInformation.request.point);
     6519    _page->startInteractionWithPositionInformation(_positionInformation);
    65206520}
    65216521
     
    80948094    const auto& url = _positionInformation.url;
    80958095
    8096     _page->startInteractionWithElementAtPosition(_positionInformation.request.point);
     8096    _page->startInteractionWithPositionInformation(_positionInformation);
    80978097
    80988098    UIViewController *previewViewController = nil;
     
    82678267        };
    82688268
    8269         _page->startInteractionWithElementAtPosition(_positionInformation.request.point);
     8269        _page->startInteractionWithPositionInformation(_positionInformation);
    82708270
    82718271        continueWithContextMenuConfiguration([UIContextMenuConfiguration configurationWithIdentifier:nil previewProvider:contentPreviewProvider actionProvider:actionMenuProvider]);
     
    82898289
    82908290        if (configurationFromWKUIDelegate) {
    8291             strongSelf->_page->startInteractionWithElementAtPosition(strongSelf->_positionInformation.request.point);
     8291            strongSelf->_page->startInteractionWithPositionInformation(strongSelf->_positionInformation);
    82928292            strongSelf->_contextMenuActionProviderDelegateNeedsOverride = YES;
    82938293            continueWithContextMenuConfiguration(configurationFromWKUIDelegate);
     
    83848384        UIContextMenuConfiguration *configurationFromDD = [ddContextMenuActionClass contextMenuConfigurationForURL:linkURL identifier:_positionInformation.dataDetectorIdentifier selectedText:[self selectedText] results:_positionInformation.dataDetectorResults.get() inView:self context:context menuIdentifier:nil];
    83858385        _contextMenuActionProviderDelegateNeedsOverride = YES;
    8386         _page->startInteractionWithElementAtPosition(_positionInformation.request.point);
     8386        _page->startInteractionWithPositionInformation(_positionInformation);
    83878387        continueWithContextMenuConfiguration(configurationFromDD);
    83888388        return YES;
     
    88178817    if ([_previewItemController type] == UIPreviewItemTypeLink) {
    88188818        _longPressCanClick = NO;
    8819         _page->startInteractionWithElementAtPosition(_positionInformation.request.point);
     8819        _page->startInteractionWithPositionInformation(_positionInformation);
    88208820
    88218821        // Treat animated images like a link preview
     
    88778877
    88788878        RetainPtr<_WKActivatedElementInfo> elementInfo = adoptNS([[_WKActivatedElementInfo alloc] _initWithType:_WKActivatedElementTypeImage URL:alternateURL.get() imageURL:nil location:_positionInformation.request.point title:_positionInformation.title ID:_positionInformation.idAttribute rect:_positionInformation.bounds image:_positionInformation.image.get() userInfo:imageInfo.get()]);
    8879         _page->startInteractionWithElementAtPosition(_positionInformation.request.point);
     8879        _page->startInteractionWithPositionInformation(_positionInformation);
    88808880
    88818881        ALLOW_DEPRECATED_DECLARATIONS_BEGIN
  • trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm

    r250780 r250876  
    625625}
    626626
    627 void WebPageProxy::startInteractionWithElementAtPosition(const WebCore::IntPoint& point)
    628 {
    629     m_process->send(Messages::WebPage::StartInteractionWithElementAtPosition(point), m_webPageID);
     627void WebPageProxy::startInteractionWithPositionInformation(const InteractionInformationAtPosition& positionInformation)
     628{
     629    m_process->send(Messages::WebPage::StartInteractionWithElementContextOrPosition(positionInformation.elementContext, positionInformation.request.point), m_webPageID);
    630630}
    631631
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r250729 r250876  
    723723                2DE6943D18BD2A68005C15E5 /* SmartMagnificationControllerMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2DE6943B18BD2A68005C15E5 /* SmartMagnificationControllerMessageReceiver.cpp */; };
    724724                2DE6943E18BD2A68005C15E5 /* SmartMagnificationControllerMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DE6943C18BD2A68005C15E5 /* SmartMagnificationControllerMessages.h */; };
    725                 2DE9B1352231B5B2005287B7 /* TextInputContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DE9B1332231B5B2005287B7 /* TextInputContext.h */; };
     725                2DE9B1352231B5B2005287B7 /* ElementContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DE9B1332231B5B2005287B7 /* ElementContext.h */; };
    726726                2DE9B13A2231F61C005287B7 /* _WKTextInputContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DE9B1382231F61C005287B7 /* _WKTextInputContext.h */; settings = {ATTRIBUTES = (Private, ); }; };
    727727                2DE9B13C2231F77C005287B7 /* _WKTextInputContextInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DE9B13B2231F77C005287B7 /* _WKTextInputContextInternal.h */; };
     
    28812881                2DE6943B18BD2A68005C15E5 /* SmartMagnificationControllerMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SmartMagnificationControllerMessageReceiver.cpp; path = DerivedSources/WebKit2/SmartMagnificationControllerMessageReceiver.cpp; sourceTree = BUILT_PRODUCTS_DIR; };
    28822882                2DE6943C18BD2A68005C15E5 /* SmartMagnificationControllerMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SmartMagnificationControllerMessages.h; path = DerivedSources/WebKit2/SmartMagnificationControllerMessages.h; sourceTree = BUILT_PRODUCTS_DIR; };
    2883                 2DE9B1332231B5B2005287B7 /* TextInputContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextInputContext.h; sourceTree = "<group>"; };
    2884                 2DE9B1342231B5B2005287B7 /* TextInputContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextInputContext.cpp; sourceTree = "<group>"; };
     2883                2DE9B1332231B5B2005287B7 /* ElementContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ElementContext.h; sourceTree = "<group>"; };
     2884                2DE9B1342231B5B2005287B7 /* ElementContext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ElementContext.cpp; sourceTree = "<group>"; };
    28852885                2DE9B1372231F61C005287B7 /* _WKTextInputContext.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = _WKTextInputContext.mm; sourceTree = "<group>"; };
    28862886                2DE9B1382231F61C005287B7 /* _WKTextInputContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKTextInputContext.h; sourceTree = "<group>"; };
     
    52785278                                8CFECE931490F140002AAA32 /* EditorState.cpp */,
    52795279                                1AA41AB412C02EC4002BE67B /* EditorState.h */,
     5280                                2DE9B1342231B5B2005287B7 /* ElementContext.cpp */,
     5281                                2DE9B1332231B5B2005287B7 /* ElementContext.h */,
    52805282                                C59C4A5618B81174007BDCB6 /* FocusedElementInformation.cpp */,
    52815283                                C59C4A5718B81174007BDCB6 /* FocusedElementInformation.h */,
     
    53305332                                5272B2891406985D0096A5D0 /* StatisticsData.h */,
    53315333                                1A5E4DA312D3BD3D0099A2BB /* TextCheckerState.h */,
    5332                                 2DE9B1342231B5B2005287B7 /* TextInputContext.cpp */,
    5333                                 2DE9B1332231B5B2005287B7 /* TextInputContext.h */,
    53345334                                2FD43B921FA006A30083F51C /* TouchBarMenuData.cpp */,
    53355335                                2FD43B911FA006A10083F51C /* TouchBarMenuData.h */,
     
    94909490                                E105FE5418D7B9DE008F57A8 /* EditingRange.h in Headers */,
    94919491                                1AA41AB512C02EC4002BE67B /* EditorState.h in Headers */,
     9492                                2DE9B1352231B5B2005287B7 /* ElementContext.h in Headers */,
    94929493                                BC032DA810F437D10058C15A /* Encoder.h in Headers */,
    94939494                                51B15A8513843A3900321AD8 /* EnvironmentUtilities.h in Headers */,
     
    98089809                                53CFBBC82224D1B500266546 /* TextCheckerCompletion.h in Headers */,
    98099810                                1A5E4DA412D3BD3D0099A2BB /* TextCheckerState.h in Headers */,
    9810                                 2DE9B1352231B5B2005287B7 /* TextInputContext.h in Headers */,
    98119811                                CE1A0BD71A48E6C60054EF74 /* TextInputSPI.h in Headers */,
    98129812                                1AAF263914687C39004A1E8A /* TiledCoreAnimationDrawingArea.h in Headers */,
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp

    r250738 r250876  
    67506750}
    67516751
    6752 void WebPage::textInputContextsInRect(WebCore::FloatRect searchRect, CompletionHandler<void(const Vector<TextInputContext>&)>&& completionHandler)
    6753 {
    6754     Vector<WebKit::TextInputContext> textInputContexts;
     6752void WebPage::textInputContextsInRect(WebCore::FloatRect searchRect, CompletionHandler<void(const Vector<ElementContext>&)>&& completionHandler)
     6753{
     6754    Vector<WebKit::ElementContext> textInputContexts;
    67556755
    67566756    for (Frame* frame = &m_page->mainFrame(); frame; frame = frame->tree().traverseNext()) {
     
    67786778                continue;
    67796779
    6780             WebKit::TextInputContext context;
     6780            WebKit::ElementContext context;
    67816781            context.webPageIdentifier = m_identifier;
    67826782            context.documentIdentifier = document->identifier();
     
    67916791}
    67926792
    6793 void WebPage::focusTextInputContext(const TextInputContext& textInputContext, CompletionHandler<void(bool)>&& completionHandler)
    6794 {
    6795     RefPtr<Element> element = elementForTextInputContext(textInputContext);
     6793void WebPage::focusTextInputContext(const ElementContext& textInputContext, CompletionHandler<void(bool)>&& completionHandler)
     6794{
     6795    RefPtr<Element> element = elementForContext(textInputContext);
    67966796
    67976797    if (element)
     
    68016801}
    68026802
    6803 Element* WebPage::elementForTextInputContext(const TextInputContext& textInputContext)
    6804 {
    6805     if (textInputContext.webPageIdentifier != m_identifier)
     6803Element* WebPage::elementForContext(const ElementContext& elementContext) const
     6804{
     6805    if (elementContext.webPageIdentifier != m_identifier)
    68066806        return nullptr;
    68076807
    6808     auto* document = Document::allDocumentsMap().get(textInputContext.documentIdentifier);
     6808    auto* document = Document::allDocumentsMap().get(elementContext.documentIdentifier);
    68096809    if (!document)
    68106810        return nullptr;
     
    68136813        return nullptr;
    68146814
    6815     return document->searchForElementByIdentifier(textInputContext.elementIdentifier);
     6815    return document->searchForElementByIdentifier(elementContext.elementIdentifier);
     6816}
     6817
     6818Optional<ElementContext> WebPage::contextForElement(WebCore::Element& element) const
     6819{
     6820    auto& document = element.document();
     6821    if (!m_page || document.page() != m_page.get())
     6822        return WTF::nullopt;
     6823
     6824    auto frame = document.frame();
     6825    if (!frame)
     6826        return WTF::nullopt;
     6827
     6828    return ElementContext { elementRectInRootViewCoordinates(element, *frame), m_identifier, document.identifier(), document.identifierForElement(element) };
    68166829}
    68176830
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.h

    r250256 r250876  
    262262struct DataDetectionResult;
    263263struct EditorState;
     264struct ElementContext;
    264265struct FontInfo;
    265266struct InsertTextOptions;
     
    268269struct LoadParameters;
    269270struct PrintInfo;
    270 struct TextInputContext;
    271271struct WebAutocorrectionData;
    272272struct WebAutocorrectionContext;
     
    612612    void selectAll();
    613613
    614     void textInputContextsInRect(WebCore::FloatRect, CompletionHandler<void(const Vector<WebKit::TextInputContext>&)>&&);
    615     void focusTextInputContext(const TextInputContext&, CompletionHandler<void(bool)>&&);
     614    void textInputContextsInRect(WebCore::FloatRect, CompletionHandler<void(const Vector<WebKit::ElementContext>&)>&&);
     615    void focusTextInputContext(const ElementContext&, CompletionHandler<void(bool)>&&);
    616616
    617617#if PLATFORM(IOS_FAMILY)
     
    669669    void getPositionInformation(const InteractionInformationRequest&, CompletionHandler<void(InteractionInformationAtPosition&&)>&&);
    670670    void requestPositionInformation(const InteractionInformationRequest&);
    671     void startInteractionWithElementAtPosition(const WebCore::IntPoint&);
     671    void startInteractionWithElementContextOrPosition(Optional<ElementContext>&&, WebCore::IntPoint&&);
    672672    void stopInteraction();
    673673    void performActionOnElement(uint32_t action);
     
    11891189    void configureLoggingChannel(const String&, WTFLogChannelState, WTFLogLevel);
    11901190
    1191     WebCore::Element* elementForTextInputContext(const TextInputContext&);
     1191    WebCore::Element* elementForContext(const ElementContext&) const;
     1192    Optional<ElementContext> contextForElement(WebCore::Element&) const;
    11921193
    11931194#if ENABLE(APPLE_PAY)
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in

    r250256 r250876  
    8787    GetPositionInformation(struct WebKit::InteractionInformationRequest request) -> (struct WebKit::InteractionInformationAtPosition information) Synchronous
    8888    RequestPositionInformation(struct WebKit::InteractionInformationRequest request)
    89     StartInteractionWithElementAtPosition(WebCore::IntPoint point)
     89    StartInteractionWithElementContextOrPosition(Optional<WebKit::ElementContext> elementContext, WebCore::IntPoint point)
    9090    StopInteraction()
    9191    PerformActionOnElement(uint32_t action)
     
    570570#endif
    571571
    572     TextInputContextsInRect(WebCore::FloatRect rect) -> (Vector<struct WebKit::TextInputContext> contexts) Async
    573     FocusTextInputContext(struct WebKit::TextInputContext context) -> (bool success) Async
     572    TextInputContextsInRect(WebCore::FloatRect rect) -> (Vector<struct WebKit::ElementContext> contexts) Async
     573    FocusTextInputContext(struct WebKit::ElementContext context) -> (bool success) Async
    574574
    575575#if ENABLE(RESOURCE_LOAD_STATISTICS)
  • trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm

    r250780 r250876  
    27162716        boundsPositionInformation(*renderer, info);
    27172717    }
     2718
     2719    info.elementContext = page.contextForElement(element);
    27182720}
    27192721   
     
    28142816}
    28152817
    2816 void WebPage::startInteractionWithElementAtPosition(const WebCore::IntPoint& point)
    2817 {
    2818     // FIXME: We've already performed a hit test when the long-press gesture was recognized and we
    2819     // used that result to generate the targeted preview, but now we are hit testing again in order
    2820     // to perform the selected action. Since an arbitrary amount of time can elapse between
    2821     // generating the targeted preview and the user selecting an action, it's possible that this
    2822     // second hit test will find a different element than the first one, leading to bugs like
    2823     // <rdar://problem/54723131>. We should re-use the results of the first hit test instead.
     2818void WebPage::startInteractionWithElementContextOrPosition(Optional<ElementContext>&& elementContext, WebCore::IntPoint&& point)
     2819{
     2820    if (elementContext) {
     2821        m_interactionNode = elementForContext(*elementContext);
     2822        if (m_interactionNode)
     2823            return;
     2824    }
     2825
    28242826    FloatPoint adjustedPoint;
    28252827    m_interactionNode = m_page->mainFrame().nodeRespondingToInteraction(point, adjustedPoint);
     
    39363938
    39373939    if (auto textInputContext = request.textInputContext) {
    3938         RefPtr<Element> element = elementForTextInputContext(*textInputContext);
     3940        RefPtr<Element> element = elementForContext(*textInputContext);
    39393941        if (!element) {
    39403942            completionHandler({ });
Note: See TracChangeset for help on using the changeset viewer.