Changeset 257872 in webkit


Ignore:
Timestamp:
Mar 4, 2020 12:35:46 PM (4 years ago)
Author:
achristensen@apple.com
Message:

WKWebView's frames accessor should return a traversable type
https://bugs.webkit.org/show_bug.cgi?id=208591

Reviewed by Brady Eidson.

Source/WebKit:

Rather than return an array of information that can technically be used to reconstruct a tree,
let's just return the root of a tree. This introduces _WKFrameTreeNode which inherits from WKFrameInfo.
Covered by API tests.

  • Shared/API/APIObject.h:
  • Shared/Cocoa/APIObject.mm:

(API::Object::newObject):

  • Shared/FrameInfoData.cpp:

(WebKit::FrameInfoData::encode const):
(WebKit::FrameInfoData::decode):

  • Shared/FrameInfoData.h:
  • Shared/FrameTreeNodeData.h: Added.

(WebKit::FrameTreeNodeData::encode const):
(WebKit::FrameTreeNodeData::decode):

  • Sources.txt:
  • SourcesCocoa.txt:
  • UIProcess/API/APIFrameInfo.cpp:

(API::FrameInfo::parentFrameHandle const): Deleted.
(API::FrameInfo::childFrameHandles const): Deleted.

  • UIProcess/API/APIFrameInfo.h:
  • UIProcess/API/APIFrameTreeNode.cpp: Added.

(API::FrameTreeNode::handle const):

  • UIProcess/API/APIFrameTreeNode.h: Added.
  • UIProcess/API/Cocoa/WKFrameInfo.mm:

(-[WKFrameInfo _parentFrameHandle]): Deleted.
(-[WKFrameInfo _childFrameHandles]): Deleted.

  • UIProcess/API/Cocoa/WKFrameInfoPrivate.h:
  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView _frames:]):
(-[WKWebView _allFrames:]): Deleted.

  • UIProcess/API/Cocoa/WKWebViewPrivate.h:
  • UIProcess/API/Cocoa/_WKFrameTreeNode.h: Added.
  • UIProcess/API/Cocoa/_WKFrameTreeNode.mm: Added.

(-[_WKFrameTreeNode dealloc]):
(-[_WKFrameTreeNode isMainFrame]):
(-[_WKFrameTreeNode request]):
(-[_WKFrameTreeNode securityOrigin]):
(-[_WKFrameTreeNode webView]):
(-[_WKFrameTreeNode childFrames]):
(-[_WKFrameTreeNode copyWithZone:]):
(-[_WKFrameTreeNode _handle]):
(-[_WKFrameTreeNode _apiObject]):

  • UIProcess/API/Cocoa/_WKFrameTreeNodeInternal.h: Added.
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::getAllFrames):

  • UIProcess/WebPageProxy.h:
  • WebKit.xcodeproj/project.pbxproj:
  • WebProcess/Geolocation/GeolocationPermissionRequestManager.cpp:
  • WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:

(WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction):

  • WebProcess/WebPage/WebFrame.cpp:

(WebKit::WebFrame::info const):
(WebKit::WebFrame::childFrameIDs const): Deleted.

  • WebProcess/WebPage/WebFrame.h:

(WebKit::WebFrame::frameID const):

  • WebProcess/WebPage/WebPage.cpp:

(WebKit::frameTreeNodeData):
(WebKit::WebPage::getAllFrames):

  • WebProcess/WebPage/WebPage.h:
  • WebProcess/WebPage/WebPage.messages.in:

Tools:

  • TestWebKitAPI/Tests/WebKitCocoa/WKURLSchemeHandler-1.mm:
