Skip to content

Commit

Permalink
Port WebContextMenuItemData to the new IPC serialization format
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=264757

Reviewed by Alex Christensen.

* Source/WebKit/CMakeLists.txt:
* Source/WebKit/DerivedSources-input.xcfilelist:
* Source/WebKit/DerivedSources.make:
* Source/WebKit/Shared/WebContextMenuItem.cpp:
(WebKit::WebContextMenuItem::create):
* Source/WebKit/Shared/WebContextMenuItemData.cpp:
(WebKit::WebContextMenuItemData::WebContextMenuItemData):
(WebKit::WebContextMenuItemData::setUserData):
(WebKit::WebContextMenuItemData::encode const): Deleted.
(WebKit::WebContextMenuItemData::decode): Deleted.
* Source/WebKit/Shared/WebContextMenuItemData.h:
(WebKit::WebContextMenuItemData::WebContextMenuItemData):
* Source/WebKit/Shared/WebContextMenuItemData.serialization.in: Added.
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:

Canonical link: https://commits.webkit.org/270690@main
  • Loading branch information
cdumez committed Nov 14, 2023
1 parent 0e86eeb commit f965af6
Show file tree
Hide file tree
Showing 11 changed files with 56 additions and 88 deletions.
1 change: 1 addition & 0 deletions Source/WebKit/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,7 @@ set(WebKit_SERIALIZATION_IN_FILES
Shared/VisibleContentRectUpdateInfo.serialization.in
Shared/WTFArgumentCoders.serialization.in
Shared/WebBackForwardListCounts.serialization.in
Shared/WebContextMenuItemData.serialization.in
Shared/WebCoreArgumentCoders.serialization.in
Shared/WebCompiledContentRuleListData.serialization.in
Shared/WebEvent.serialization.in
Expand Down
1 change: 1 addition & 0 deletions Source/WebKit/DerivedSources-input.xcfilelist
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,7 @@ $(PROJECT_DIR)/Shared/WTFArgumentCoders.serialization.in
$(PROJECT_DIR)/Shared/WebBackForwardListCounts.serialization.in
$(PROJECT_DIR)/Shared/WebCompiledContentRuleListData.serialization.in
$(PROJECT_DIR)/Shared/WebConnection.messages.in
$(PROJECT_DIR)/Shared/WebContextMenuItemData.serialization.in
$(PROJECT_DIR)/Shared/WebCoreArgumentCoders.serialization.in
$(PROJECT_DIR)/Shared/WebEvent.serialization.in
$(PROJECT_DIR)/Shared/WebExtensionContextParameters.serialization.in
Expand Down
1 change: 1 addition & 0 deletions Source/WebKit/DerivedSources.make
Original file line number Diff line number Diff line change
Expand Up @@ -618,6 +618,7 @@ SERIALIZATION_DESCRIPTION_FILES = \
Shared/VisibleContentRectUpdateInfo.serialization.in \
Shared/WTFArgumentCoders.serialization.in \
Shared/WebBackForwardListCounts.serialization.in \
Shared/WebContextMenuItemData.serialization.in \
Shared/WebCoreArgumentCoders.serialization.in \
Shared/WebEvent.serialization.in \
Shared/WebFoundTextRange.serialization.in \
Expand Down
6 changes: 4 additions & 2 deletions Source/WebKit/Shared/API/glib/WebKitContextMenuItem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,12 @@ WebContextMenuItemData webkitContextMenuItemToWebContextMenuItemData(WebKitConte
if (item->priv->subMenu) {
Vector<WebContextMenuItemData> subMenuItems;
webkitContextMenuPopulate(item->priv->subMenu.get(), subMenuItems);
return WebContextMenuItemData(item->priv->menuItem->action(), item->priv->menuItem->title(), item->priv->menuItem->enabled(), subMenuItems);
bool checked = false;
unsigned indentationLevel = 0;
return WebContextMenuItemData(WebCore::SubmenuType, item->priv->menuItem->action(), String { item->priv->menuItem->title() }, item->priv->menuItem->enabled(), checked, indentationLevel, WTFMove(subMenuItems));
}

return WebContextMenuItemData(item->priv->menuItem->type(), item->priv->menuItem->action(), item->priv->menuItem->title(), item->priv->menuItem->enabled(), item->priv->menuItem->checked());
return WebContextMenuItemData(item->priv->menuItem->type(), item->priv->menuItem->action(), String { item->priv->menuItem->title() }, item->priv->menuItem->enabled(), item->priv->menuItem->checked());
}
#endif // ENABLE(CONTEXT_MENUS)

Expand Down
4 changes: 3 additions & 1 deletion Source/WebKit/Shared/WebContextMenuItem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,9 @@ Ref<WebContextMenuItem> WebContextMenuItem::create(const String& title, bool ena
}
submenu.shrinkToFit();

return adoptRef(*new WebContextMenuItem(WebContextMenuItemData(WebCore::ContextMenuItemTagNoAction, title, enabled, submenu))).leakRef();
bool checked = false;
unsigned indentationLevel = 0;
return adoptRef(*new WebContextMenuItem(WebContextMenuItemData(WebCore::SubmenuType, WebCore::ContextMenuItemTagNoAction, String { title }, enabled, checked, indentationLevel, WTFMove(submenu)))).leakRef();
}

