accessible/src/atk/nsMaiInterfaceEditableText.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 "InterfaceInitFuncs.h"
     9 #include "Accessible-inl.h"
    10 #include "HyperTextAccessible-inl.h"
    11 #include "nsMai.h"
    13 #include "nsString.h"
    14 #include "mozilla/Likely.h"
    16 using namespace mozilla::a11y;
    18 extern "C" {
    19 static void
    20 setTextContentsCB(AtkEditableText *aText, const gchar *aString)
    21 {
    22   AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aText));
    23   if (!accWrap)
    24     return;
    26   HyperTextAccessible* text = accWrap->AsHyperText();
    27   if (!text || !text->IsTextRole())
    28     return;
    30   NS_ConvertUTF8toUTF16 strContent(aString);
    31   text->ReplaceText(strContent);
    32 }
    34 static void
    35 insertTextCB(AtkEditableText *aText,
    36              const gchar *aString, gint aLength, gint *aPosition)
    37 {
    38   AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aText));
    39   if (!accWrap)
    40     return;
    42   HyperTextAccessible* text = accWrap->AsHyperText();
    43   if (!text || !text->IsTextRole())
    44     return;
    46   NS_ConvertUTF8toUTF16 strContent(aString, aLength);
    47   text->InsertText(strContent, *aPosition);
    48 }
    50 static void
    51 copyTextCB(AtkEditableText *aText, gint aStartPos, gint aEndPos)
    52 {
    53   AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aText));
    54   if (!accWrap)
    55     return;
    57   HyperTextAccessible* text = accWrap->AsHyperText();
    58   if (!text || !text->IsTextRole())
    59     return;
    61   text->CopyText(aStartPos, aEndPos);
    62 }
    64 static void
    65 cutTextCB(AtkEditableText *aText, gint aStartPos, gint aEndPos)
    66 {
    67   AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aText));
    68   if (!accWrap)
    69     return;
    71   HyperTextAccessible* text = accWrap->AsHyperText();
    72   if (!text || !text->IsTextRole())
    73     return;
    75   text->CutText(aStartPos, aEndPos);
    76 }
    78 static void
    79 deleteTextCB(AtkEditableText *aText, gint aStartPos, gint aEndPos)
    80 {
    81   AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aText));
    82   if (!accWrap)
    83     return;
    85   HyperTextAccessible* text = accWrap->AsHyperText();
    86   if (!text || !text->IsTextRole())
    87     return;
    89   text->DeleteText(aStartPos, aEndPos);
    90 }
    92 static void
    93 pasteTextCB(AtkEditableText *aText, gint aPosition)
    94 {
    95   AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aText));
    96   if (!accWrap)
    97     return;
    99   HyperTextAccessible* text = accWrap->AsHyperText();
   100   if (!text || !text->IsTextRole())
   101     return;
   103   text->PasteText(aPosition);
   104 }
   105 }
   107 void
   108 editableTextInterfaceInitCB(AtkEditableTextIface* aIface)
   109 {
   110   NS_ASSERTION(aIface, "Invalid aIface");
   111   if (MOZ_UNLIKELY(!aIface))
   112     return;
   114   aIface->set_text_contents = setTextContentsCB;
   115   aIface->insert_text = insertTextCB;
   116   aIface->copy_text = copyTextCB;
   117   aIface->cut_text = cutTextCB;
   118   aIface->delete_text = deleteTextCB;
   119   aIface->paste_text = pasteTextCB;
   120 }

mercurial