[webkit-changes] [WebKit/WebKit] 301fe8: REGRESSION (Safari 16.3): Passing "noopener" as th...
RemyDemarest
noreply at github.com
Mon Aug 28 08:30:11 PDT 2023
Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 301fe8a7cb268ab64cc6c4debd43ba3e66c35e59
https://github.com/WebKit/WebKit/commit/301fe8a7cb268ab64cc6c4debd43ba3e66c35e59
Author: Remy Demarest <rdemarest at apple.com>
Date: 2023-08-28 (Mon, 28 Aug 2023)
Changed paths:
M Source/WebCore/loader/FrameLoader.cpp
M Source/WebCore/page/Chrome.cpp
M Source/WebCore/page/LocalDOMWindow.cpp
M Source/WebCore/page/WindowFeatures.cpp
M Source/WebCore/page/WindowFeatures.h
M Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in
M Source/WebKit/UIProcess/API/C/WKPage.cpp
M Source/WebKit/UIProcess/API/Cocoa/WKWindowFeatures.mm
M Source/WebKit/UIProcess/API/Cocoa/WKWindowFeaturesPrivate.h
M Source/WebKit/UIProcess/API/glib/WebKitWindowProperties.cpp
M Source/WebKitLegacy/mac/WebCoreSupport/WebChromeClient.mm
M Tools/TestWebKitAPI/Tests/WebKitCocoa/OpenAndCloseWindow.mm
Log Message:
-----------
REGRESSION (Safari 16.3): Passing "noopener" as third argument opens tabs into new window
https://bugs.webkit.org/show_bug.cgi?id=259093
rdar://112086061
Reviewed by BJ Burg and Chris Dumez.
The changes herein bring WebKit up to the HTML specs for window.open().
First, this commit now parses the popup field which is specified in the specs but
was missing in our parser. We also start parsing the resizable field which is defined
in our API but was never parsed. Finally, we mark all other member fields of optional
rather than setting a default value for each of them.
Second, this adds the member fields wantsPopup and hasAdditionalFeatures:
hasAdditionalFeatures is serialized and sent to the UI Process to indicate that we
detected other strings than the ones we normally parse.
The field wantsPopup implements the algorithm described here:
https://html.spec.whatwg.org/multipage/nav-history-apis.html#apis-for-creating-and-navigating-browsing-contexts-by-name
aimed at determining whether we should display a popup or not. Its value is determined
in the following way:
- features noopener and noreferrer do not count towards the tested feature string.
- empty features (two commas in a row), strings made of spaces only do not towards
the tested feature string. So spaces and commas don't make the string not empty.
- every other words or characters are counted.
As such the first test to determine the value of wantsPopup is to check whether any
feature is defined or if the string contains additional features, the latter flag is
only set if the string contains anything but spaces and commas. This matches the
behavior from other browsers and prescribed by the specs.
Finally, despite being declared as nullable, the corresponding properties in WKWindowFeatures
could never be in fact nil; changing all member fields in WindowFeatures to std::optional
allows us to return nil in the corresponding properties when those features are missing.
We also add private properties for the corresponding WindowFeatures member fields.
These changes ostensibly fixes the issue in question since we needed the ability to check
for the absence of the window features. However, to be correct a browser should adopt the
new properties as well.
* Source/WebCore/loader/FrameLoader.cpp:
(WebCore::createWindow):
* Source/WebCore/page/Chrome.cpp:
(WebCore::Chrome::createWindow):
* Source/WebCore/page/LocalDOMWindow.cpp:
(WebCore::LocalDOMWindow::createWindow):
* Source/WebCore/page/WindowFeatures.cpp:
(WebCore::WindowFeatures::wantsPopup const):
Implements the specs algorithm to check if we need to get a popup. No features declared
besides noopener and noreferrer means we do not want a popup.
(WebCore::parseWindowFeatures):
Stop setting default values for the window features to avoid indicating that those features
were declared in the string. Compute wantsPopup after we are done parsing the string.
(WebCore::setWindowFeature):
Add a parse step for the popup feature and set the additional features when they are not empty
strings or strings made of spaces.
(WebCore::parseDialogFeatures):
Dialogs are always popups.
* Source/WebCore/page/WindowFeatures.h:
Make all potential features optional. Add convenience member functions to use instead of
using noopener and noreferrer directly.
(WebCore::WindowFeatures::wantsNoOpener const):
(WebCore::WindowFeatures::wantsNoReferrer const):
* Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in:
Match the declaration above. Serialize the three new fields.
* Source/WebKit/UIProcess/API/C/WKPage.cpp:
(WKPageSetPageUIClient):
Save the new fields in the window feature dictionary for legacy clients.
* Source/WebKit/UIProcess/API/Cocoa/WKWindowFeatures.mm:
(-[WKWindowFeatures menuBarVisibility]):
(-[WKWindowFeatures statusBarVisibility]):
(-[WKWindowFeatures toolbarsVisibility]):
(-[WKWindowFeatures allowsResizing]):
(-[WKWindowFeatures _wantsPopup]):
(-[WKWindowFeatures _hasAdditionalFeatures]):
(-[WKWindowFeatures _popup]):
(-[WKWindowFeatures _locationBarVisibility]):
(-[WKWindowFeatures _scrollbarsVisibility]):
(-[WKWindowFeatures _fullscreenDisplay]):
(-[WKWindowFeatures _dialogDisplay]):
* Source/WebKit/UIProcess/API/Cocoa/WKWindowFeaturesPrivate.h:
Check if the value is defined and return it as a boolean otherwise return nil.
* Source/WebKit/UIProcess/API/glib/WebKitWindowProperties.cpp:
Convert optional features into glib API.
(webkitWindowPropertiesSetGeometry):
(webkitWindowPropertiesSetWantsPopup):
* Source/WebKitLegacy/mac/WebCoreSupport/WebChromeClient.mm:
(WebChromeClient::createWindow):
Write the new fields in the window feature dictionary for legacy clients.
Only write optional fields if they are not null.
* Tools/TestWebKitAPI/Tests/WebKitCocoa/OpenAndCloseWindow.mm:
(TEST(WebKit, OpenWindowFeatures)):
- Reenable the tests checking for the nil case when the string is empty.
- Add checks for the new fields in the API.
- Add tests for noopener and noreferrer features.
- Add test for hasAdditionalFeatures.
- Add test for a string containing only separators.
Canonical link: https://commits.webkit.org/267354@main
More information about the webkit-changes
mailing list