WebContextMenuItem* WebContextMenuItem::separatorItem()
Expand Down
73 changes: 3 additions & 70 deletions Source/WebKit/Shared/WebContextMenuItemData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,25 +46,14 @@ WebContextMenuItemData::WebContextMenuItemData()
{
}

WebContextMenuItemData::WebContextMenuItemData(WebCore::ContextMenuItemType type, WebCore::ContextMenuAction action, const String& title, bool enabled, bool checked, unsigned indentationLevel)
WebContextMenuItemData::WebContextMenuItemData(WebCore::ContextMenuItemType type, WebCore::ContextMenuAction action, String&& title, bool enabled, bool checked, unsigned indentationLevel, Vector<WebContextMenuItemData>&& submenu)
: m_type(type)
, m_action(action)
, m_title(title)
, m_title(WTFMove(title))
, m_enabled(enabled)
, m_checked(checked)
, m_indentationLevel(indentationLevel)
{
ASSERT(type == WebCore::ActionType || type == WebCore::CheckableActionType || type == WebCore::SeparatorType);
}

WebContextMenuItemData::WebContextMenuItemData(WebCore::ContextMenuAction action, const String& title, bool enabled, const Vector<WebContextMenuItemData>& submenu, unsigned indentationLevel)
: m_type(WebCore::SubmenuType)
, m_action(action)
, m_title(title)
, m_enabled(enabled)
, m_checked(false)
, m_indentationLevel(indentationLevel)
, m_submenu(submenu)
, m_submenu(WTFMove(submenu))
{
}

Expand Down Expand Up @@ -101,62 +90,6 @@ void WebContextMenuItemData::setUserData(API::Object* userData)
{
m_userData = userData;
}

void WebContextMenuItemData::encode(IPC::Encoder& encoder) const
{
encoder << m_type;
encoder << m_action;
encoder << m_title;
encoder << m_checked;
encoder << m_enabled;
encoder << m_indentationLevel;
encoder << m_submenu;
}

std::optional<WebContextMenuItemData> WebContextMenuItemData::decode(IPC::Decoder& decoder)
{
WebCore::ContextMenuItemType type;
if (!decoder.decode(type))
return std::nullopt;

WebCore::ContextMenuAction action;
if (!decoder.decode(action))
return std::nullopt;

String title;
if (!decoder.decode(title))
return std::nullopt;

bool checked;
if (!decoder.decode(checked))
return std::nullopt;

bool enabled;
if (!decoder.decode(enabled))
return std::nullopt;

unsigned indentationLevel;
if (!decoder.decode(indentationLevel))
return std::nullopt;

std::optional<Vector<WebContextMenuItemData>> submenu;
decoder >> submenu;
if (!submenu)
return std::nullopt;

switch (type) {
case WebCore::ActionType:
case WebCore::SeparatorType:
case WebCore::CheckableActionType:
return {{ type, action, title, enabled, checked, indentationLevel }};
break;
case WebCore::SubmenuType:
return {{ action, title, enabled, WTFMove(*submenu), indentationLevel }};
break;
}
ASSERT_NOT_REACHED();
return std::nullopt;
}

