intl/lwbrk/src/nsPangoBreaker.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 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #include "nsComplexBreaker.h"
     8 #include <pango/pango-break.h>
     9 #include "nsUTF8Utils.h"
    10 #include "nsString.h"
    11 #include "nsTArray.h"
    13 void
    14 NS_GetComplexLineBreaks(const char16_t* aText, uint32_t aLength,
    15                         uint8_t* aBreakBefore)
    16 {
    17   NS_ASSERTION(aText, "aText shouldn't be null");
    19   memset(aBreakBefore, false, aLength * sizeof(uint8_t));
    21   nsAutoTArray<PangoLogAttr, 2000> attrBuffer;
    22   if (!attrBuffer.AppendElements(aLength + 1))
    23     return;
    25   NS_ConvertUTF16toUTF8 aUTF8(aText, aLength);
    27   const gchar* p = aUTF8.Data();
    28   const gchar* end = p + aUTF8.Length();
    29   uint32_t     u16Offset = 0;
    31   static PangoLanguage* language = pango_language_from_string("en");
    33   while (p < end)
    34   {
    35     PangoLogAttr* attr = attrBuffer.Elements();
    36     pango_get_log_attrs(p, end - p, -1, language, attr, attrBuffer.Length());
    38     while (p < end)
    39     {
    40       aBreakBefore[u16Offset] = attr->is_line_break;
    41       if (NS_IS_LOW_SURROGATE(aText[u16Offset]))
    42         aBreakBefore[++u16Offset] = false; // Skip high surrogate
    43       ++u16Offset;
    45       bool err;
    46       uint32_t ch = UTF8CharEnumerator::NextChar(&p, end, &err);
    47       ++attr;
    49       if (ch == 0 || err) {
    50         // pango_break (pango 1.16.2) only analyses text before the
    51         // first NUL (but sets one extra attr). Workaround loop to call
    52         // pango_break again to analyse after the NUL is done somewhere else
    53         // (gfx/thebes/gfxPangoFonts.cpp: SetupClusterBoundaries()).
    54         // So, we do the same here for pango_get_log_attrs.
    55         break;
    56       }
    57     }
    58   }
    59 }

mercurial