Tue, 06 Jan 2015 21:39:09 +0100
Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.
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/. */
7 #include <atk/atk.h>
8 #include "AtkSocketAccessible.h"
10 #include "InterfaceInitFuncs.h"
11 #include "nsMai.h"
12 #include "mozilla/Likely.h"
14 using namespace mozilla::a11y;
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";
21 bool AtkSocketAccessible::gCanEmbed = FALSE;
23 extern "C" void mai_atk_component_iface_init(AtkComponentIface* aIface);
24 extern "C" GType mai_atk_socket_get_type(void);
26 /* MaiAtkSocket */
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))
42 typedef struct _MaiAtkSocket
43 {
44 AtkSocket parent;
46 AccessibleWrap* accWrap;
47 } MaiAtkSocket;
49 typedef struct _MaiAtkSocketClass
50 {
51 AtkSocketClass parent_class;
52 } MaiAtkSocketClass;
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))
59 void
60 mai_atk_socket_class_init(MaiAtkSocketClass* aAcc)
61 {
62 }
64 void
65 mai_atk_socket_init(MaiAtkSocket* aAcc)
66 {
67 }
69 static AtkObject*
70 mai_atk_socket_new(AccessibleWrap* aAccWrap)
71 {
72 NS_ENSURE_TRUE(aAccWrap, nullptr);
74 MaiAtkSocket* acc = nullptr;
75 acc = static_cast<MaiAtkSocket*>(g_object_new(MAI_TYPE_ATK_SOCKET, nullptr));
76 NS_ENSURE_TRUE(acc, nullptr);
78 acc->accWrap = aAccWrap;
79 return ATK_OBJECT(acc);
80 }
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);
89 return refAccessibleAtPointHelper(MAI_ATK_SOCKET(aComponent)->accWrap,
90 aX, aY, aCoordType);
91 }
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;
99 if (!MAI_IS_ATK_SOCKET(aComponent))
100 return;
102 getExtentsHelper(MAI_ATK_SOCKET(aComponent)->accWrap,
103 aX, aY, aWidth, aHeight, aCoordType);
104 }
105 }
107 void
108 mai_atk_component_iface_init(AtkComponentIface* aIface)
109 {
110 NS_ASSERTION(aIface, "Invalid Interface");
111 if (MOZ_UNLIKELY(!aIface))
112 return;
114 aIface->ref_accessible_at_point = RefAccessibleAtPoint;
115 aIface->get_extents = GetExtents;
116 }
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;
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 }
139 NS_IMETHODIMP
140 AtkSocketAccessible::GetNativeInterface(void** aOutAccessible)
141 {
142 *aOutAccessible = mAtkObject;
143 return NS_OK;
144 }
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 }