Location:
trunk
Files:
6 added
25 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r257870 r257872  
     12020-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
    1692020-03-04  Antoine Quint  <graouts@apple.com>
    270
  • trunk/Source/WebKit/Shared/API/APIObject.h

    r257552 r257872  
    126126        FrameInfo,
    127127        FramePolicyListener,
     128        FrameTreeNode,
    128129        FullScreenManager,
    129130        GeolocationManager,
  • trunk/Source/WebKit/Shared/Cocoa/APIObject.mm

    r257552 r257872  
    7777#import "_WKExperimentalFeatureInternal.h"
    7878#import "_WKFrameHandleInternal.h"
     79#import "_WKFrameTreeNodeInternal.h"
    7980#import "_WKGeolocationPositionInternal.h"
    8081#import "_WKHitTestResultInternal.h"
     
    242243        break;
    243244
     245    case Type::FrameTreeNode:
     246        wrapper = [_WKFrameTreeNode alloc];
     247        break;
    244248#if PLATFORM(IOS_FAMILY)
    245249    case Type::GeolocationPosition:
  • trunk/Source/WebKit/Shared/FrameInfoData.cpp

    r257571 r257872  
    3737    encoder << securityOrigin;
    3838    encoder << frameID;
    39     encoder << parentFrameID;
    40     encoder << childFrameIDs;
    4139}
    4240
     
    6361        return WTF::nullopt;
    6462
    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 
    7563    return {{
    7664        WTFMove(*isMainFrame),
    7765        WTFMove(*request),
    7866        WTFMove(*securityOrigin),
    79         WTFMove(*frameID),
    80         WTFMove(*parentFrameID),
    81         WTFMove(*childFrameIDs)
     67        WTFMove(*frameID)
    8268    }};
    8369}
  • trunk/Source/WebKit/Shared/FrameInfoData.h

    r257571 r257872  
    4545    WebCore::SecurityOriginData securityOrigin;
    4646    Optional<WebCore::FrameIdentifier> frameID;
    47     Optional<WebCore::FrameIdentifier> parentFrameID;
    48     Vector<WebCore::FrameIdentifier> childFrameIDs;
    4947};
    5048
  • trunk/Source/WebKit/Sources.txt

    r257867 r257872  
    335335UIProcess/API/APIExperimentalFeature.cpp
    336336UIProcess/API/APIFrameInfo.cpp
     337UIProcess/API/APIFrameTreeNode.cpp
    337338UIProcess/API/APIHTTPCookieStore.cpp
    338339UIProcess/API/APIHitTestResult.cpp
  • trunk/Source/WebKit/SourcesCocoa.txt

    r257851 r257872  
    256256UIProcess/API/Cocoa/_WKErrorRecoveryAttempting.mm
    257257UIProcess/API/Cocoa/_WKExperimentalFeature.mm
     258UIProcess/API/Cocoa/_WKFrameTreeNode.mm
    258259UIProcess/API/Cocoa/_WKGeolocationPosition.mm
    259260UIProcess/API/Cocoa/_WKInspector.mm
  • trunk/Source/WebKit/UIProcess/API/APIFrameInfo.cpp

    r257571 r257872  
    5050}
    5151
    52 RefPtr<FrameHandle> FrameInfo::parentFrameHandle() const
    53 {
    54     if (!m_data.parentFrameID)
    55         return nullptr;
    56     return FrameHandle::create(*m_data.parentFrameID);
    57 }
    58 
    59 Vector<Ref<FrameHandle>> FrameInfo::childFrameHandles() const
    60 {
    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 
    6852} // namespace API
  • trunk/Source/WebKit/UIProcess/API/APIFrameInfo.h

    r257571 r257872  
    5454    WebCore::SecurityOriginData& securityOrigin() { return m_data.securityOrigin; }
    5555    Ref<FrameHandle> handle() const;
    56     RefPtr<FrameHandle> parentFrameHandle() const;
    57     Vector<Ref<FrameHandle>> childFrameHandles() const;
    5856    WebKit::WebPageProxy* page() { return m_page.get(); }
    5957
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKFrameInfo.mm

    r257571 r257872  
    9090}
    9191
    92 - (_WKFrameHandle *)_parentFrameHandle
    93 {
    94     return [[wrapper(_frameInfo->parentFrameHandle()) retain] autorelease];
    95 }
    96 
    97 - (NSArray<_WKFrameHandle *> *)_childFrameHandles
    98 {
    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 
    10892@end
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKFrameInfoPrivate.h

    r257571 r257872  
    3131
    3232@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));
    3533
    3634@end
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm

    r257830 r257872  
    2828
    2929#import "APIFormClient.h"
     30#import "APIFrameTreeNode.h"
    3031#import "APIPageConfiguration.h"
    3132#import "APISerializedScriptValue.h"
     
    9899#import "_WKFindDelegate.h"
    99100#import "_WKFrameHandleInternal.h"
     101#import "_WKFrameTreeNodeInternal.h"
    100102#import "_WKFullscreenDelegate.h"
    101103#import "_WKHitTestResultInternal.h"
     
    15831585}
    15841586
    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);
    15921592    });
    15931593}
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h

    r257830 r257872  
    106106@class WKBrowsingContextHandle;
    107107@class WKWebpagePreferences;
    108 @class WKFrameInfo;
    109108@class _WKApplicationManifest;
    110109@class _WKFrameHandle;
     110@class _WKFrameTreeNode;
    111111@class _WKHitTestResult;
    112112@class _WKInspector;
     
    173173@property (nonatomic, readonly) BOOL _negotiatedLegacyTLS WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
    174174
    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));
    176176
    177177// FIXME: Remove these once nobody is using them.
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r257830 r257872  
    40524052#endif
    40534053
    4054 void WebPageProxy::getAllFrames(CompletionHandler<void(Vector<FrameInfoData>&&)>&& completionHandler)
     4054void WebPageProxy::getAllFrames(CompletionHandler<void(FrameTreeNodeData&&)>&& completionHandler)
    40554055{
    40564056    sendWithAsyncReply(Messages::WebPage::GetAllFrames(), WTFMove(completionHandler));
  • trunk/Source/WebKit/UIProcess/WebPageProxy.h

    r257830 r257872  
    322322struct EditingRange;
    323323struct EditorState;
     324struct FrameTreeNodeData;
    324325struct FocusedElementInformation;
    325326struct FontInfo;
     
    505506    void sendMessageToInspectorFrontend(const String& targetId, const String& message);
    506507
    507     void getAllFrames(CompletionHandler<void(Vector<FrameInfoData>&&)>&&);
     508    void getAllFrames(CompletionHandler<void(FrameTreeNodeData&&)>&&);
    508509
    509510#if ENABLE(REMOTE_INSPECTOR)
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r257867 r257872  
    11491149                5C0B17781E7C880E00E9123C /* NetworkSocketStreamMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C0B17741E7C879C00E9123C /* NetworkSocketStreamMessageReceiver.cpp */; };
    11501150                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, ); }; };
    11511153                5C1426ED1C23F80900D41183 /* NetworkProcessCreationParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C1426E31C23F80500D41183 /* NetworkProcessCreationParameters.h */; };
    11521154                5C1426EE1C23F80900D41183 /* NetworkProcessSupplement.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C1426E41C23F80500D41183 /* NetworkProcessSupplement.h */; };
     
    39543956                5C0B177F1E7C886700E9123C /* NetworkSocketStream.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NetworkSocketStream.messages.in; sourceTree = "<group>"; };
    39553957                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>"; };
    39563964                5C13024A1FE341A7000D9B31 /* WebsitePoliciesData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebsitePoliciesData.h; sourceTree = "<group>"; };
    39573965                5C1426E21C23F80500D41183 /* NetworkProcessCreationParameters.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkProcessCreationParameters.cpp; sourceTree = "<group>"; };
     
    58735881                                1A14F8DF1D74C834006CBEC6 /* FrameInfoData.cpp */,
    58745882                                1A14F8E01D74C834006CBEC6 /* FrameInfoData.h */,
     5883                                5C121E8324101F7000486F9B /* FrameTreeNodeData.h */,
    58755884                                1AC75A1A1B3368270056745B /* HangDetectionDisabler.h */,
    58765885                                BCCF6B2312C93E7A008F9C35 /* ImageOptions.h */,
     
    70467055                                2E7A94491BBD95C600945547 /* _WKFocusedElementInfo.h */,
    70477056                                37A64E5618F38F4600EB30F1 /* _WKFormInputSession.h */,
     7057                                5C121E882410290D00486F9B /* _WKFrameTreeNode.h */,
     7058                                5C121E862410290D00486F9B /* _WKFrameTreeNode.mm */,
     7059                                5C121E872410290D00486F9B /* _WKFrameTreeNodeInternal.h */,
    70487060                                CD78E1181DB7E5AD0014A2DE /* _WKFullscreenDelegate.h */,
    70497061                                63FABE191E970D65003011D5 /* _WKGeolocationCoreLocationProvider.h */,
     
    89178929                                2DF9EEE31A781FB400B6CFBE /* APIFrameInfo.cpp */,
    89188930                                2DF9EEE41A781FB400B6CFBE /* APIFrameInfo.h */,
     8931                                5C121E8B2410306600486F9B /* APIFrameTreeNode.cpp */,
     8932                                5C121E852410276F00486F9B /* APIFrameTreeNode.h */,
    89198933                                CD78E1161DB7DC0A0014A2DE /* APIFullscreenClient.h */,
    89208934                                7AB6EA461EEAB6B000037B2B /* APIGeolocationProvider.h */,
     
    1028110295                                373D122318A473010066D9CC /* _WKFrameHandle.h in Headers */,
    1028210296                                373D122718A473F60066D9CC /* _WKFrameHandleInternal.h in Headers */,
     10297                                5C121E89241029C900486F9B /* _WKFrameTreeNode.h in Headers */,
    1028310298                                CD78E1191DB7E5AD0014A2DE /* _WKFullscreenDelegate.h in Headers */,
    1028410299                                636353A51E9858DF0009F8AF /* _WKGeolocationCoreLocationProvider.h in Headers */,
     
    1053010545                                1A14F8E21D74C834006CBEC6 /* FrameInfoData.h in Headers */,
    1053110546                                1AE00D611831792100087DD7 /* FrameLoadState.h in Headers */,
     10547                                5C121E842410208D00486F9B /* FrameTreeNodeData.h in Headers */,
    1053210548                                2D4AF0892044C3C4006C8817 /* FrontBoardServicesSPI.h in Headers */,
    1053310549                                CD78E1151DB7D7ED0014A2DE /* FullscreenClient.h in Headers */,
  • trunk/Source/WebKit/WebProcess/Geolocation/GeolocationPermissionRequestManager.cpp

    r257571 r257872  
    2929#if ENABLE(GEOLOCATION)
    3030
     31#include "FrameInfoData.h"
    3132#include "WebCoreArgumentCoders.h"
    3233#include "WebFrame.h"
  • trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp

    r257840 r257872  
    945945    auto* requestingFrame = requester.frameID() ? WebProcess::singleton().webFrame(requester.frameID()) : nullptr;
    946946    Optional<WebCore::FrameIdentifier> originatingFrameID;
    947     Optional<WebCore::FrameIdentifier> parentFrameID;
    948     Vector<WebCore::FrameIdentifier> childFrameIDs;
    949     if (requestingFrame) {
     947    if (requestingFrame)
    950948        originatingFrameID = requestingFrame->frameID();
    951         childFrameIDs = requestingFrame->childFrameIDs();
    952         if (auto* parentFrame = requestingFrame->parentFrame())
    953             parentFrameID = parentFrame->frameID();
    954     }
    955949
    956950    FrameInfoData originatingFrameInfoData {
     
    958952        ResourceRequest { requester.url() },
    959953        requester.securityOrigin().data(),
    960         WTFMove(originatingFrameID),
    961         WTFMove(parentFrameID),
    962         WTFMove(childFrameIDs)
     954        WTFMove(originatingFrameID)
    963955    };
    964956
  • trunk/Source/WebKit/WebProcess/WebPage/WebFrame.cpp

    r257592 r257872  
    187187}
    188188
    189 Vector<WebCore::FrameIdentifier> WebFrame::childFrameIDs() const
    190 {
    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 
    199189FrameInfoData WebFrame::info() const
    200190{
    201     auto* parent = parentFrame();
    202 
    203191    FrameInfoData info {
    204192        isMainFrame(),
     
    206194        ResourceRequest(URL(URL(), url())),
    207195        SecurityOriginData::fromFrame(m_coreFrame),
    208         m_frameID,
    209         parent ? Optional<WebCore::FrameIdentifier> { parent->frameID() } : WTF::nullopt,
    210         childFrameIDs()
     196        m_frameID
    211197    };
    212198
  • trunk/Source/WebKit/WebProcess/WebPage/WebFrame.h

    r257571 r257872  
    8080    FrameInfoData info() const;
    8181    WebCore::FrameIdentifier frameID() const { return m_frameID; }
    82     Vector<WebCore::FrameIdentifier> childFrameIDs() const;
    8382
    8483    enum class ForNavigationAction { No, Yes };
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp

    r257867 r257872  
    3939#include "FindController.h"
    4040#include "FormDataReference.h"
     41#include "FrameTreeNodeData.h"
    4142#include "GeolocationPermissionRequestManager.h"
    4243#include "InjectUserScriptImmediately.h"
     
    17521753}
    17531754
    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));
     1755static 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
     1772void WebPage::getAllFrames(CompletionHandler<void(FrameTreeNodeData&&)>&& completionHandler)
     1773{
     1774    completionHandler(*frameTreeNodeData(m_page->mainFrame()));
    17621775}
    17631776
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.h

    r257830 r257872  
    279279struct DocumentEditingContextRequest;
    280280struct EditorState;
     281struct FrameTreeNodeData;
    281282struct FontInfo;
    282283struct InsertTextOptions;
     
    12891290    void setAllowsContentJavaScriptFromMostRecentNavigation(WebCore::AllowsContentJavaScript allows) { m_allowsContentJavaScriptFromMostRecentNavigation = allows; }
    12901291
    1291     void getAllFrames(CompletionHandler<void(Vector<FrameInfoData>&&)>&&);
     1292    void getAllFrames(CompletionHandler<void(FrameTreeNodeData&&)>&&);
    12921293
    12931294    void setIsNavigatingToAppBoundDomainTesting(bool, CompletionHandler<void()>&&);
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in

    r257830 r257872  
    196196    # Callbacks.
    197197    GetContentsAsString(enum:bool WebKit::ContentAsStringIncludesChildFrames inChildFrames, WebKit::CallbackID callbackID)
    198     GetAllFrames() -> (Vector<WebKit::FrameInfoData> frames) Async
     198    GetAllFrames() -> (struct WebKit::FrameTreeNodeData mainFrame) Async
    199199#if PLATFORM(COCOA)
    200200    GetContentsAsAttributedString() -> (struct WebKit::AttributedString result) Async
  • trunk/Tools/ChangeLog

    r257870 r257872  
     12020-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
    1102020-03-04  Antoine Quint  <graouts@apple.com>
    211
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKURLSchemeHandler-1.mm

    r257571 r257872  
    3939#import <WebKit/WebKit.h>
    4040#import <WebKit/_WKFrameHandle.h>
     41#import <WebKit/_WKFrameTreeNode.h>
    4142#import <wtf/BlockPtr.h>
    4243#import <wtf/HashMap.h>
     
    10201021    auto configuration = adoptNS([WKWebViewConfiguration new]);
    10211022    auto handler = adoptNS([TestURLSchemeHandler new]);
    1022     __block size_t framesLoaded = 0;
     1023    __block size_t grandchildFramesLoaded = 0;
    10231024    [handler setStartURLSchemeTaskHandler:^(WKWebView *, id<WKURLSchemeTask> task) {
    10241025        NSString *responseString = nil;
     
    10261027            responseString = @"<iframe src='frame://host2/'></iframe>";
    10271028        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>";
    10291030        else if ([task.request.URL.absoluteString isEqualToString:@"frame://host3/"])
    10301031            responseString = @"frame content";
    10311032        else if ([task.request.URL.absoluteString isEqualToString:@"frame://host4/"])
    10321033            responseString = @"frame content";
     1034        else if ([task.request.URL.path isEqualToString:@"/loadedGrandchildFrame"]) {
     1035            responseString = @"fetched content";
     1036            ++grandchildFramesLoaded;
     1037        }
    10331038
    10341039        ASSERT(responseString);
     
    10371042        [task didReceiveData:[responseString dataUsingEncoding:NSUTF8StringEncoding]];
    10381043        [task didFinish];
    1039         ++framesLoaded;
    10401044    }];
    10411045    [configuration setURLSchemeHandler:handler.get() forURLScheme:@"frame"];
     
    10431047    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"frame://host1/"]]];
    10441048
    1045     while (framesLoaded < 4)
     1049    while (grandchildFramesLoaded < 2)
    10461050        TestWebKitAPI::Util::spinRunLoop();
    10471051   
    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
    10601083        done = true;
    10611084    }];
Note: See TracChangeset for help on using the changeset viewer.