accessible/src/atk/AtkSocketAccessible.cpp

branch
TOR_BUG_9701
changeset 8
97036ab72558
equal deleted inserted replaced
-1:000000000000 0:fb5451a82126
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7 #include <atk/atk.h>
8 #include "AtkSocketAccessible.h"
9
10 #include "InterfaceInitFuncs.h"
11 #include "nsMai.h"
12 #include "mozilla/Likely.h"
13
14 using namespace mozilla::a11y;
15
16 AtkSocketEmbedType AtkSocketAccessible::g_atk_socket_embed = nullptr;
17 GType AtkSocketAccessible::g_atk_socket_type = G_TYPE_INVALID;
18 const char* AtkSocketAccessible::sATKSocketEmbedSymbol = "atk_socket_embed";
19 const char* AtkSocketAccessible::sATKSocketGetTypeSymbol = "atk_socket_get_type";
20
21 bool AtkSocketAccessible::gCanEmbed = FALSE;
22
23 extern "C" void mai_atk_component_iface_init(AtkComponentIface* aIface);
24 extern "C" GType mai_atk_socket_get_type(void);
25
26 /* MaiAtkSocket */
27
28 #define MAI_TYPE_ATK_SOCKET (mai_atk_socket_get_type ())
29 #define MAI_ATK_SOCKET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),\
30 MAI_TYPE_ATK_SOCKET, MaiAtkSocket))
31 #define MAI_IS_ATK_SOCKET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),\
32 MAI_TYPE_ATK_SOCKET))
33 #define MAI_ATK_SOCKET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),\
34 MAI_TYPE_ATK_SOCKET,\
35 MaiAtkSocketClass))
36 #define MAI_IS_ATK_SOCKET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),\
37 MAI_TYPE_ATK_SOCKET))
38 #define MAI_ATK_SOCKET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),\
39 MAI_TYPE_ATK_SOCKET,\
40 MaiAtkSocketClass))
41
42 typedef struct _MaiAtkSocket
43 {
44 AtkSocket parent;
45
46 AccessibleWrap* accWrap;
47 } MaiAtkSocket;
48
49 typedef struct _MaiAtkSocketClass
50 {
51 AtkSocketClass parent_class;
52 } MaiAtkSocketClass;
53
54 G_DEFINE_TYPE_EXTENDED(MaiAtkSocket, mai_atk_socket,
55 AtkSocketAccessible::g_atk_socket_type, 0,
56 G_IMPLEMENT_INTERFACE(ATK_TYPE_COMPONENT,
57 mai_atk_component_iface_init))
58
59 void
60 mai_atk_socket_class_init(MaiAtkSocketClass* aAcc)
61 {
62 }
63
64 void
65 mai_atk_socket_init(MaiAtkSocket* aAcc)
66 {
67 }
68
69 static AtkObject*
70 mai_atk_socket_new(AccessibleWrap* aAccWrap)
71 {
72 NS_ENSURE_TRUE(aAccWrap, nullptr);
73
74 MaiAtkSocket* acc = nullptr;
75 acc = static_cast<MaiAtkSocket*>(g_object_new(MAI_TYPE_ATK_SOCKET, nullptr));
76 NS_ENSURE_TRUE(acc, nullptr);
77
78 acc->accWrap = aAccWrap;
79 return ATK_OBJECT(acc);
80 }
81
82 extern "C" {
83 static AtkObject*
84 RefAccessibleAtPoint(AtkComponent* aComponent, gint aX, gint aY,
85 AtkCoordType aCoordType)
86 {
87 NS_ENSURE_TRUE(MAI_IS_ATK_SOCKET(aComponent), nullptr);
88
89 return refAccessibleAtPointHelper(MAI_ATK_SOCKET(aComponent)->accWrap,
90 aX, aY, aCoordType);
91 }
92
93 static void
94 GetExtents(AtkComponent* aComponent, gint* aX, gint* aY, gint* aWidth,
95 gint* aHeight, AtkCoordType aCoordType)
96 {
97 *aX = *aY = *aWidth = *aHeight = 0;
98
99 if (!MAI_IS_ATK_SOCKET(aComponent))
100 return;
101
102 getExtentsHelper(MAI_ATK_SOCKET(aComponent)->accWrap,
103 aX, aY, aWidth, aHeight, aCoordType);
104 }
105 }
106
107 void
108 mai_atk_component_iface_init(AtkComponentIface* aIface)
109 {
110 NS_ASSERTION(aIface, "Invalid Interface");
111 if (MOZ_UNLIKELY(!aIface))
112 return;
113
114 aIface->ref_accessible_at_point = RefAccessibleAtPoint;
115 aIface->get_extents = GetExtents;
116 }
117
118 AtkSocketAccessible::AtkSocketAccessible(nsIContent* aContent,
119 DocAccessible* aDoc,
120 const nsCString& aPlugId) :
121 AccessibleWrap(aContent, aDoc)
122 {
123 mAtkObject = mai_atk_socket_new(this);
124 if (!mAtkObject)
125 return;
126
127 // Embeds the children of an AtkPlug, specified by plugId, as the children of
128 // this socket.
129 // Using G_TYPE macros instead of ATK_SOCKET macros to avoid undefined
130 // symbols.
131 if (gCanEmbed && G_TYPE_CHECK_INSTANCE_TYPE(mAtkObject, g_atk_socket_type) &&
132 !aPlugId.IsVoid()) {
133 AtkSocket* accSocket =
134 G_TYPE_CHECK_INSTANCE_CAST(mAtkObject, g_atk_socket_type, AtkSocket);
135 g_atk_socket_embed(accSocket, (gchar*)aPlugId.get());
136 }
137 }
138
139 NS_IMETHODIMP
140 AtkSocketAccessible::GetNativeInterface(void** aOutAccessible)
141 {
142 *aOutAccessible = mAtkObject;
143 return NS_OK;
144 }
145
146 void
147 AtkSocketAccessible::Shutdown()
148 {
149 if (mAtkObject) {
150 if (MAI_IS_ATK_SOCKET(mAtkObject))
151 MAI_ATK_SOCKET(mAtkObject)->accWrap = nullptr;
152 g_object_unref(mAtkObject);
153 mAtkObject = nullptr;
154 }
155 AccessibleWrap::Shutdown();
156 }

mercurial