accessible/src/atk/AtkSocketAccessible.cpp

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

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 }

mercurial