[webkit-changes] [WebKit/WebKit] 075cc1: WKWebView sometimes allows app links to open when ...
David Quesada
noreply at github.com
Sat Feb 22 11:16:32 PST 2025
Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 075cc18c58a3ebdd1074093a5dae9dc483cf6b91
https://github.com/WebKit/WebKit/commit/075cc18c58a3ebdd1074093a5dae9dc483cf6b91
Author: David Quesada <david_quesada at apple.com>
Date: 2025-02-22 (Sat, 22 Feb 2025)
Changed paths:
M Source/WebKit/UIProcess/WebPageProxy.cpp
M Tools/TestWebKitAPI/SourcesCocoa.txt
M Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
A Tools/TestWebKitAPI/Tests/WebKitCocoa/ShouldOpenAppLinks.mm
Log Message:
-----------
WKWebView sometimes allows app links to open when reloading after a web process crash
https://bugs.webkit.org/show_bug.cgi?id=288159
rdar://141515904
Reviewed by Alex Christensen.
In some cases, reloading the web view after a web process crash can result in the
WKWebView opening the current URL as an app link and punching out to the app, which
can be quite annoying for the user. Ordinarily, web view reloads arent't be eligible
for opening app links because doing so requires that the navigation is from one host
to a different one. But when performing a reload after a web process crash, the main
frame's URL has been reset to null after the process termination, and having a null
URL technically satisifies the different-host requirement because the previously
loaded URL's host is *anything except null*.
Prevent these unexpected app launches by adding a requirement that `shouldOpenAppLinks`
can only be true when the main frame's URL is non-null, since opening app links
automatically only makes sense when there is actual content loaded in the web view
that the user might have explicitly interacted with. An exception to this requirement
is made if the web view has never committed any provisional navigations, as is the
case when one web view opens another to a URL that ends up resolving to an app link.
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::decidePolicyForNavigationAction):
Implement the aforementioned check.
* Tools/TestWebKitAPI/SourcesCocoa.txt:
* Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* Tools/TestWebKitAPI/Tests/WebKitCocoa/ShouldOpenAppLinks.mm: Added.
(-[ShouldOpenAppLinksTestNavigationDelegate init]):
Set up a navigation delegate for the tests that retains the most recent
WKNavigationAction and reloads the web view on web process crash. Manually
performing this reload is necessary because the WebPageProxy doesn't internally
do this reload itself if the crash was requested by the client.
(shouldOpenAppLinksTestServer):
(TEST(ShouldOpenAppLinks, DisallowAppLinksWhenReloadingAfterWebProcessCrash)):
(TEST(ShouldOpenAppLinks, DisallowAppLinksWhenReloadingAfterWebProcessCrashAfterFollowingLink)):
Verify that WKNavigationAction._shouldOpenAppLinks (which reflects the same
underlying effective policy that WebKit internally uses to decide whether to
try opening URLs as app links) is false when deciding the navigatiom policy
for a reload being performed after a web process crash. Add a distinct test
case for the case where the web view has been navigated by the user clicking
a link. In that case, unlike the first, it appears the user-initiated nature
of the navigation to a second page attaches a policy of
ShouldOpenExternalURLsPolicy::ShouldAllow to the HistoryItem being reloaded,
which was previously allowing `shouldOpenAppLinks` to evaluate to true.
Canonical link: https://commits.webkit.org/290885@main
To unsubscribe from these emails, change your notification settings at https://github.com/WebKit/WebKit/settings/notifications
More information about the webkit-changes
mailing list