Changeset 257872 in webkit
- Timestamp:
- Mar 4, 2020 12:35:46 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 6 added
- 25 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r257870 r257872 1 2020-03-04 Alex Christensen <achristensen@webkit.org> 2 3 WKWebView's frames accessor should return a traversable type 4 https://bugs.webkit.org/show_bug.cgi?id=208591 5 6 Reviewed by Brady Eidson. 7 8 Rather than return an array of information that can technically be used to reconstruct a tree, 9 let's just return the root of a tree. This introduces _WKFrameTreeNode which inherits from WKFrameInfo. 10 Covered by API tests. 11 12 * Shared/API/APIObject.h: 13 * Shared/Cocoa/APIObject.mm: 14 (API::Object::newObject): 15 * Shared/FrameInfoData.cpp: 16 (WebKit::FrameInfoData::encode const): 17 (WebKit::FrameInfoData::decode): 18 * Shared/FrameInfoData.h: 19 * Shared/FrameTreeNodeData.h: Added. 20 (WebKit::FrameTreeNodeData::encode const): 21 (WebKit::FrameTreeNodeData::decode): 22 * Sources.txt: 23 * SourcesCocoa.txt: 24 * UIProcess/API/APIFrameInfo.cpp: 25 (API::FrameInfo::parentFrameHandle const): Deleted. 26 (API::FrameInfo::childFrameHandles const): Deleted. 27 * UIProcess/API/APIFrameInfo.h: 28 * UIProcess/API/APIFrameTreeNode.cpp: Added. 29 (API::FrameTreeNode::handle const): 30 * UIProcess/API/APIFrameTreeNode.h: Added. 31 * UIProcess/API/Cocoa/WKFrameInfo.mm: 32 (-[WKFrameInfo _parentFrameHandle]): Deleted. 33 (-[WKFrameInfo _childFrameHandles]): Deleted. 34 * UIProcess/API/Cocoa/WKFrameInfoPrivate.h: 35 * UIProcess/API/Cocoa/WKWebView.mm: 36 (-[WKWebView _frames:]): 37 (-[WKWebView _allFrames:]): Deleted. 38 * UIProcess/API/Cocoa/WKWebViewPrivate.h: 39 * UIProcess/API/Cocoa/_WKFrameTreeNode.h: Added. 40 * UIProcess/API/Cocoa/_WKFrameTreeNode.mm: Added. 41 (-[_WKFrameTreeNode dealloc]): 42 (-[_WKFrameTreeNode isMainFrame]): 43 (-[_WKFrameTreeNode request]): 44 (-[_WKFrameTreeNode securityOrigin]): 45 (-[_WKFrameTreeNode webView]): 46 (-[_WKFrameTreeNode childFrames]): 47 (-[_WKFrameTreeNode copyWithZone:]): 48 (-[_WKFrameTreeNode _handle]): 49 (-[_WKFrameTreeNode _apiObject]): 50 * UIProcess/API/Cocoa/_WKFrameTreeNodeInternal.h: Added. 51 * UIProcess/WebPageProxy.cpp: 52 (WebKit::WebPageProxy::getAllFrames): 53 * UIProcess/WebPageProxy.h: 54 * WebKit.xcodeproj/project.pbxproj: 55 * WebProcess/Geolocation/GeolocationPermissionRequestManager.cpp: 56 * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp: 57 (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction): 58 * WebProcess/WebPage/WebFrame.cpp: 59 (WebKit::WebFrame::info const): 60 (WebKit::WebFrame::childFrameIDs const): Deleted. 61 * WebProcess/WebPage/WebFrame.h: 62 (WebKit::WebFrame::frameID const): 63 * WebProcess/WebPage/WebPage.cpp: 64 (WebKit::frameTreeNodeData): 65 (WebKit::WebPage::getAllFrames): 66 * WebProcess/WebPage/WebPage.h: 67 * WebProcess/WebPage/WebPage.messages.in: 68 1 69 2020-03-04 Antoine Quint <graouts@apple.com> 2 70 -
trunk/Source/WebKit/Shared/API/APIObject.h
r257552 r257872 126 126 FrameInfo, 127 127 FramePolicyListener, 128 FrameTreeNode, 128 129 FullScreenManager, 129 130 GeolocationManager, -
trunk/Source/WebKit/Shared/Cocoa/APIObject.mm
r257552 r257872 77 77 #import "_WKExperimentalFeatureInternal.h" 78 78 #import "_WKFrameHandleInternal.h" 79 #import "_WKFrameTreeNodeInternal.h" 79 80 #import "_WKGeolocationPositionInternal.h" 80 81 #import "_WKHitTestResultInternal.h" … … 242 243 break; 243 244 245 case Type::FrameTreeNode: 246 wrapper = [_WKFrameTreeNode alloc]; 247 break; 244 248 #if PLATFORM(IOS_FAMILY) 245 249 case Type::GeolocationPosition: -
trunk/Source/WebKit/Shared/FrameInfoData.cpp
r257571 r257872 37 37 encoder << securityOrigin; 38 38 encoder << frameID; 39 encoder << parentFrameID;40 encoder << childFrameIDs;41 39 } 42 40 … … 63 61 return WTF::nullopt; 64 62 65 Optional<Optional<WebCore::FrameIdentifier>> parentFrameID;66 decoder >> parentFrameID;67 if (!frameID)68 return WTF::nullopt;69 70 Optional<Vector<WebCore::FrameIdentifier>> childFrameIDs;71 decoder >> childFrameIDs;72 if (!frameID)73 return WTF::nullopt;74 75 63 return {{ 76 64 WTFMove(*isMainFrame), 77 65 WTFMove(*request), 78 66 WTFMove(*securityOrigin), 79 WTFMove(*frameID), 80 WTFMove(*parentFrameID), 81 WTFMove(*childFrameIDs) 67 WTFMove(*frameID) 82 68 }}; 83 69 } -
trunk/Source/WebKit/Shared/FrameInfoData.h
r257571 r257872 45 45 WebCore::SecurityOriginData securityOrigin; 46 46 Optional<WebCore::FrameIdentifier> frameID; 47 Optional<WebCore::FrameIdentifier> parentFrameID;48 Vector<WebCore::FrameIdentifier> childFrameIDs;49 47 }; 50 48 -
trunk/Source/WebKit/Sources.txt
r257867 r257872 335 335 UIProcess/API/APIExperimentalFeature.cpp 336 336 UIProcess/API/APIFrameInfo.cpp 337 UIProcess/API/APIFrameTreeNode.cpp 337 338 UIProcess/API/APIHTTPCookieStore.cpp 338 339 UIProcess/API/APIHitTestResult.cpp -
trunk/Source/WebKit/SourcesCocoa.txt
r257851 r257872 256 256 UIProcess/API/Cocoa/_WKErrorRecoveryAttempting.mm 257 257 UIProcess/API/Cocoa/_WKExperimentalFeature.mm 258 UIProcess/API/Cocoa/_WKFrameTreeNode.mm 258 259 UIProcess/API/Cocoa/_WKGeolocationPosition.mm 259 260 UIProcess/API/Cocoa/_WKInspector.mm -
trunk/Source/WebKit/UIProcess/API/APIFrameInfo.cpp
r257571 r257872 50 50 } 51 51 52 RefPtr<FrameHandle> FrameInfo::parentFrameHandle() const53 {54 if (!m_data.parentFrameID)55 return nullptr;56 return FrameHandle::create(*m_data.parentFrameID);57 }58 59 Vector<Ref<FrameHandle>> FrameInfo::childFrameHandles() const60 {61 Vector<Ref<FrameHandle>> handles;62 handles.reserveInitialCapacity(m_data.childFrameIDs.size());63 for (auto& childFrameID : m_data.childFrameIDs)64 handles.uncheckedAppend(FrameHandle::create(childFrameID));65 return handles;66 }67 68 52 } // namespace API -
trunk/Source/WebKit/UIProcess/API/APIFrameInfo.h
r257571 r257872 54 54 WebCore::SecurityOriginData& securityOrigin() { return m_data.securityOrigin; } 55 55 Ref<FrameHandle> handle() const; 56 RefPtr<FrameHandle> parentFrameHandle() const;57 Vector<Ref<FrameHandle>> childFrameHandles() const;58 56 WebKit::WebPageProxy* page() { return m_page.get(); } 59 57 -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKFrameInfo.mm
r257571 r257872 90 90 } 91 91 92 - (_WKFrameHandle *)_parentFrameHandle93 {94 return [[wrapper(_frameInfo->parentFrameHandle()) retain] autorelease];95 }96 97 - (NSArray<_WKFrameHandle *> *)_childFrameHandles98 {99 const auto& handles = _frameInfo->childFrameHandles();100 if (!handles.size())101 return nil;102 NSMutableArray<_WKFrameHandle *> *set = [NSMutableArray arrayWithCapacity:handles.size()];103 for (auto& handle : handles)104 [set addObject:wrapper(handle.get())];105 return set;106 }107 108 92 @end -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKFrameInfoPrivate.h
r257571 r257872 31 31 32 32 @property (nonatomic, readonly, copy, nonnull) _WKFrameHandle *_handle WK_API_AVAILABLE(macos(10.12), ios(10.0)); 33 @property (nonatomic, readonly, copy, nullable) _WKFrameHandle *_parentFrameHandle WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));34 @property (nonatomic, readonly, copy, nullable) NSArray<_WKFrameHandle *> *_childFrameHandles WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));35 33 36 34 @end -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm
r257830 r257872 28 28 29 29 #import "APIFormClient.h" 30 #import "APIFrameTreeNode.h" 30 31 #import "APIPageConfiguration.h" 31 32 #import "APISerializedScriptValue.h" … … 98 99 #import "_WKFindDelegate.h" 99 100 #import "_WKFrameHandleInternal.h" 101 #import "_WKFrameTreeNodeInternal.h" 100 102 #import "_WKFullscreenDelegate.h" 101 103 #import "_WKHitTestResultInternal.h" … … 1583 1585 } 1584 1586 1585 - (void)_allFrames:(void (^)(NSArray<WKFrameInfo *> *))completionHandler 1586 { 1587 _page->getAllFrames([completionHandler = makeBlockPtr(completionHandler), page = makeRefPtr(_page.get())] (Vector<WebKit::FrameInfoData>&& frames) { 1588 NSMutableArray<WKFrameInfo *> *apiFrames = [NSMutableArray arrayWithCapacity:frames.size()]; 1589 for (auto& frame : WTFMove(frames)) 1590 [apiFrames addObject:wrapper(API::FrameInfo::create(WTFMove(frame), page.get()))]; 1591 completionHandler(apiFrames); 1587 - (void)_frames:(void (^)(_WKFrameTreeNode *))completionHandler 1588 { 1589 _page->getAllFrames([completionHandler = makeBlockPtr(completionHandler), page = makeRef(*_page.get())] (WebKit::FrameTreeNodeData&& data) { 1590 _WKFrameTreeNode *node = [[wrapper(API::FrameTreeNode::create(WTFMove(data), page.get())) retain] autorelease]; 1591 completionHandler(node); 1592 1592 }); 1593 1593 } -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h
r257830 r257872 106 106 @class WKBrowsingContextHandle; 107 107 @class WKWebpagePreferences; 108 @class WKFrameInfo;109 108 @class _WKApplicationManifest; 110 109 @class _WKFrameHandle; 110 @class _WKFrameTreeNode; 111 111 @class _WKHitTestResult; 112 112 @class _WKInspector; … … 173 173 @property (nonatomic, readonly) BOOL _negotiatedLegacyTLS WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA)); 174 174 175 - (void)_ allFrames:(void (^)(NSArray<WKFrameInfo *>*))completionHandler WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));175 - (void)_frames:(void (^)(_WKFrameTreeNode *))completionHandler WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA)); 176 176 177 177 // FIXME: Remove these once nobody is using them. -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r257830 r257872 4052 4052 #endif 4053 4053 4054 void WebPageProxy::getAllFrames(CompletionHandler<void( Vector<FrameInfoData>&&)>&& completionHandler)4054 void WebPageProxy::getAllFrames(CompletionHandler<void(FrameTreeNodeData&&)>&& completionHandler) 4055 4055 { 4056 4056 sendWithAsyncReply(Messages::WebPage::GetAllFrames(), WTFMove(completionHandler)); -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r257830 r257872 322 322 struct EditingRange; 323 323 struct EditorState; 324 struct FrameTreeNodeData; 324 325 struct FocusedElementInformation; 325 326 struct FontInfo; … … 505 506 void sendMessageToInspectorFrontend(const String& targetId, const String& message); 506 507 507 void getAllFrames(CompletionHandler<void( Vector<FrameInfoData>&&)>&&);508 void getAllFrames(CompletionHandler<void(FrameTreeNodeData&&)>&&); 508 509 509 510 #if ENABLE(REMOTE_INSPECTOR) -
trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj
r257867 r257872 1149 1149 5C0B17781E7C880E00E9123C /* NetworkSocketStreamMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C0B17741E7C879C00E9123C /* NetworkSocketStreamMessageReceiver.cpp */; }; 1150 1150 5C0B17791E7C882100E9123C /* WebSocketStreamMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C0B17761E7C879C00E9123C /* WebSocketStreamMessageReceiver.cpp */; }; 1151 5C121E842410208D00486F9B /* FrameTreeNodeData.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C121E8324101F7000486F9B /* FrameTreeNodeData.h */; }; 1152 5C121E89241029C900486F9B /* _WKFrameTreeNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C121E882410290D00486F9B /* _WKFrameTreeNode.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1151 1153 5C1426ED1C23F80900D41183 /* NetworkProcessCreationParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C1426E31C23F80500D41183 /* NetworkProcessCreationParameters.h */; }; 1152 1154 5C1426EE1C23F80900D41183 /* NetworkProcessSupplement.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C1426E41C23F80500D41183 /* NetworkProcessSupplement.h */; }; … … 3954 3956 5C0B177F1E7C886700E9123C /* NetworkSocketStream.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NetworkSocketStream.messages.in; sourceTree = "<group>"; }; 3955 3957 5C0B17801E7C888000E9123C /* WebSocketStream.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = WebSocketStream.messages.in; path = Network/WebSocketStream.messages.in; sourceTree = "<group>"; }; 3958 5C121E8324101F7000486F9B /* FrameTreeNodeData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FrameTreeNodeData.h; sourceTree = "<group>"; }; 3959 5C121E852410276F00486F9B /* APIFrameTreeNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIFrameTreeNode.h; sourceTree = "<group>"; }; 3960 5C121E862410290D00486F9B /* _WKFrameTreeNode.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = _WKFrameTreeNode.mm; sourceTree = "<group>"; }; 3961 5C121E872410290D00486F9B /* _WKFrameTreeNodeInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKFrameTreeNodeInternal.h; sourceTree = "<group>"; }; 3962 5C121E882410290D00486F9B /* _WKFrameTreeNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKFrameTreeNode.h; sourceTree = "<group>"; }; 3963 5C121E8B2410306600486F9B /* APIFrameTreeNode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = APIFrameTreeNode.cpp; sourceTree = "<group>"; }; 3956 3964 5C13024A1FE341A7000D9B31 /* WebsitePoliciesData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebsitePoliciesData.h; sourceTree = "<group>"; }; 3957 3965 5C1426E21C23F80500D41183 /* NetworkProcessCreationParameters.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkProcessCreationParameters.cpp; sourceTree = "<group>"; }; … … 5873 5881 1A14F8DF1D74C834006CBEC6 /* FrameInfoData.cpp */, 5874 5882 1A14F8E01D74C834006CBEC6 /* FrameInfoData.h */, 5883 5C121E8324101F7000486F9B /* FrameTreeNodeData.h */, 5875 5884 1AC75A1A1B3368270056745B /* HangDetectionDisabler.h */, 5876 5885 BCCF6B2312C93E7A008F9C35 /* ImageOptions.h */, … … 7046 7055 2E7A94491BBD95C600945547 /* _WKFocusedElementInfo.h */, 7047 7056 37A64E5618F38F4600EB30F1 /* _WKFormInputSession.h */, 7057 5C121E882410290D00486F9B /* _WKFrameTreeNode.h */, 7058 5C121E862410290D00486F9B /* _WKFrameTreeNode.mm */, 7059 5C121E872410290D00486F9B /* _WKFrameTreeNodeInternal.h */, 7048 7060 CD78E1181DB7E5AD0014A2DE /* _WKFullscreenDelegate.h */, 7049 7061 63FABE191E970D65003011D5 /* _WKGeolocationCoreLocationProvider.h */, … … 8917 8929 2DF9EEE31A781FB400B6CFBE /* APIFrameInfo.cpp */, 8918 8930 2DF9EEE41A781FB400B6CFBE /* APIFrameInfo.h */, 8931 5C121E8B2410306600486F9B /* APIFrameTreeNode.cpp */, 8932 5C121E852410276F00486F9B /* APIFrameTreeNode.h */, 8919 8933 CD78E1161DB7DC0A0014A2DE /* APIFullscreenClient.h */, 8920 8934 7AB6EA461EEAB6B000037B2B /* APIGeolocationProvider.h */, … … 10281 10295 373D122318A473010066D9CC /* _WKFrameHandle.h in Headers */, 10282 10296 373D122718A473F60066D9CC /* _WKFrameHandleInternal.h in Headers */, 10297 5C121E89241029C900486F9B /* _WKFrameTreeNode.h in Headers */, 10283 10298 CD78E1191DB7E5AD0014A2DE /* _WKFullscreenDelegate.h in Headers */, 10284 10299 636353A51E9858DF0009F8AF /* _WKGeolocationCoreLocationProvider.h in Headers */, … … 10530 10545 1A14F8E21D74C834006CBEC6 /* FrameInfoData.h in Headers */, 10531 10546 1AE00D611831792100087DD7 /* FrameLoadState.h in Headers */, 10547 5C121E842410208D00486F9B /* FrameTreeNodeData.h in Headers */, 10532 10548 2D4AF0892044C3C4006C8817 /* FrontBoardServicesSPI.h in Headers */, 10533 10549 CD78E1151DB7D7ED0014A2DE /* FullscreenClient.h in Headers */, -
trunk/Source/WebKit/WebProcess/Geolocation/GeolocationPermissionRequestManager.cpp
r257571 r257872 29 29 #if ENABLE(GEOLOCATION) 30 30 31 #include "FrameInfoData.h" 31 32 #include "WebCoreArgumentCoders.h" 32 33 #include "WebFrame.h" -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp
r257840 r257872 945 945 auto* requestingFrame = requester.frameID() ? WebProcess::singleton().webFrame(requester.frameID()) : nullptr; 946 946 Optional<WebCore::FrameIdentifier> originatingFrameID; 947 Optional<WebCore::FrameIdentifier> parentFrameID; 948 Vector<WebCore::FrameIdentifier> childFrameIDs; 949 if (requestingFrame) { 947 if (requestingFrame) 950 948 originatingFrameID = requestingFrame->frameID(); 951 childFrameIDs = requestingFrame->childFrameIDs();952 if (auto* parentFrame = requestingFrame->parentFrame())953 parentFrameID = parentFrame->frameID();954 }955 949 956 950 FrameInfoData originatingFrameInfoData { … … 958 952 ResourceRequest { requester.url() }, 959 953 requester.securityOrigin().data(), 960 WTFMove(originatingFrameID), 961 WTFMove(parentFrameID), 962 WTFMove(childFrameIDs) 954 WTFMove(originatingFrameID) 963 955 }; 964 956 -
trunk/Source/WebKit/WebProcess/WebPage/WebFrame.cpp
r257592 r257872 187 187 } 188 188 189 Vector<WebCore::FrameIdentifier> WebFrame::childFrameIDs() const190 {191 Vector<WebCore::FrameIdentifier> identifiers;192 for (auto* childFrame = m_coreFrame->tree().firstChild(); childFrame; childFrame = childFrame->tree().nextSibling()) {193 if (auto* childWebFrame = WebFrame::fromCoreFrame(*childFrame))194 identifiers.append(childWebFrame->frameID());195 }196 return identifiers;197 };198 199 189 FrameInfoData WebFrame::info() const 200 190 { 201 auto* parent = parentFrame();202 203 191 FrameInfoData info { 204 192 isMainFrame(), … … 206 194 ResourceRequest(URL(URL(), url())), 207 195 SecurityOriginData::fromFrame(m_coreFrame), 208 m_frameID, 209 parent ? Optional<WebCore::FrameIdentifier> { parent->frameID() } : WTF::nullopt, 210 childFrameIDs() 196 m_frameID 211 197 }; 212 198 -
trunk/Source/WebKit/WebProcess/WebPage/WebFrame.h
r257571 r257872 80 80 FrameInfoData info() const; 81 81 WebCore::FrameIdentifier frameID() const { return m_frameID; } 82 Vector<WebCore::FrameIdentifier> childFrameIDs() const;83 82 84 83 enum class ForNavigationAction { No, Yes }; -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp
r257867 r257872 39 39 #include "FindController.h" 40 40 #include "FormDataReference.h" 41 #include "FrameTreeNodeData.h" 41 42 #include "GeolocationPermissionRequestManager.h" 42 43 #include "InjectUserScriptImmediately.h" … … 1752 1753 } 1753 1754 1754 void WebPage::getAllFrames(CompletionHandler<void(Vector<FrameInfoData>&&)>&& completionHandler) 1755 { 1756 Vector<FrameInfoData> data; 1757 for (auto* frame = &m_page->mainFrame(); frame; frame = frame->tree().traverseNext()) { 1758 if (auto* webFrame = WebFrame::fromCoreFrame(*frame)) 1759 data.append(webFrame->info()); 1760 } 1761 completionHandler(WTFMove(data)); 1755 static Optional<FrameTreeNodeData> frameTreeNodeData(Frame& frame) 1756 { 1757 Optional<FrameTreeNodeData> info; 1758 if (auto* webFrame = WebFrame::fromCoreFrame(frame)) { 1759 Vector<FrameTreeNodeData> children; 1760 for (auto* childFrame = frame.tree().firstChild(); childFrame; childFrame = childFrame->tree().nextSibling()) { 1761 if (auto childInfo = frameTreeNodeData(*childFrame)) 1762 children.append(WTFMove(*childInfo)); 1763 } 1764 info = FrameTreeNodeData { 1765 webFrame->info(), 1766 WTFMove(children) 1767 }; 1768 } 1769 return info; 1770 } 1771 1772 void WebPage::getAllFrames(CompletionHandler<void(FrameTreeNodeData&&)>&& completionHandler) 1773 { 1774 completionHandler(*frameTreeNodeData(m_page->mainFrame())); 1762 1775 } 1763 1776 -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.h
r257830 r257872 279 279 struct DocumentEditingContextRequest; 280 280 struct EditorState; 281 struct FrameTreeNodeData; 281 282 struct FontInfo; 282 283 struct InsertTextOptions; … … 1289 1290 void setAllowsContentJavaScriptFromMostRecentNavigation(WebCore::AllowsContentJavaScript allows) { m_allowsContentJavaScriptFromMostRecentNavigation = allows; } 1290 1291 1291 void getAllFrames(CompletionHandler<void( Vector<FrameInfoData>&&)>&&);1292 void getAllFrames(CompletionHandler<void(FrameTreeNodeData&&)>&&); 1292 1293 1293 1294 void setIsNavigatingToAppBoundDomainTesting(bool, CompletionHandler<void()>&&); -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in
r257830 r257872 196 196 # Callbacks. 197 197 GetContentsAsString(enum:bool WebKit::ContentAsStringIncludesChildFrames inChildFrames, WebKit::CallbackID callbackID) 198 GetAllFrames() -> ( Vector<WebKit::FrameInfoData> frames) Async198 GetAllFrames() -> (struct WebKit::FrameTreeNodeData mainFrame) Async 199 199 #if PLATFORM(COCOA) 200 200 GetContentsAsAttributedString() -> (struct WebKit::AttributedString result) Async -
trunk/Tools/ChangeLog
r257870 r257872 1 2020-03-04 Alex Christensen <achristensen@webkit.org> 2 3 WKWebView's frames accessor should return a traversable type 4 https://bugs.webkit.org/show_bug.cgi?id=208591 5 6 Reviewed by Brady Eidson. 7 8 * TestWebKitAPI/Tests/WebKitCocoa/WKURLSchemeHandler-1.mm: 9 1 10 2020-03-04 Antoine Quint <graouts@apple.com> 2 11 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKURLSchemeHandler-1.mm
r257571 r257872 39 39 #import <WebKit/WebKit.h> 40 40 #import <WebKit/_WKFrameHandle.h> 41 #import <WebKit/_WKFrameTreeNode.h> 41 42 #import <wtf/BlockPtr.h> 42 43 #import <wtf/HashMap.h> … … 1020 1021 auto configuration = adoptNS([WKWebViewConfiguration new]); 1021 1022 auto handler = adoptNS([TestURLSchemeHandler new]); 1022 __block size_t framesLoaded = 0;1023 __block size_t grandchildFramesLoaded = 0; 1023 1024 [handler setStartURLSchemeTaskHandler:^(WKWebView *, id<WKURLSchemeTask> task) { 1024 1025 NSString *responseString = nil; … … 1026 1027 responseString = @"<iframe src='frame://host2/'></iframe>"; 1027 1028 else if ([task.request.URL.absoluteString isEqualToString:@"frame://host2/"]) 1028 responseString = @"<iframe src='frame://host3/' ></iframe><iframe src='frame://host4/'></iframe>";1029 responseString = @"<iframe src='frame://host3/' onload='fetch(\"loadedGrandchildFrame\")'></iframe><iframe src='frame://host4/' onload='fetch(\"loadedGrandchildFrame\")'></iframe>"; 1029 1030 else if ([task.request.URL.absoluteString isEqualToString:@"frame://host3/"]) 1030 1031 responseString = @"frame content"; 1031 1032 else if ([task.request.URL.absoluteString isEqualToString:@"frame://host4/"]) 1032 1033 responseString = @"frame content"; 1034 else if ([task.request.URL.path isEqualToString:@"/loadedGrandchildFrame"]) { 1035 responseString = @"fetched content"; 1036 ++grandchildFramesLoaded; 1037 } 1033 1038 1034 1039 ASSERT(responseString); … … 1037 1042 [task didReceiveData:[responseString dataUsingEncoding:NSUTF8StringEncoding]]; 1038 1043 [task didFinish]; 1039 ++framesLoaded;1040 1044 }]; 1041 1045 [configuration setURLSchemeHandler:handler.get() forURLScheme:@"frame"]; … … 1043 1047 [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"frame://host1/"]]]; 1044 1048 1045 while ( framesLoaded < 4)1049 while (grandchildFramesLoaded < 2) 1046 1050 TestWebKitAPI::Util::spinRunLoop(); 1047 1051 1048 [webView _allFrames:^(NSArray<WKFrameInfo *> *frames) { 1049 EXPECT_EQ(frames.count, framesLoaded); 1050 EXPECT_NULL(frames[0]._parentFrameHandle); 1051 EXPECT_EQ(frames[0]._childFrameHandles.count, 1u); 1052 EXPECT_EQ(frames[1]._parentFrameHandle.frameID, frames[0]._handle.frameID); 1053 EXPECT_EQ(frames[1]._childFrameHandles.count, 2u); 1054 EXPECT_EQ(frames[1]._childFrameHandles[0].frameID, frames[2]._handle.frameID); 1055 EXPECT_EQ(frames[1]._childFrameHandles[1].frameID, frames[3]._handle.frameID); 1056 EXPECT_EQ(frames[2]._parentFrameHandle.frameID, frames[1]._handle.frameID); 1057 EXPECT_NULL(frames[2]._childFrameHandles); 1058 EXPECT_EQ(frames[3]._parentFrameHandle.frameID, frames[1]._handle.frameID); 1059 EXPECT_NULL(frames[3]._childFrameHandles); 1052 [webView _frames:^(_WKFrameTreeNode *mainFrame) { 1053 EXPECT_WK_STREQ(mainFrame.securityOrigin.host, "host1"); 1054 EXPECT_WK_STREQ(mainFrame.request.URL.host, "host1"); 1055 EXPECT_EQ(mainFrame.childFrames.count, 1u); 1056 EXPECT_TRUE(mainFrame.isMainFrame); 1057 1058 _WKFrameTreeNode *child = mainFrame.childFrames[0]; 1059 EXPECT_WK_STREQ(child.request.URL.host, "host2"); 1060 EXPECT_WK_STREQ(child.securityOrigin.host, "host2"); 1061 EXPECT_EQ(child.childFrames.count, 2u); 1062 EXPECT_FALSE(child.isMainFrame); 1063 1064 _WKFrameTreeNode *grandchild1 = child.childFrames[0]; 1065 EXPECT_WK_STREQ(grandchild1.request.URL.host, "host3"); 1066 EXPECT_WK_STREQ(grandchild1.securityOrigin.host, "host3"); 1067 EXPECT_EQ(grandchild1.childFrames.count, 0u); 1068 EXPECT_FALSE(grandchild1.isMainFrame); 1069 1070 _WKFrameTreeNode *grandchild2 = child.childFrames[1]; 1071 EXPECT_WK_STREQ(grandchild2.request.URL.host, "host4"); 1072 EXPECT_WK_STREQ(grandchild2.securityOrigin.host, "host4"); 1073 EXPECT_EQ(grandchild2.childFrames.count, 0u); 1074 EXPECT_FALSE(grandchild2.isMainFrame); 1075 1076 EXPECT_NE(mainFrame._handle.frameID, child._handle.frameID); 1077 EXPECT_NE(mainFrame._handle.frameID, grandchild1._handle.frameID); 1078 EXPECT_NE(mainFrame._handle.frameID, grandchild2._handle.frameID); 1079 EXPECT_NE(child._handle.frameID, grandchild1._handle.frameID); 1080 EXPECT_NE(child._handle.frameID, grandchild2._handle.frameID); 1081 EXPECT_NE(grandchild1._handle.frameID, grandchild2._handle.frameID); 1082 1060 1083 done = true; 1061 1084 }];
Note: See TracChangeset
for help on using the changeset viewer.