1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/accessible/src/atk/AtkSocketAccessible.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,156 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* vim: set ts=2 et sw=2 tw=80: */ 1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +#include <atk/atk.h> 1.11 +#include "AtkSocketAccessible.h" 1.12 + 1.13 +#include "InterfaceInitFuncs.h" 1.14 +#include "nsMai.h" 1.15 +#include "mozilla/Likely.h" 1.16 + 1.17 +using namespace mozilla::a11y; 1.18 + 1.19 +AtkSocketEmbedType AtkSocketAccessible::g_atk_socket_embed = nullptr; 1.20 +GType AtkSocketAccessible::g_atk_socket_type = G_TYPE_INVALID; 1.21 +const char* AtkSocketAccessible::sATKSocketEmbedSymbol = "atk_socket_embed"; 1.22 +const char* AtkSocketAccessible::sATKSocketGetTypeSymbol = "atk_socket_get_type"; 1.23 + 1.24 +bool AtkSocketAccessible::gCanEmbed = FALSE; 1.25 + 1.26 +extern "C" void mai_atk_component_iface_init(AtkComponentIface* aIface); 1.27 +extern "C" GType mai_atk_socket_get_type(void); 1.28 + 1.29 +/* MaiAtkSocket */ 1.30 + 1.31 +#define MAI_TYPE_ATK_SOCKET (mai_atk_socket_get_type ()) 1.32 +#define MAI_ATK_SOCKET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),\ 1.33 + MAI_TYPE_ATK_SOCKET, MaiAtkSocket)) 1.34 +#define MAI_IS_ATK_SOCKET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),\ 1.35 + MAI_TYPE_ATK_SOCKET)) 1.36 +#define MAI_ATK_SOCKET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),\ 1.37 + MAI_TYPE_ATK_SOCKET,\ 1.38 + MaiAtkSocketClass)) 1.39 +#define MAI_IS_ATK_SOCKET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),\ 1.40 + MAI_TYPE_ATK_SOCKET)) 1.41 +#define MAI_ATK_SOCKET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),\ 1.42 + MAI_TYPE_ATK_SOCKET,\ 1.43 + MaiAtkSocketClass)) 1.44 + 1.45 +typedef struct _MaiAtkSocket 1.46 +{ 1.47 + AtkSocket parent; 1.48 + 1.49 + AccessibleWrap* accWrap; 1.50 +} MaiAtkSocket; 1.51 + 1.52 +typedef struct _MaiAtkSocketClass 1.53 +{ 1.54 + AtkSocketClass parent_class; 1.55 +} MaiAtkSocketClass; 1.56 + 1.57 +G_DEFINE_TYPE_EXTENDED(MaiAtkSocket, mai_atk_socket, 1.58 + AtkSocketAccessible::g_atk_socket_type, 0, 1.59 + G_IMPLEMENT_INTERFACE(ATK_TYPE_COMPONENT, 1.60 + mai_atk_component_iface_init)) 1.61 + 1.62 +void 1.63 +mai_atk_socket_class_init(MaiAtkSocketClass* aAcc) 1.64 +{ 1.65 +} 1.66 + 1.67 +void 1.68 +mai_atk_socket_init(MaiAtkSocket* aAcc) 1.69 +{ 1.70 +} 1.71 + 1.72 +static AtkObject* 1.73 +mai_atk_socket_new(AccessibleWrap* aAccWrap) 1.74 +{ 1.75 + NS_ENSURE_TRUE(aAccWrap, nullptr); 1.76 + 1.77 + MaiAtkSocket* acc = nullptr; 1.78 + acc = static_cast<MaiAtkSocket*>(g_object_new(MAI_TYPE_ATK_SOCKET, nullptr)); 1.79 + NS_ENSURE_TRUE(acc, nullptr); 1.80 + 1.81 + acc->accWrap = aAccWrap; 1.82 + return ATK_OBJECT(acc); 1.83 +} 1.84 + 1.85 +extern "C" { 1.86 +static AtkObject* 1.87 +RefAccessibleAtPoint(AtkComponent* aComponent, gint aX, gint aY, 1.88 + AtkCoordType aCoordType) 1.89 +{ 1.90 + NS_ENSURE_TRUE(MAI_IS_ATK_SOCKET(aComponent), nullptr); 1.91 + 1.92 + return refAccessibleAtPointHelper(MAI_ATK_SOCKET(aComponent)->accWrap, 1.93 + aX, aY, aCoordType); 1.94 +} 1.95 + 1.96 +static void 1.97 +GetExtents(AtkComponent* aComponent, gint* aX, gint* aY, gint* aWidth, 1.98 + gint* aHeight, AtkCoordType aCoordType) 1.99 +{ 1.100 + *aX = *aY = *aWidth = *aHeight = 0; 1.101 + 1.102 + if (!MAI_IS_ATK_SOCKET(aComponent)) 1.103 + return; 1.104 + 1.105 + getExtentsHelper(MAI_ATK_SOCKET(aComponent)->accWrap, 1.106 + aX, aY, aWidth, aHeight, aCoordType); 1.107 +} 1.108 +} 1.109 + 1.110 +void 1.111 +mai_atk_component_iface_init(AtkComponentIface* aIface) 1.112 +{ 1.113 + NS_ASSERTION(aIface, "Invalid Interface"); 1.114 + if (MOZ_UNLIKELY(!aIface)) 1.115 + return; 1.116 + 1.117 + aIface->ref_accessible_at_point = RefAccessibleAtPoint; 1.118 + aIface->get_extents = GetExtents; 1.119 +} 1.120 + 1.121 +AtkSocketAccessible::AtkSocketAccessible(nsIContent* aContent, 1.122 + DocAccessible* aDoc, 1.123 + const nsCString& aPlugId) : 1.124 + AccessibleWrap(aContent, aDoc) 1.125 +{ 1.126 + mAtkObject = mai_atk_socket_new(this); 1.127 + if (!mAtkObject) 1.128 + return; 1.129 + 1.130 + // Embeds the children of an AtkPlug, specified by plugId, as the children of 1.131 + // this socket. 1.132 + // Using G_TYPE macros instead of ATK_SOCKET macros to avoid undefined 1.133 + // symbols. 1.134 + if (gCanEmbed && G_TYPE_CHECK_INSTANCE_TYPE(mAtkObject, g_atk_socket_type) && 1.135 + !aPlugId.IsVoid()) { 1.136 + AtkSocket* accSocket = 1.137 + G_TYPE_CHECK_INSTANCE_CAST(mAtkObject, g_atk_socket_type, AtkSocket); 1.138 + g_atk_socket_embed(accSocket, (gchar*)aPlugId.get()); 1.139 + } 1.140 +} 1.141 + 1.142 +NS_IMETHODIMP 1.143 +AtkSocketAccessible::GetNativeInterface(void** aOutAccessible) 1.144 +{ 1.145 + *aOutAccessible = mAtkObject; 1.146 + return NS_OK; 1.147 +} 1.148 + 1.149 +void 1.150 +AtkSocketAccessible::Shutdown() 1.151 +{ 1.152 + if (mAtkObject) { 1.153 + if (MAI_IS_ATK_SOCKET(mAtkObject)) 1.154 + MAI_ATK_SOCKET(mAtkObject)->accWrap = nullptr; 1.155 + g_object_unref(mAtkObject); 1.156 + mAtkObject = nullptr; 1.157 + } 1.158 + AccessibleWrap::Shutdown(); 1.159 +}