Branch: refs/heads/main Home: https://github.com/WebKit/WebKit Commit: 301fe8a7cb268ab64cc6c4debd43ba3e66c35e59 https://github.com/WebKit/WebKit/commit/301fe8a7cb268ab64cc6c4debd43ba3e66c35e59 Author: Remy Demarest <rdemar...@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 _______________________________________________ webkit-changes mailing list webkit-changes@lists.webkit.org https://lists.webkit.org/mailman/listinfo/webkit-changes