Changeset 250876 in webkit
- Timestamp:
- Oct 8, 2019 4:23:01 PM (5 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 19 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r250870 r250876 1 2019-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 1 69 2019-10-08 Adrian Perez de Castro <aperez@igalia.com> 2 70 -
trunk/Source/WebKit/Scripts/webkit/messages.py
r250599 r250876 487 487 'WebKit::WebTouchEvent': ['"WebEvent.h"'], 488 488 'WebKit::WebWheelEvent': ['"WebEvent.h"'], 489 'struct WebKit:: TextInputContext': ['"TextInputContext.h"'],489 'struct WebKit::ElementContext': ['"ElementContext.h"'], 490 490 'struct WebKit::WebUserScriptData': ['"WebUserContentControllerDataTypes.h"'], 491 491 'struct WebKit::WebUserStyleSheetData': ['"WebUserContentControllerDataTypes.h"'], -
trunk/Source/WebKit/Shared/DocumentEditingContext.h
r243354 r250876 30 30 #include "ArgumentCoders.h" 31 31 #include "AttributedString.h" 32 #include " TextInputContext.h"32 #include "ElementContext.h" 33 33 #include <WebCore/FloatRect.h> 34 34 #include <WebCore/TextGranularity.h> … … 57 57 WebCore::FloatRect rect; 58 58 59 Optional<WebKit:: TextInputContext> textInputContext;59 Optional<WebKit::ElementContext> textInputContext; 60 60 }; 61 61 -
trunk/Source/WebKit/Shared/DocumentEditingContext.mm
r244955 r250876 29 29 #if PLATFORM(IOS_FAMILY) 30 30 31 #include " TextInputContext.h"31 #include "ElementContext.h" 32 32 #include "UIKitSPI.h" 33 33 #include "WebCoreArgumentCoders.h" … … 199 199 return WTF::nullopt; 200 200 201 Optional<Optional<WebKit:: TextInputContext>> optionalTextInputContext;201 Optional<Optional<WebKit::ElementContext>> optionalTextInputContext; 202 202 decoder >> optionalTextInputContext; 203 203 if (!optionalTextInputContext) -
trunk/Source/WebKit/Shared/ElementContext.cpp
r250874 r250876 25 25 26 26 #include "config.h" 27 #include " TextInputContext.h"27 #include "ElementContext.h" 28 28 29 29 #include "WebCoreArgumentCoders.h" … … 32 32 namespace WebKit { 33 33 34 TextInputContext::~TextInputContext() = default;34 ElementContext::~ElementContext() = default; 35 35 36 36 } … … 38 38 namespace IPC { 39 39 40 void ArgumentCoder<WebKit:: TextInputContext>::encode(Encoder& encoder, const WebKit::TextInputContext& context)40 void ArgumentCoder<WebKit::ElementContext>::encode(Encoder& encoder, const WebKit::ElementContext& context) 41 41 { 42 42 encoder << context.boundingRect; … … 46 46 } 47 47 48 Optional<WebKit:: TextInputContext> ArgumentCoder<WebKit::TextInputContext>::decode(Decoder& decoder)48 Optional<WebKit::ElementContext> ArgumentCoder<WebKit::ElementContext>::decode(Decoder& decoder) 49 49 { 50 WebKit:: TextInputContext context;50 WebKit::ElementContext context; 51 51 if (!decoder.decode(context.boundingRect)) 52 52 return WTF::nullopt; -
trunk/Source/WebKit/Shared/ElementContext.h
r250874 r250876 34 34 namespace WebKit { 35 35 36 struct TextInputContext {36 struct ElementContext { 37 37 WebCore::FloatRect boundingRect; 38 38 … … 41 41 WebCore::ElementIdentifier elementIdentifier; 42 42 43 ~ TextInputContext();43 ~ElementContext(); 44 44 }; 45 45 46 inline bool operator==(const TextInputContext& a, const TextInputContext& b)46 inline bool operator==(const ElementContext& a, const ElementContext& b) 47 47 { 48 48 return a.boundingRect == b.boundingRect … … 55 55 56 56 namespace IPC { 57 template<> struct ArgumentCoder<WebKit:: TextInputContext> {58 static void encode(Encoder&, const WebKit:: TextInputContext&);59 static Optional<WebKit:: TextInputContext> decode(Decoder&);57 template<> struct ArgumentCoder<WebKit::ElementContext> { 58 static void encode(Encoder&, const WebKit::ElementContext&); 59 static Optional<WebKit::ElementContext> decode(Decoder&); 60 60 }; 61 61 } -
trunk/Source/WebKit/Shared/ios/InteractionInformationAtPosition.h
r250315 r250876 29 29 30 30 #include "ArgumentCoders.h" 31 #include "ElementContext.h" 31 32 #include "InteractionInformationRequest.h" 32 33 #include "ShareableBitmap.h" … … 90 91 #endif 91 92 93 Optional<ElementContext> elementContext; 94 92 95 // Copy compatible optional bits forward (for example, if we have a InteractionInformationAtPosition 93 96 // 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 86 86 encoder << preventTextInteraction; 87 87 #endif 88 encoder << elementContext; 88 89 } 89 90 … … 196 197 return false; 197 198 #endif 199 200 if (!decoder.decode(result.elementContext)) 201 return false; 198 202 199 203 return true; -
trunk/Source/WebKit/Sources.txt
r250729 r250876 122 122 Shared/EditingRange.cpp 123 123 Shared/EditorState.cpp 124 Shared/ElementContext.cpp 124 125 Shared/FontInfo.cpp 125 126 Shared/FrameInfoData.cpp … … 139 140 Shared/SharedStringHashTable.cpp 140 141 Shared/StatisticsData.cpp 141 Shared/TextInputContext.cpp142 142 Shared/TouchBarMenuData.cpp 143 143 Shared/TouchBarMenuItemData.cpp -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm
r250738 r250876 34 34 #import "DiagnosticLoggingClient.h" 35 35 #import "DynamicViewportSizeUpdate.h" 36 #import "ElementContext.h" 36 37 #import "FindClient.h" 37 38 #import "FullscreenClient.h" … … 50 51 #import "RemoteObjectRegistryMessages.h" 51 52 #import "SafeBrowsingWarning.h" 52 #import "TextInputContext.h"53 53 #import "UIDelegate.h" 54 54 #import "UserMediaProcessManager.h" … … 5055 5055 CGRect rectInRootViewCoordinates = [self _convertRectToRootViewCoordinates:rectInWebViewCoordinates]; 5056 5056 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) { 5058 5058 RetainPtr<NSMutableArray> elements = adoptNS([[NSMutableArray alloc] initWithCapacity:contexts.size()]); 5059 5059 5060 5060 auto strongSelf = weakSelf.get(); 5061 5061 for (const auto& context : contexts) { 5062 WebKit:: TextInputContext contextWithWebViewBoundingRect = context;5062 WebKit::ElementContext contextWithWebViewBoundingRect = context; 5063 5063 contextWithWebViewBoundingRect.boundingRect = [strongSelf _convertRectFromRootViewCoordinates:context.boundingRect]; 5064 5064 [elements addObject:adoptNS([[_WKTextInputContext alloc] _initWithTextInputContext:contextWithWebViewBoundingRect]).get()]; -
trunk/Source/WebKit/UIProcess/API/Cocoa/_WKTextInputContext.mm
r242696 r250876 27 27 #import "_WKTextInputContext.h" 28 28 29 #import " TextInputContext.h"29 #import "ElementContext.h" 30 30 #import "_WKTextInputContextInternal.h" 31 31 32 32 @implementation _WKTextInputContext { 33 WebKit:: TextInputContext _textInputContext;33 WebKit::ElementContext _textInputContext; 34 34 } 35 35 … … 39 39 } 40 40 41 - (instancetype)_initWithTextInputContext:(const WebKit:: TextInputContext&)context41 - (instancetype)_initWithTextInputContext:(const WebKit::ElementContext&)context 42 42 { 43 43 self = [super init]; … … 55 55 } 56 56 57 - (const WebKit:: TextInputContext&)_textInputContext57 - (const WebKit::ElementContext&)_textInputContext 58 58 { 59 59 return _textInputContext; -
trunk/Source/WebKit/UIProcess/API/Cocoa/_WKTextInputContextInternal.h
r242696 r250876 27 27 28 28 namespace WebKit { 29 struct TextInputContext;29 struct ElementContext; 30 30 } 31 31 32 32 @interface _WKTextInputContext () 33 33 34 - (instancetype)_initWithTextInputContext:(const WebKit:: TextInputContext&)context;34 - (instancetype)_initWithTextInputContext:(const WebKit::ElementContext&)context; 35 35 36 - (const WebKit:: TextInputContext&)_textInputContext;36 - (const WebKit::ElementContext&)_textInputContext; 37 37 38 38 @end -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r250773 r250876 59 59 #include "DrawingAreaMessages.h" 60 60 #include "DrawingAreaProxy.h" 61 #include "ElementContext.h" 61 62 #include "EventDispatcherMessages.h" 62 63 #include "FormDataReference.h" … … 86 87 #include "TextChecker.h" 87 88 #include "TextCheckerState.h" 88 #include "TextInputContext.h"89 89 #include "URLSchemeTaskParameters.h" 90 90 #include "UndoOrRedo.h" … … 9340 9340 } 9341 9341 9342 void WebPageProxy::textInputContextsInRect(WebCore::FloatRect rect, CompletionHandler<void(const Vector<WebKit:: TextInputContext>&)>&& completionHandler)9342 void WebPageProxy::textInputContextsInRect(WebCore::FloatRect rect, CompletionHandler<void(const Vector<WebKit::ElementContext>&)>&& completionHandler) 9343 9343 { 9344 9344 if (!hasRunningProcess()) { … … 9350 9350 } 9351 9351 9352 void WebPageProxy::focusTextInputContext(const TextInputContext& context, CompletionHandler<void(bool)>&& completionHandler)9352 void WebPageProxy::focusTextInputContext(const ElementContext& context, CompletionHandler<void(bool)>&& completionHandler) 9353 9353 { 9354 9354 if (!hasRunningProcess()) { -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r250780 r250876 289 289 struct EditingRange; 290 290 struct EditorState; 291 struct ElementContext; 291 292 struct FontInfo; 292 293 struct FrameInfoData; … … 296 297 struct PlatformPopupMenuData; 297 298 struct PrintInfo; 298 struct TextInputContext;299 299 struct WebAutocorrectionData; 300 300 struct WebPopupItem; … … 646 646 void fontAttributesCallback(const WebCore::FontAttributes&, CallbackID); 647 647 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)>&&); 650 650 651 651 #if PLATFORM(IOS_FAMILY) … … 704 704 void didReceivePositionInformation(const InteractionInformationAtPosition&); 705 705 void requestPositionInformation(const InteractionInformationRequest&); 706 void startInteractionWith ElementAtPosition(const WebCore::IntPoint&);706 void startInteractionWithPositionInformation(const InteractionInformationAtPosition&); 707 707 void stopInteraction(); 708 708 void performActionOnElement(uint32_t action); -
trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm
r250780 r250876 6517 6517 - (void)actionSheetAssistant:(WKActionSheetAssistant *)assistant willStartInteractionWithElement:(_WKActivatedElementInfo *)element 6518 6518 { 6519 _page->startInteractionWith ElementAtPosition(_positionInformation.request.point);6519 _page->startInteractionWithPositionInformation(_positionInformation); 6520 6520 } 6521 6521 … … 8094 8094 const auto& url = _positionInformation.url; 8095 8095 8096 _page->startInteractionWith ElementAtPosition(_positionInformation.request.point);8096 _page->startInteractionWithPositionInformation(_positionInformation); 8097 8097 8098 8098 UIViewController *previewViewController = nil; … … 8267 8267 }; 8268 8268 8269 _page->startInteractionWith ElementAtPosition(_positionInformation.request.point);8269 _page->startInteractionWithPositionInformation(_positionInformation); 8270 8270 8271 8271 continueWithContextMenuConfiguration([UIContextMenuConfiguration configurationWithIdentifier:nil previewProvider:contentPreviewProvider actionProvider:actionMenuProvider]); … … 8289 8289 8290 8290 if (configurationFromWKUIDelegate) { 8291 strongSelf->_page->startInteractionWith ElementAtPosition(strongSelf->_positionInformation.request.point);8291 strongSelf->_page->startInteractionWithPositionInformation(strongSelf->_positionInformation); 8292 8292 strongSelf->_contextMenuActionProviderDelegateNeedsOverride = YES; 8293 8293 continueWithContextMenuConfiguration(configurationFromWKUIDelegate); … … 8384 8384 UIContextMenuConfiguration *configurationFromDD = [ddContextMenuActionClass contextMenuConfigurationForURL:linkURL identifier:_positionInformation.dataDetectorIdentifier selectedText:[self selectedText] results:_positionInformation.dataDetectorResults.get() inView:self context:context menuIdentifier:nil]; 8385 8385 _contextMenuActionProviderDelegateNeedsOverride = YES; 8386 _page->startInteractionWith ElementAtPosition(_positionInformation.request.point);8386 _page->startInteractionWithPositionInformation(_positionInformation); 8387 8387 continueWithContextMenuConfiguration(configurationFromDD); 8388 8388 return YES; … … 8817 8817 if ([_previewItemController type] == UIPreviewItemTypeLink) { 8818 8818 _longPressCanClick = NO; 8819 _page->startInteractionWith ElementAtPosition(_positionInformation.request.point);8819 _page->startInteractionWithPositionInformation(_positionInformation); 8820 8820 8821 8821 // Treat animated images like a link preview … … 8877 8877 8878 8878 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->startInteractionWith ElementAtPosition(_positionInformation.request.point);8879 _page->startInteractionWithPositionInformation(_positionInformation); 8880 8880 8881 8881 ALLOW_DEPRECATED_DECLARATIONS_BEGIN -
trunk/Source/WebKit/UIProcess/ios/WebPageProxyIOS.mm
r250780 r250876 625 625 } 626 626 627 void WebPageProxy::startInteractionWith ElementAtPosition(const WebCore::IntPoint& point)628 { 629 m_process->send(Messages::WebPage::StartInteractionWithElement AtPosition(point), m_webPageID);627 void WebPageProxy::startInteractionWithPositionInformation(const InteractionInformationAtPosition& positionInformation) 628 { 629 m_process->send(Messages::WebPage::StartInteractionWithElementContextOrPosition(positionInformation.elementContext, positionInformation.request.point), m_webPageID); 630 630 } 631 631 -
trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj
r250729 r250876 723 723 2DE6943D18BD2A68005C15E5 /* SmartMagnificationControllerMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2DE6943B18BD2A68005C15E5 /* SmartMagnificationControllerMessageReceiver.cpp */; }; 724 724 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 */; }; 726 726 2DE9B13A2231F61C005287B7 /* _WKTextInputContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DE9B1382231F61C005287B7 /* _WKTextInputContext.h */; settings = {ATTRIBUTES = (Private, ); }; }; 727 727 2DE9B13C2231F77C005287B7 /* _WKTextInputContextInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 2DE9B13B2231F77C005287B7 /* _WKTextInputContextInternal.h */; }; … … 2881 2881 2DE6943B18BD2A68005C15E5 /* SmartMagnificationControllerMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SmartMagnificationControllerMessageReceiver.cpp; path = DerivedSources/WebKit2/SmartMagnificationControllerMessageReceiver.cpp; sourceTree = BUILT_PRODUCTS_DIR; }; 2882 2882 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>"; }; 2885 2885 2DE9B1372231F61C005287B7 /* _WKTextInputContext.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = _WKTextInputContext.mm; sourceTree = "<group>"; }; 2886 2886 2DE9B1382231F61C005287B7 /* _WKTextInputContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKTextInputContext.h; sourceTree = "<group>"; }; … … 5278 5278 8CFECE931490F140002AAA32 /* EditorState.cpp */, 5279 5279 1AA41AB412C02EC4002BE67B /* EditorState.h */, 5280 2DE9B1342231B5B2005287B7 /* ElementContext.cpp */, 5281 2DE9B1332231B5B2005287B7 /* ElementContext.h */, 5280 5282 C59C4A5618B81174007BDCB6 /* FocusedElementInformation.cpp */, 5281 5283 C59C4A5718B81174007BDCB6 /* FocusedElementInformation.h */, … … 5330 5332 5272B2891406985D0096A5D0 /* StatisticsData.h */, 5331 5333 1A5E4DA312D3BD3D0099A2BB /* TextCheckerState.h */, 5332 2DE9B1342231B5B2005287B7 /* TextInputContext.cpp */,5333 2DE9B1332231B5B2005287B7 /* TextInputContext.h */,5334 5334 2FD43B921FA006A30083F51C /* TouchBarMenuData.cpp */, 5335 5335 2FD43B911FA006A10083F51C /* TouchBarMenuData.h */, … … 9490 9490 E105FE5418D7B9DE008F57A8 /* EditingRange.h in Headers */, 9491 9491 1AA41AB512C02EC4002BE67B /* EditorState.h in Headers */, 9492 2DE9B1352231B5B2005287B7 /* ElementContext.h in Headers */, 9492 9493 BC032DA810F437D10058C15A /* Encoder.h in Headers */, 9493 9494 51B15A8513843A3900321AD8 /* EnvironmentUtilities.h in Headers */, … … 9808 9809 53CFBBC82224D1B500266546 /* TextCheckerCompletion.h in Headers */, 9809 9810 1A5E4DA412D3BD3D0099A2BB /* TextCheckerState.h in Headers */, 9810 2DE9B1352231B5B2005287B7 /* TextInputContext.h in Headers */,9811 9811 CE1A0BD71A48E6C60054EF74 /* TextInputSPI.h in Headers */, 9812 9812 1AAF263914687C39004A1E8A /* TiledCoreAnimationDrawingArea.h in Headers */, -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp
r250738 r250876 6750 6750 } 6751 6751 6752 void WebPage::textInputContextsInRect(WebCore::FloatRect searchRect, CompletionHandler<void(const Vector< TextInputContext>&)>&& completionHandler)6753 { 6754 Vector<WebKit:: TextInputContext> textInputContexts;6752 void WebPage::textInputContextsInRect(WebCore::FloatRect searchRect, CompletionHandler<void(const Vector<ElementContext>&)>&& completionHandler) 6753 { 6754 Vector<WebKit::ElementContext> textInputContexts; 6755 6755 6756 6756 for (Frame* frame = &m_page->mainFrame(); frame; frame = frame->tree().traverseNext()) { … … 6778 6778 continue; 6779 6779 6780 WebKit:: TextInputContext context;6780 WebKit::ElementContext context; 6781 6781 context.webPageIdentifier = m_identifier; 6782 6782 context.documentIdentifier = document->identifier(); … … 6791 6791 } 6792 6792 6793 void WebPage::focusTextInputContext(const TextInputContext& textInputContext, CompletionHandler<void(bool)>&& completionHandler)6794 { 6795 RefPtr<Element> element = elementFor TextInputContext(textInputContext);6793 void WebPage::focusTextInputContext(const ElementContext& textInputContext, CompletionHandler<void(bool)>&& completionHandler) 6794 { 6795 RefPtr<Element> element = elementForContext(textInputContext); 6796 6796 6797 6797 if (element) … … 6801 6801 } 6802 6802 6803 Element* WebPage::elementFor TextInputContext(const TextInputContext& textInputContext)6804 { 6805 if ( textInputContext.webPageIdentifier != m_identifier)6803 Element* WebPage::elementForContext(const ElementContext& elementContext) const 6804 { 6805 if (elementContext.webPageIdentifier != m_identifier) 6806 6806 return nullptr; 6807 6807 6808 auto* document = Document::allDocumentsMap().get( textInputContext.documentIdentifier);6808 auto* document = Document::allDocumentsMap().get(elementContext.documentIdentifier); 6809 6809 if (!document) 6810 6810 return nullptr; … … 6813 6813 return nullptr; 6814 6814 6815 return document->searchForElementByIdentifier(textInputContext.elementIdentifier); 6815 return document->searchForElementByIdentifier(elementContext.elementIdentifier); 6816 } 6817 6818 Optional<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) }; 6816 6829 } 6817 6830 -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.h
r250256 r250876 262 262 struct DataDetectionResult; 263 263 struct EditorState; 264 struct ElementContext; 264 265 struct FontInfo; 265 266 struct InsertTextOptions; … … 268 269 struct LoadParameters; 269 270 struct PrintInfo; 270 struct TextInputContext;271 271 struct WebAutocorrectionData; 272 272 struct WebAutocorrectionContext; … … 612 612 void selectAll(); 613 613 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)>&&); 616 616 617 617 #if PLATFORM(IOS_FAMILY) … … 669 669 void getPositionInformation(const InteractionInformationRequest&, CompletionHandler<void(InteractionInformationAtPosition&&)>&&); 670 670 void requestPositionInformation(const InteractionInformationRequest&); 671 void startInteractionWithElement AtPosition(const WebCore::IntPoint&);671 void startInteractionWithElementContextOrPosition(Optional<ElementContext>&&, WebCore::IntPoint&&); 672 672 void stopInteraction(); 673 673 void performActionOnElement(uint32_t action); … … 1189 1189 void configureLoggingChannel(const String&, WTFLogChannelState, WTFLogLevel); 1190 1190 1191 WebCore::Element* elementForTextInputContext(const TextInputContext&); 1191 WebCore::Element* elementForContext(const ElementContext&) const; 1192 Optional<ElementContext> contextForElement(WebCore::Element&) const; 1192 1193 1193 1194 #if ENABLE(APPLE_PAY) -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in
r250256 r250876 87 87 GetPositionInformation(struct WebKit::InteractionInformationRequest request) -> (struct WebKit::InteractionInformationAtPosition information) Synchronous 88 88 RequestPositionInformation(struct WebKit::InteractionInformationRequest request) 89 StartInteractionWithElement AtPosition(WebCore::IntPoint point)89 StartInteractionWithElementContextOrPosition(Optional<WebKit::ElementContext> elementContext, WebCore::IntPoint point) 90 90 StopInteraction() 91 91 PerformActionOnElement(uint32_t action) … … 570 570 #endif 571 571 572 TextInputContextsInRect(WebCore::FloatRect rect) -> (Vector<struct WebKit:: TextInputContext> contexts) Async573 FocusTextInputContext(struct WebKit:: TextInputContext context) -> (bool success) Async572 TextInputContextsInRect(WebCore::FloatRect rect) -> (Vector<struct WebKit::ElementContext> contexts) Async 573 FocusTextInputContext(struct WebKit::ElementContext context) -> (bool success) Async 574 574 575 575 #if ENABLE(RESOURCE_LOAD_STATISTICS) -
trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm
r250780 r250876 2716 2716 boundsPositionInformation(*renderer, info); 2717 2717 } 2718 2719 info.elementContext = page.contextForElement(element); 2718 2720 } 2719 2721 … … 2814 2816 } 2815 2817 2816 void WebPage::startInteractionWithElement AtPosition(const WebCore::IntPoint& point)2817 { 2818 // FIXME: We've already performed a hit test when the long-press gesture was recognized and we2819 // used that result to generate the targeted preview, but now we are hit testing again in order2820 // to perform the selected action. Since an arbitrary amount of time can elapse between2821 // generating the targeted preview and the user selecting an action, it's possible that this2822 // second hit test will find a different element than the first one, leading to bugs like2823 // <rdar://problem/54723131>. We should re-use the results of the first hit test instead. 2818 void 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 2824 2826 FloatPoint adjustedPoint; 2825 2827 m_interactionNode = m_page->mainFrame().nodeRespondingToInteraction(point, adjustedPoint); … … 3936 3938 3937 3939 if (auto textInputContext = request.textInputContext) { 3938 RefPtr<Element> element = elementFor TextInputContext(*textInputContext);3940 RefPtr<Element> element = elementForContext(*textInputContext); 3939 3941 if (!element) { 3940 3942 completionHandler({ });
Note: See TracChangeset
for help on using the changeset viewer.