1/*
2 * Copyright (C) 2015 Igalia S.L.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#pragma once
27
28#include "WebContextMenuItemData.h"
29#include <wtf/glib/GRefPtr.h>
30#include <wtf/glib/GUniquePtr.h>
31
32typedef struct _GtkAction GtkAction;
33typedef struct _GAction GAction;
34
35namespace WebKit {
36
37class WebContextMenuItemGlib final : public WebContextMenuItemData {
38 WTF_MAKE_FAST_ALLOCATED;
39public:
40 WebContextMenuItemGlib(WebCore::ContextMenuItemType, WebCore::ContextMenuAction, const String& title, bool enabled = true, bool checked = false);
41 WebContextMenuItemGlib(const WebContextMenuItemData&);
42 WebContextMenuItemGlib(const WebContextMenuItemGlib&, Vector<WebContextMenuItemGlib>&& submenu);
43 WebContextMenuItemGlib(GAction*, const String& title, GVariant* target = nullptr);
44#if PLATFORM(GTK)
45 WebContextMenuItemGlib(GtkAction*);
46#endif
47 ~WebContextMenuItemGlib();
48
49 // We don't use the SubmenuType internally, so check if we have submenu items.
50 WebCore::ContextMenuItemType type() const { return m_submenuItems.isEmpty() ? WebContextMenuItemData::type() : WebCore::SubmenuType; }
51 GAction* gAction() const { return m_gAction.get(); }
52 GVariant* gActionTarget() const { return m_gActionTarget.get(); }
53 const Vector<WebContextMenuItemGlib>& submenuItems() const { return m_submenuItems; }
54
55#if PLATFORM(GTK)
56 GtkAction* gtkAction() const { return m_gtkAction; }
57#endif
58
59private:
60 GUniquePtr<char> buildActionName() const;
61 void createActionIfNeeded();
62
63 GRefPtr<GAction> m_gAction;
64 GRefPtr<GVariant> m_gActionTarget;
65 Vector<WebContextMenuItemGlib> m_submenuItems;
66#if PLATFORM(GTK)
67 GtkAction* m_gtkAction { nullptr };
68#endif
69};
70
71} // namespace WebKit
72