Skip to content

Commit

Permalink
Regression(270725@main) Many Web extensions API tests are crashing
Browse files Browse the repository at this point in the history
https://webkit.org/b/264885
rdar://problem/118464397

Reviewed by Chris Dumez.

Remove the None and All values from Web Extension OptionSet enums, and use new OptionSet::all()
instead to get a valid OptionSet for the given enum.

Add back the EnumTraits for the OptionSets, since GeneratedSerializers does not generate them,
and they are needed by OptionSet to check valid values.

* Source/WTF/wtf/OptionSet.h:
(WTF::OptionSet::all): Added.
* Source/WebKit/Shared/Extensions/WebExtensionWindow.serialization.in:
* Source/WebKit/UIProcess/API/Cocoa/_WKWebExtensionContext.mm:
(toImpl):
* Source/WebKit/UIProcess/Extensions/WebExtensionTab.h:
* Source/WebKit/UIProcess/Extensions/WebExtensionWindow.h:
* Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIWindowsCocoa.mm:
(WebKit::WebExtensionAPIWindows::parseWindowTypesFilter):
(WebKit::toWindowTypeFilter):
(WebKit::WebExtensionContextProxy::dispatchWindowsEvent):
* Source/WebKit/WebProcess/Extensions/API/Cocoa/WebExtensionAPIWindowsEventCocoa.mm:
(WebKit::WebExtensionAPIWindowsEvent::invokeListenersWithArgument):
* Source/WebKit/WebProcess/Extensions/API/WebExtensionAPIWindowsEvent.h:

Canonical link: https://commits.webkit.org/270782@main
  • Loading branch information
xeenon committed Nov 15, 2023
1 parent 42af8a3 commit 5effaab
Show file tree
Hide file tree
Showing 8 changed files with 50 additions and 21 deletions.
6 changes: 6 additions & 0 deletions Source/WTF/wtf/OptionSet.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,13 +125,19 @@ template<typename E> class OptionSet {

StorageType m_value;
};

using iterator = Iterator<StorageType>;

static constexpr OptionSet fromRaw(StorageType rawValue)
{
return OptionSet(static_cast<E>(maskRawValue<E>(rawValue)), FromRawValue);
}

static constexpr OptionSet all()
{
return fromRaw(std::numeric_limits<StorageType>::max());
}

constexpr OptionSet() = default;

constexpr OptionSet(E e)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,8 @@ struct WebKit::WebExtensionWindowParameters {
};

[OptionSet] enum class WebKit::WebExtensionWindowTypeFilter : uint8_t {
None,
Normal,
Popup,
All,
};