Vector<WebContextMenuItemData> kitItems(const Vector<WebCore::ContextMenuItem>& coreItemVector)
{
Expand Down
11 changes: 1 addition & 10 deletions Source/WebKit/Shared/WebContextMenuItemData.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,19 +34,13 @@ namespace API {
class Object;
}

namespace IPC {
class Decoder;
class Encoder;
}

namespace WebKit {

class WebContextMenuItemData {
public:
WebContextMenuItemData();
WebContextMenuItemData(const WebCore::ContextMenuItem&);
WebContextMenuItemData(WebCore::ContextMenuItemType, WebCore::ContextMenuAction, const String& title, bool enabled, bool checked, unsigned indentationLevel = 0);
WebContextMenuItemData(WebCore::ContextMenuAction, const String& title, bool enabled, const Vector<WebContextMenuItemData>& submenu, unsigned indentationLevel = 0);
WebContextMenuItemData(WebCore::ContextMenuItemType, WebCore::ContextMenuAction, String&& title, bool enabled, bool checked, unsigned indentationLevel = 0, Vector<WebContextMenuItemData>&& submenu = { });

WebCore::ContextMenuItemType type() const { return m_type; }
WebCore::ContextMenuAction action() const { return m_action; }
Expand All @@ -60,9 +54,6 @@ class WebContextMenuItemData {

API::Object* userData() const;
void setUserData(API::Object*);

void encode(IPC::Encoder&) const;
static std::optional<WebContextMenuItemData> decode(IPC::Decoder&);

private:
WebCore::ContextMenuItemType m_type;
Expand Down
35 changes: 35 additions & 0 deletions Source/WebKit/Shared/WebContextMenuItemData.serialization.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Copyright (C) 2023 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#if ENABLE(CONTEXT_MENUS)

class WebKit::WebContextMenuItemData {
WebCore::ContextMenuItemType type();
WebCore::ContextMenuAction action();
String title();
bool enabled();
bool checked();
unsigned indentationLevel();
Vector<WebKit::WebContextMenuItemData> submenu();
};

#endif // ENABLE(CONTEXT_MENUS)
8 changes: 4 additions & 4 deletions Source/WebKit/Shared/glib/WebContextMenuItemGlib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,20 +38,20 @@ namespace WebKit {
using namespace WebCore;

WebContextMenuItemGlib::WebContextMenuItemGlib(ContextMenuItemType type, ContextMenuAction action, const String& title, bool enabled, bool checked)
: WebContextMenuItemData(type, action, title, enabled, checked)
: WebContextMenuItemData(type, action, String { title }, enabled, checked)
{
ASSERT(type != SubmenuType);
createActionIfNeeded();
}

WebContextMenuItemGlib::WebContextMenuItemGlib(const WebContextMenuItemData& data)
: WebContextMenuItemData(data.type() == SubmenuType ? ActionType : data.type(), data.action(), data.title(), data.enabled(), data.checked())
: WebContextMenuItemData(data.type() == SubmenuType ? ActionType : data.type(), data.action(), String { data.title() }, data.enabled(), data.checked())
{
createActionIfNeeded();
}

WebContextMenuItemGlib::WebContextMenuItemGlib(const WebContextMenuItemGlib& data, Vector<WebContextMenuItemGlib>&& submenu)
: WebContextMenuItemData(ActionType, data.action(), data.title(), data.enabled(), false)
: WebContextMenuItemData(ActionType, data.action(), String { data.title() }, data.enabled(), false)
{
m_gAction = data.gAction();
m_submenuItems = WTFMove(submenu);
Expand All @@ -71,7 +71,7 @@ static bool isGActionChecked(GAction* action)
}

WebContextMenuItemGlib::WebContextMenuItemGlib(GAction* action, const String& title, GVariant* target)
: WebContextMenuItemData(g_action_get_state_type(action) ? CheckableActionType : ActionType, ContextMenuItemBaseApplicationTag, title, g_action_get_enabled(action), isGActionChecked(action))
: WebContextMenuItemData(g_action_get_state_type(action) ? CheckableActionType : ActionType, ContextMenuItemBaseApplicationTag, String { title }, g_action_get_enabled(action), isGActionChecked(action))
, m_gAction(action)
, m_gActionTarget(target)
{
Expand Down
2 changes: 1 addition & 1 deletion Source/WebKit/UIProcess/win/WebView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -641,7 +641,7 @@ LRESULT WebView::onMenuCommand(HWND hWnd, UINT message, WPARAM wParam, LPARAM lP
ContextMenuAction action = static_cast<ContextMenuAction>(menuItemInfo.wID);
bool enabled = !(menuItemInfo.fState & MFS_DISABLED);
bool checked = menuItemInfo.fState & MFS_CHECKED;
WebContextMenuItemData item(ContextMenuItemType::ActionType, action, title, enabled, checked);
WebContextMenuItemData item(ContextMenuItemType::ActionType, action, WTFMove(title), enabled, checked);
m_page->contextMenuItemSelected(item);

handled = true;
Expand Down
2 changes: 2 additions & 0 deletions Source/WebKit/WebKit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -5011,6 +5011,7 @@
46EE3E8A2763FD2A0060C70F /* WebSharedWorkerServerConnection.messages.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = WebSharedWorkerServerConnection.messages.in; sourceTree = "<group>"; };
46F38E8B2416E66D0059375A /* RunningBoardServicesSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RunningBoardServicesSPI.h; sourceTree = "<group>"; };
46F5DD862AFD7DF100F3B26F /* GPUProcessPreferences.serialization.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = GPUProcessPreferences.serialization.in; sourceTree = "<group>"; };
46F96C662B02A58100253A2B /* WebContextMenuItemData.serialization.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = WebContextMenuItemData.serialization.in; sourceTree = "<group>"; };
46F9B26223526ED0006FE5FA /* WebBackForwardCacheEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebBackForwardCacheEntry.h; sourceTree = "<group>"; };
46FA2E752A04240300912BFE /* RemoteWorkerType.serialization.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = RemoteWorkerType.serialization.in; sourceTree = "<group>"; };
493102BC2683F3A5002BB885 /* AppPrivacyReport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppPrivacyReport.h; sourceTree = "<group>"; };
Expand Down Expand Up @@ -8523,6 +8524,7 @@
512935D61288D19400A4B695 /* WebContextMenuItem.h */,
510FBB981288C95E00AFFDF4 /* WebContextMenuItemData.cpp */,
510FBB991288C95E00AFFDF4 /* WebContextMenuItemData.h */,
46F96C662B02A58100253A2B /* WebContextMenuItemData.serialization.in */,
939AE7651316E99C00AE06A6 /* WebCoreArgumentCoders.cpp */,
BC1DD7B1114DC396005ADAF3 /* WebCoreArgumentCoders.h */,
5C426B5A28BEC8D200C695CF /* WebCoreArgumentCoders.serialization.in */,
Expand Down

0 comments on commit f965af6

Please sign in to comment.