Skip to content

Commit

Permalink
Add SPI WKNavigationAction._targetFrameName
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=249505
rdar://103446360

Reviewed by Brady Eidson.

This will help the last 2 clients migrate from
WKPageSetPagePolicyClient to WKNavigationDelegate and WKUIDelegate.

* Source/WebKit/UIProcess/API/APINavigationAction.h:
* Source/WebKit/UIProcess/API/Cocoa/WKNavigationAction.mm:
(-[WKNavigationAction _targetFrameName]):
* Source/WebKit/UIProcess/API/Cocoa/WKNavigationActionPrivate.h:
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::decidePolicyForNavigationAction):
(WebKit::WebPageProxy::createNewPage):
* Tools/TestWebKitAPI/Tests/WebKitCocoa/NavigationAction.mm:
(TEST):

Canonical link: https://commits.webkit.org/266233@main
  • Loading branch information
achristensen07 committed Jul 23, 2023
1 parent bd0d59d commit e31512b
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 8 deletions.
8 changes: 4 additions & 4 deletions Source/WebKit/UIProcess/API/APINavigationAction.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class NavigationAction final : public ObjectImpl<Object::Type::NavigationAction>

FrameInfo* sourceFrame() const { return m_sourceFrame.get(); }
FrameInfo* targetFrame() const { return m_targetFrame.get(); }
std::optional<WTF::String> targetFrameName() const { return m_targetFrameName; }
const WTF::String& targetFrameName() const { return m_targetFrameName; }

const WebCore::ResourceRequest& request() const { return m_request; }
const WTF::URL& originalURL() const { return !m_originalURL.isNull() ? m_originalURL : m_request.url(); }
Expand Down Expand Up @@ -79,7 +79,7 @@ class NavigationAction final : public ObjectImpl<Object::Type::NavigationAction>
const WebKit::NavigationActionData& data() const { return m_navigationActionData; }

private:
NavigationAction(WebKit::NavigationActionData&& navigationActionData, API::FrameInfo* sourceFrame, API::FrameInfo* targetFrame, std::optional<WTF::String> targetFrameName, WebCore::ResourceRequest&& request, const WTF::URL& originalURL, bool shouldOpenAppLinks, RefPtr<UserInitiatedAction>&& userInitiatedAction, API::Navigation* mainFrameNavigation)
NavigationAction(WebKit::NavigationActionData&& navigationActionData, API::FrameInfo* sourceFrame, API::FrameInfo* targetFrame, const WTF::String& targetFrameName, WebCore::ResourceRequest&& request, const WTF::URL& originalURL, bool shouldOpenAppLinks, RefPtr<UserInitiatedAction>&& userInitiatedAction, API::Navigation* mainFrameNavigation)
: m_sourceFrame(sourceFrame)
, m_targetFrame(targetFrame)
, m_targetFrameName(targetFrameName)
Expand All @@ -92,14 +92,14 @@ class NavigationAction final : public ObjectImpl<Object::Type::NavigationAction>
{
}

NavigationAction(WebKit::NavigationActionData&& navigationActionData, API::FrameInfo* sourceFrame, API::FrameInfo* targetFrame, std::optional<WTF::String> targetFrameName, WebCore::ResourceRequest&& request, const WTF::URL& originalURL, bool shouldOpenAppLinks, RefPtr<UserInitiatedAction>&& userInitiatedAction)
NavigationAction(WebKit::NavigationActionData&& navigationActionData, API::FrameInfo* sourceFrame, API::FrameInfo* targetFrame, const WTF::String& targetFrameName, WebCore::ResourceRequest&& request, const WTF::URL& originalURL, bool shouldOpenAppLinks, RefPtr<UserInitiatedAction>&& userInitiatedAction)
: NavigationAction(WTFMove(navigationActionData), sourceFrame, targetFrame, targetFrameName, WTFMove(request), originalURL, shouldOpenAppLinks, WTFMove(userInitiatedAction), nullptr)
{
}

RefPtr<FrameInfo> m_sourceFrame;
RefPtr<FrameInfo> m_targetFrame;
std::optional<WTF::String> m_targetFrameName;
WTF::String m_targetFrameName;

WebCore::ResourceRequest m_request;
WTF::URL m_originalURL;
Expand Down
8 changes: 8 additions & 0 deletions Source/WebKit/UIProcess/API/Cocoa/WKNavigationAction.mm
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,14 @@ - (_WKHitTestResult *)_hitTestResult
#endif
}

- (NSString *)_targetFrameName
{
auto& name = _navigationAction->targetFrameName();
if (name.isNull())
return nil;
return name;
}

- (BOOL)_hasOpener
{
return _navigationAction->hasOpener();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ typedef NS_ENUM(NSInteger, WKSyntheticClickType) {
@property (nonatomic, readonly) BOOL _shouldOpenExternalSchemes WK_API_AVAILABLE(macos(10.11), ios(9.0));
@property (nonatomic, readonly) BOOL _shouldOpenAppLinks WK_API_AVAILABLE(macos(10.11), ios(9.0));
@property (nonatomic, readonly) BOOL _shouldPerformDownload WK_API_DEPRECATED_WITH_REPLACEMENT("downloadAttribute", macos(10.15, 12.0), ios(13.0, 15.0));
@property (nonatomic, readonly) NSString *_targetFrameName WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));

@property (nonatomic, readonly) BOOL _shouldOpenExternalURLs WK_API_DEPRECATED("use _shouldOpenExternalSchemes and _shouldOpenAppLinks", macos(10.11, 10.11), ios(9.0, 9.0));