[Nested] enum class WebKit::WebExtensionWindow::State : uint8_t {
Expand Down
12 changes: 5 additions & 7 deletions Source/WebKit/UIProcess/API/Cocoa/_WKWebExtensionContext.mm
Original file line number Diff line number Diff line change
Expand Up @@ -716,15 +716,13 @@ - (void)didReplaceTab:(id<_WKWebExtensionTab>)oldTab withTab:(id<_WKWebExtension

static inline OptionSet<WebKit::WebExtensionTab::ChangedProperties> toImpl(_WKWebExtensionTabChangedProperties properties)
{
OptionSet<WebKit::WebExtensionTab::ChangedProperties> result;

if (properties == _WKWebExtensionTabChangedPropertiesNone)
return result;
return { };

if (properties == _WKWebExtensionTabChangedPropertiesAll) {
result.add(WebKit::WebExtensionTab::ChangedProperties::All);
return result;
}
if (properties == _WKWebExtensionTabChangedPropertiesAll)
return OptionSet<WebKit::WebExtensionTab::ChangedProperties>::all();

OptionSet<WebKit::WebExtensionTab::ChangedProperties> result;

if (properties & _WKWebExtensionTabChangedPropertiesAudible)
result.add(WebKit::WebExtensionTab::ChangedProperties::Audible);
Expand Down
21 changes: 19 additions & 2 deletions Source/WebKit/UIProcess/Extensions/WebExtensionTab.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ class WebExtensionTab : public RefCounted<WebExtensionTab>, public CanMakeWeakPt
explicit WebExtensionTab(const WebExtensionContext&, _WKWebExtensionTab *);

enum class ChangedProperties : uint16_t {
None = 0,
Audible = 1 << 1,
Loading = 1 << 2,
Muted = 1 << 3,
Expand All @@ -77,7 +76,6 @@ class WebExtensionTab : public RefCounted<WebExtensionTab>, public CanMakeWeakPt
Title = 1 << 7,
URL = 1 << 8,
ZoomFactor = 1 << 9,
All = Audible | Loading | Muted | Pinned | ReaderMode | Size | Title | URL | ZoomFactor,
};

using ImageFormat = WebExtensionTabImageFormat;
Expand Down Expand Up @@ -228,4 +226,23 @@ class WebExtensionTab : public RefCounted<WebExtensionTab>, public CanMakeWeakPt

} // namespace WebKit

namespace WTF {

template<> struct EnumTraits<WebKit::WebExtensionTab::ChangedProperties> {
using values = EnumValues<
WebKit::WebExtensionTab::ChangedProperties,
WebKit::WebExtensionTab::ChangedProperties::Audible,
WebKit::WebExtensionTab::ChangedProperties::Loading,
WebKit::WebExtensionTab::ChangedProperties::Muted,
WebKit::WebExtensionTab::ChangedProperties::Pinned,
WebKit::WebExtensionTab::ChangedProperties::ReaderMode,
WebKit::WebExtensionTab::ChangedProperties::Size,
WebKit::WebExtensionTab::ChangedProperties::Title,
WebKit::WebExtensionTab::ChangedProperties::URL,
WebKit::WebExtensionTab::ChangedProperties::ZoomFactor
>;
};

} // namespace WTF

#endif // ENABLE(WK_WEB_EXTENSIONS)
14 changes: 12 additions & 2 deletions Source/WebKit/UIProcess/Extensions/WebExtensionWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,8 @@ struct WebExtensionTabQueryParameters;
struct WebExtensionWindowParameters;

enum class WebExtensionWindowTypeFilter : uint8_t {
None = 0,
Normal = 1 << 0,
Popup = 1 << 1,
All = Normal | Popup,
};

class WebExtensionWindow : public RefCounted<WebExtensionWindow>, public CanMakeWeakPtr<WebExtensionWindow> {
Expand Down Expand Up @@ -154,4 +152,16 @@ _WKWebExtensionWindowState toAPI(WebExtensionWindow::State);

} // namespace WebKit

namespace WTF {

template<> struct EnumTraits<WebKit::WebExtensionWindowTypeFilter> {
using values = EnumValues<
WebKit::WebExtensionWindowTypeFilter,
WebKit::WebExtensionWindowTypeFilter::Normal,
WebKit::WebExtensionWindowTypeFilter::Popup
>;
};

} // namespace WTF

#endif // ENABLE(WK_WEB_EXTENSIONS)
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@
bool WebExtensionAPIWindows::parseWindowTypesFilter(NSDictionary *options, OptionSet<WindowTypeFilter>& windowTypeFilter, NSString *sourceKey, NSString **outExceptionString)
{
// All windows match by default.
windowTypeFilter = WindowTypeFilter::All;
windowTypeFilter = OptionSet<WindowTypeFilter>::all();

static NSDictionary<NSString *, id> *types = @{
windowTypesKey: @[ NSString.class ],
Expand Down Expand Up @@ -584,20 +584,20 @@ bool isValid(std::optional<WebExtensionWindowIdentifier> identifier, NSString **
return *m_onFocusChanged;
}

inline WebExtensionAPIWindows::WindowTypeFilter toWindowTypeFilter(WebExtensionWindow::Type type)
inline OptionSet<WebExtensionWindowTypeFilter> toWindowTypeFilter(WebExtensionWindow::Type type)
{
switch (type) {
case WebExtensionWindow::Type::Normal:
return WebExtensionAPIWindows::WindowTypeFilter::Normal;
return WebExtensionWindowTypeFilter::Normal;

case WebExtensionWindow::Type::Popup:
return WebExtensionAPIWindows::WindowTypeFilter::Popup;
return WebExtensionWindowTypeFilter::Popup;
}
}

void WebExtensionContextProxy::dispatchWindowsEvent(WebExtensionEventListenerType type, const std::optional<WebExtensionWindowParameters>& windowParameters)
{
auto filter = windowParameters ? toWindowTypeFilter(windowParameters.value().type.value()) : WebExtensionAPIWindows::WindowTypeFilter::All;
auto filter = windowParameters ? toWindowTypeFilter(windowParameters.value().type.value()) : OptionSet<WebExtensionWindowTypeFilter>::all();

enumerateNamespaceObjects([&](auto& namespaceObject) {
auto& windowsObject = namespaceObject.windows();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,13 @@

namespace WebKit {

void WebExtensionAPIWindowsEvent::invokeListenersWithArgument(id argument, WindowTypeFilter windowType)
void WebExtensionAPIWindowsEvent::invokeListenersWithArgument(id argument, OptionSet<WindowTypeFilter> windowTypeFilter)
{
if (m_listeners.isEmpty())
return;

for (auto& listener : m_listeners) {
if (!listener.second.contains(windowType))
if (!listener.second.containsAny(windowTypeFilter))
continue;

listener.first->call(argument);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class WebExtensionAPIWindowsEvent : public WebExtensionAPIObject, public JSWebEx
using FilterAndCallbackPair = std::pair<RefPtr<WebExtensionCallbackHandler>, OptionSet<WindowTypeFilter>>;
using ListenerVector = Vector<FilterAndCallbackPair>;

void invokeListenersWithArgument(id argument, WindowTypeFilter);
void invokeListenersWithArgument(id argument, OptionSet<WindowTypeFilter>);

const ListenerVector& listeners() const { return m_listeners; }

Expand Down

0 comments on commit 5effaab

Please sign in to comment.