Expand Down
4 changes: 2 additions & 2 deletions Source/WebKit/UIProcess/API/glib/WebKitNavigationAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -202,8 +202,8 @@ const char* webkit_navigation_action_get_frame_name(WebKitNavigationAction* navi
{
g_return_val_if_fail(navigation, nullptr);
if (!navigation->frameName) {
if (auto targetFrameName = navigation->action->targetFrameName())
navigation->frameName = targetFrameName->utf8();
if (auto targetFrameName = navigation->action->targetFrameName(); !!targetFrameName)
navigation->frameName = targetFrameName.utf8();
else
navigation->frameName = CString();
}
Expand Down
4 changes: 2 additions & 2 deletions Source/WebKit/UIProcess/WebPageProxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6313,7 +6313,7 @@ void WebPageProxy::decidePolicyForNavigationAction(Ref<WebProcessProxy>&& proces
&& navigationActionData.navigationType != WebCore::NavigationType::BackForward;

auto userInitiatedActivity = process->userInitiatedActivity(navigationActionData.userGestureTokenIdentifier);
auto navigationAction = API::NavigationAction::create(WTFMove(navigationActionData), sourceFrameInfo.get(), destinationFrameInfo.ptr(), std::nullopt, ResourceRequest(request), originalRequest.url(), shouldOpenAppLinks, WTFMove(userInitiatedActivity), mainFrameNavigation);
auto navigationAction = API::NavigationAction::create(WTFMove(navigationActionData), sourceFrameInfo.get(), destinationFrameInfo.ptr(), String(), ResourceRequest(request), originalRequest.url(), shouldOpenAppLinks, WTFMove(userInitiatedActivity), mainFrameNavigation);

#if ENABLE(CONTENT_FILTERING)
if (frame.didHandleContentFilterUnblockNavigation(request)) {
Expand Down Expand Up @@ -6846,7 +6846,7 @@ void WebPageProxy::createNewPage(FrameInfoData&& originatingFrameInfoData, WebPa
m_process->consumeIfNotVerifiablyFromUIProcess(*userInitiatedActivity, navigationActionData.userGestureAuthorizationToken);

bool shouldOpenAppLinks = originatingFrameInfo->request().url().host() != request.url().host();
auto navigationAction = API::NavigationAction::create(WTFMove(navigationActionData), originatingFrameInfo.ptr(), nullptr, std::nullopt, WTFMove(request), URL(), shouldOpenAppLinks, WTFMove(userInitiatedActivity));
auto navigationAction = API::NavigationAction::create(WTFMove(navigationActionData), originatingFrameInfo.ptr(), nullptr, String(), WTFMove(request), URL(), shouldOpenAppLinks, WTFMove(userInitiatedActivity));

trySOAuthorization(WTFMove(navigationAction), *this, WTFMove(completionHandler), [this, protectedThis = Ref { *this }, windowFeatures = WTFMove(windowFeatures)] (Ref<API::NavigationAction>&& navigationAction, CompletionHandler<void(RefPtr<WebPageProxy>&&)>&& completionHandler) mutable {
m_uiClient->createNewPage(*this, WTFMove(windowFeatures), WTFMove(navigationAction), WTFMove(completionHandler));
Expand Down
41 changes: 41 additions & 0 deletions Tools/TestWebKitAPI/Tests/WebKitCocoa/NavigationAction.mm
Original file line number Diff line number Diff line change
Expand Up @@ -243,3 +243,44 @@ - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigat
[webView loadRequest:server.request()];
TestWebKitAPI::Util::run(&done);
}

TEST(WKNavigationAction, TargetFrameName)
{
auto navigationDelegate = adoptNS([TestNavigationDelegate new]);
auto uiDelegate = adoptNS([TestUIDelegate new]);
auto webView = adoptNS([WKWebView new]);
webView.get().configuration.preferences.javaScriptCanOpenWindowsAutomatically = YES;
webView.get().navigationDelegate = navigationDelegate.get();
webView.get().UIDelegate = uiDelegate.get();

enum class DelegateCallback : bool {
Ui,
Navigation
};
__block Vector<DelegateCallback> callbacks;
__block Vector<RetainPtr<NSString>> targetFrameNames;
navigationDelegate.get().decidePolicyForNavigationAction = ^(WKNavigationAction *navigationAction, void (^completionHandler)(WKNavigationActionPolicy)) {
targetFrameNames.append(navigationAction._targetFrameName);
callbacks.append(DelegateCallback::Navigation);
completionHandler(WKNavigationActionPolicyAllow);
};
uiDelegate.get().createWebViewWithConfiguration = ^WKWebView *(WKWebViewConfiguration *, WKNavigationAction *navigationAction, WKWindowFeatures *)
{
targetFrameNames.append(navigationAction._targetFrameName);
callbacks.append(DelegateCallback::Ui);
return nil;
};
[webView loadHTMLString:@"<script>window.open('https://webkit.org/')</script>" baseURL:nil];
while (callbacks.size() < 2)
TestWebKitAPI::Util::spinRunLoop();

[webView loadHTMLString:@"<script>onload=()=>{link.click()}</script><a href='https://webkit.org/' target='_blank' id='link'>click me!</a>" baseURL:nil];
while (callbacks.size() < 5)
TestWebKitAPI::Util::spinRunLoop();
EXPECT_EQ(callbacks, Vector<DelegateCallback>::from(DelegateCallback::Navigation, DelegateCallback::Ui, DelegateCallback::Navigation, DelegateCallback::Navigation, DelegateCallback::Ui));
EXPECT_NULL(targetFrameNames[0]);
EXPECT_NULL(targetFrameNames[1]);
EXPECT_NULL(targetFrameNames[2]);
EXPECT_WK_STREQ(targetFrameNames[3].get(), "_blank");
EXPECT_NULL(targetFrameNames[4]);
}

0 comments on commit e31512b

Please sign in to comment.