Commit ec908112 authored by Greg Tatum's avatar Greg Tatum
Browse files

Bug 1738057 - Split out BidiEmbeddingLevel into its own file; r=platform-i18n-reviewers,dminor

This should speed up re-compile times, as mozilla/intl/Bidi.h will only
be included in a few places.

Differential Revision: https://phabricator.services.mozilla.com/D129662
parent 72b78419
Loading
Loading
Loading
Loading
+13 −13
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@
 */

#include "mozilla/dom/Selection.h"
#include "mozilla/intl/Bidi.h"
#include "mozilla/intl/BidiEmbeddingLevel.h"

#include "mozilla/AccessibleCaretEventHub.h"
#include "mozilla/AsyncEventDispatcher.h"
@@ -386,8 +386,8 @@ Nullable<int16_t> Selection::GetCaretBidiLevel(
    aRv.Throw(NS_ERROR_NOT_INITIALIZED);
    return Nullable<int16_t>();
  }
  mozilla::intl::Bidi::EmbeddingLevel caretBidiLevel =
      static_cast<mozilla::intl::Bidi::EmbeddingLevel>(
  mozilla::intl::BidiEmbeddingLevel caretBidiLevel =
      static_cast<mozilla::intl::BidiEmbeddingLevel>(
          mFrameSelection->GetCaretBidiLevel());
  return (caretBidiLevel & BIDI_LEVEL_UNDEFINED)
             ? Nullable<int16_t>()
@@ -406,7 +406,7 @@ void Selection::SetCaretBidiLevel(const Nullable<int16_t>& aCaretBidiLevel,
    mFrameSelection->UndefineCaretBidiLevel();
  } else {
    mFrameSelection->SetCaretBidiLevelAndMaybeSchedulePaint(
        mozilla::intl::Bidi::EmbeddingLevel(aCaretBidiLevel.Value()));
        mozilla::intl::BidiEmbeddingLevel(aCaretBidiLevel.Value()));
  }
}

@@ -1360,7 +1360,7 @@ nsIFrame* Selection::GetPrimaryOrCaretFrameForNodeOffset(nsIContent* aContent,
  CaretAssociationHint hint = mFrameSelection->GetHint();

  if (aVisual) {
    mozilla::intl::Bidi::EmbeddingLevel caretBidiLevel =
    mozilla::intl::BidiEmbeddingLevel caretBidiLevel =
        mFrameSelection->GetCaretBidiLevel();

    return nsCaret::GetCaretFrameForNodeOffset(
@@ -3302,10 +3302,10 @@ void Selection::Modify(const nsAString& aAlter, const nsAString& aDirection,
  // If the paragraph direction of the focused frame is right-to-left,
  // we may have to swap the direction of movement.
  if (nsIFrame* frame = GetPrimaryFrameForFocusNode(visual)) {
    mozilla::intl::Bidi::Direction paraDir =
    mozilla::intl::BidiDirection paraDir =
        nsBidiPresUtils::ParagraphDirection(frame);

    if (paraDir == mozilla::intl::Bidi::Direction::RTL && visual) {
    if (paraDir == mozilla::intl::BidiDirection::RTL && visual) {
      if (amount == eSelectBeginLine) {
        amount = eSelectEndLine;
        forward = !forward;
@@ -3479,9 +3479,9 @@ nsresult Selection::SelectionLanguageChange(bool aLangRTL) {
  RefPtr<nsFrameSelection> frameSelection = mFrameSelection;

  // if the direction of the language hasn't changed, nothing to do
  mozilla::intl::Bidi::EmbeddingLevel kbdBidiLevel =
      aLangRTL ? mozilla::intl::Bidi::EmbeddingLevel::RTL()
               : mozilla::intl::Bidi::EmbeddingLevel::LTR();
  mozilla::intl::BidiEmbeddingLevel kbdBidiLevel =
      aLangRTL ? mozilla::intl::BidiEmbeddingLevel::RTL()
               : mozilla::intl::BidiEmbeddingLevel::LTR();
  if (kbdBidiLevel == frameSelection->mKbdBidiLevel) {
    return NS_OK;
  }
@@ -3495,12 +3495,12 @@ nsresult Selection::SelectionLanguageChange(bool aLangRTL) {

  auto [frameStart, frameEnd] = focusFrame->GetOffsets();
  RefPtr<nsPresContext> context = GetPresContext();
  mozilla::intl::Bidi::EmbeddingLevel levelBefore, levelAfter;
  mozilla::intl::BidiEmbeddingLevel levelBefore, levelAfter;
  if (!context) {
    return NS_ERROR_FAILURE;
  }

  mozilla::intl::Bidi::EmbeddingLevel level = focusFrame->GetEmbeddingLevel();
  mozilla::intl::BidiEmbeddingLevel level = focusFrame->GetEmbeddingLevel();
  int32_t focusOffset = static_cast<int32_t>(FocusOffset());
  if ((focusOffset != frameStart) && (focusOffset != frameEnd))
    // the cursor is not at a frame boundary, so the level of both the
@@ -3531,7 +3531,7 @@ nsresult Selection::SelectionLanguageChange(bool aLangRTL) {
      frameSelection->SetCaretBidiLevelAndMaybeSchedulePaint(level);
    } else {
      frameSelection->SetCaretBidiLevelAndMaybeSchedulePaint(
          mozilla::intl::Bidi::EmbeddingLevel(level + 1));
          mozilla::intl::BidiEmbeddingLevel(level + 1));
    }
  } else {
    // if cursor is between characters with opposite orientations, changing the
+7 −7
Original line number Diff line number Diff line
@@ -12,7 +12,7 @@

#include "nsContentUtils.h"

#include "mozilla/intl/Bidi.h"
#include "mozilla/intl/BidiEmbeddingLevel.h"
#include "mozilla/PresShell.h"
#include "mozilla/PresShellInlines.h"
#include "mozilla/SVGImageContext.h"
@@ -3523,11 +3523,11 @@ struct MOZ_STACK_CLASS CanvasBidiProcessor
  using ContextState = CanvasRenderingContext2D::ContextState;

  virtual void SetText(const char16_t* aText, int32_t aLength,
                       mozilla::intl::Bidi::Direction aDirection) override {
                       mozilla::intl::BidiDirection aDirection) override {
    mFontgrp->UpdateUserFonts();  // ensure user font generation is current
    // adjust flags for current direction run
    gfx::ShapedTextFlags flags = mTextRunFlags;
    if (aDirection == mozilla::intl::Bidi::Direction::RTL) {
    if (aDirection == mozilla::intl::BidiDirection::RTL) {
      flags |= gfx::ShapedTextFlags::TEXT_IS_RTL;
    } else {
      flags &= ~gfx::ShapedTextFlags::TEXT_IS_RTL;
@@ -3894,8 +3894,8 @@ TextMetrics* CanvasRenderingContext2D::DrawOrMeasureText(
  // bounding boxes before rendering anything
  aError = nsBidiPresUtils::ProcessText(
      textToDraw.get(), textToDraw.Length(),
      isRTL ? mozilla::intl::Bidi::EmbeddingLevel::RTL()
            : mozilla::intl::Bidi::EmbeddingLevel::LTR(),
      isRTL ? mozilla::intl::BidiEmbeddingLevel::RTL()
            : mozilla::intl::BidiEmbeddingLevel::LTR(),
      presShell->GetPresContext(), processor, nsBidiPresUtils::MODE_MEASURE,
      nullptr, 0, &totalWidthCoord, &mBidiEngine);
  if (aError.Failed()) {
@@ -4037,8 +4037,8 @@ TextMetrics* CanvasRenderingContext2D::DrawOrMeasureText(

  aError = nsBidiPresUtils::ProcessText(
      textToDraw.get(), textToDraw.Length(),
      isRTL ? mozilla::intl::Bidi::EmbeddingLevel::RTL()
            : mozilla::intl::Bidi::EmbeddingLevel::LTR(),
      isRTL ? mozilla::intl::BidiEmbeddingLevel::RTL()
            : mozilla::intl::BidiEmbeddingLevel::LTR(),
      presShell->GetPresContext(), processor, nsBidiPresUtils::MODE_DRAW,
      nullptr, 0, nullptr, &mBidiEngine);

+5 −5
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@
#include "JoinNodeTransaction.h"         // for JoinNodeTransaction
#include "PlaceholderTransaction.h"      // for PlaceholderTransaction
#include "SplitNodeTransaction.h"        // for SplitNodeTransaction
#include "mozilla/intl/Bidi.h"
#include "mozilla/intl/BidiEmbeddingLevel.h"
#include "mozilla/BasePrincipal.h"            // for BasePrincipal
#include "mozilla/CheckedInt.h"               // for CheckedInt
#include "mozilla/ComposerCommandsUpdater.h"  // for ComposerCommandsUpdater
@@ -5763,13 +5763,13 @@ EditorBase::AutoCaretBidiLevelManager::AutoCaretBidiLevelManager(
  nsPrevNextBidiLevels levels = frameSelection->GetPrevNextBidiLevels(
      aPointAtCaret.GetContainerAsContent(), aPointAtCaret.Offset(), true);

  mozilla::intl::Bidi::EmbeddingLevel levelBefore = levels.mLevelBefore;
  mozilla::intl::Bidi::EmbeddingLevel levelAfter = levels.mLevelAfter;
  mozilla::intl::BidiEmbeddingLevel levelBefore = levels.mLevelBefore;
  mozilla::intl::BidiEmbeddingLevel levelAfter = levels.mLevelAfter;

  mozilla::intl::Bidi::EmbeddingLevel currentCaretLevel =
  mozilla::intl::BidiEmbeddingLevel currentCaretLevel =
      frameSelection->GetCaretBidiLevel();

  mozilla::intl::Bidi::EmbeddingLevel levelOfDeletion;
  mozilla::intl::BidiEmbeddingLevel levelOfDeletion;
  levelOfDeletion = (nsIEditor::eNext == aDirectionAndAmount ||
                     nsIEditor::eNextWord == aDirectionAndAmount)
                        ? levelAfter
+2 −2
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@
#ifndef mozilla_EditorBase_h
#define mozilla_EditorBase_h

#include "mozilla/intl/Bidi.h"
#include "mozilla/intl/BidiEmbeddingLevel.h"
#include "mozilla/Assertions.h"          // for MOZ_ASSERT, etc.
#include "mozilla/EditAction.h"          // for EditAction and EditSubAction
#include "mozilla/EditorDOMPoint.h"      // for EditorDOMPoint
@@ -1982,7 +1982,7 @@ class EditorBase : public nsIEditor,
    void MaybeUpdateCaretBidiLevel(const EditorBase& aEditorBase) const;

   private:
    Maybe<mozilla::intl::Bidi::EmbeddingLevel> mNewCaretBidiLevel;
    Maybe<mozilla::intl::BidiEmbeddingLevel> mNewCaretBidiLevel;
    bool mFailed = false;
    bool mCanceled = false;
  };
+23 −23
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@ namespace mozilla::intl {

struct VisualRun {
  Span<const char16_t> string;
  Bidi::Direction direction;
  BidiDirection direction;
};

/**
@@ -19,7 +19,7 @@ struct VisualRun {
class MOZ_STACK_CLASS VisualRunIter {
 public:
  VisualRunIter(Bidi& aBidi, Span<const char16_t> aParagraph,
                Bidi::EmbeddingLevel aLevel)
                BidiEmbeddingLevel aLevel)
      : mBidi(aBidi), mParagraph(aParagraph) {
    // Crash in case of errors by calling unwrap. If this were a real API, this
    // would be a TryCreate call.
@@ -35,7 +35,7 @@ class MOZ_STACK_CLASS VisualRunIter {
    int32_t stringIndex = -1;
    int32_t stringLength = -1;

    Bidi::Direction direction =
    BidiDirection direction =
        mBidi.GetVisualRun(mRunIndex, &stringIndex, &stringLength);

    Span<const char16_t> string(mParagraph.Elements() + stringIndex,
@@ -53,7 +53,7 @@ class MOZ_STACK_CLASS VisualRunIter {

struct LogicalRun {
  Span<const char16_t> string;
  Bidi::EmbeddingLevel embeddingLevel;
  BidiEmbeddingLevel embeddingLevel;
};

/**
@@ -63,7 +63,7 @@ struct LogicalRun {
class MOZ_STACK_CLASS LogicalRunIter {
 public:
  LogicalRunIter(Bidi& aBidi, Span<const char16_t> aParagraph,
                 Bidi::EmbeddingLevel aLevel)
                 BidiEmbeddingLevel aLevel)
      : mBidi(aBidi), mParagraph(aParagraph) {
    // Crash in case of errors by calling unwrap. If this were a real API, this
    // would be a TryCreate call.
@@ -78,7 +78,7 @@ class MOZ_STACK_CLASS LogicalRunIter {

    int32_t logicalLimit;

    Bidi::EmbeddingLevel embeddingLevel;
    BidiEmbeddingLevel embeddingLevel;
    mBidi.GetLogicalRun(mRunIndex, &logicalLimit, &embeddingLevel);

    Span<const char16_t> string(mParagraph.Elements() + mRunIndex,
@@ -98,7 +98,7 @@ TEST(IntlBidi, SimpleLTR)
{
  Bidi bidi{};
  LogicalRunIter logicalRunIter(bidi, MakeStringSpan(u"this is a paragraph"),
                                Bidi::EmbeddingLevel::DefaultLTR());
                                BidiEmbeddingLevel::DefaultLTR());
  ASSERT_EQ(bidi.GetParagraphEmbeddingLevel(), 0);
  ASSERT_EQ(bidi.GetParagraphDirection(), Bidi::ParagraphDirection::LTR);

@@ -107,7 +107,7 @@ TEST(IntlBidi, SimpleLTR)
    ASSERT_TRUE(logicalRun.isSome());
    ASSERT_EQ(logicalRun->string, MakeStringSpan(u"this is a paragraph"));
    ASSERT_EQ(logicalRun->embeddingLevel, 0);
    ASSERT_EQ(logicalRun->embeddingLevel.Direction(), Bidi::Direction::LTR);
    ASSERT_EQ(logicalRun->embeddingLevel.Direction(), BidiDirection::LTR);
  }

  {
@@ -120,7 +120,7 @@ TEST(IntlBidi, SimpleRTL)
{
  Bidi bidi{};
  LogicalRunIter logicalRunIter(bidi, MakeStringSpan(u"فايرفوكس رائع"),
                                Bidi::EmbeddingLevel::DefaultLTR());
                                BidiEmbeddingLevel::DefaultLTR());
  ASSERT_EQ(bidi.GetParagraphEmbeddingLevel(), 1);
  ASSERT_EQ(bidi.GetParagraphDirection(), Bidi::ParagraphDirection::RTL);

@@ -128,7 +128,7 @@ TEST(IntlBidi, SimpleRTL)
    auto logicalRun = logicalRunIter.Next();
    ASSERT_TRUE(logicalRun.isSome());
    ASSERT_EQ(logicalRun->string, MakeStringSpan(u"فايرفوكس رائع"));
    ASSERT_EQ(logicalRun->embeddingLevel.Direction(), Bidi::Direction::RTL);
    ASSERT_EQ(logicalRun->embeddingLevel.Direction(), BidiDirection::RTL);
    ASSERT_EQ(logicalRun->embeddingLevel, 1);
  }

@@ -143,7 +143,7 @@ TEST(IntlBidi, MultiLevel)
  Bidi bidi{};
  LogicalRunIter logicalRunIter(
      bidi, MakeStringSpan(u"Firefox is awesome: رائع Firefox"),
      Bidi::EmbeddingLevel::DefaultLTR());
      BidiEmbeddingLevel::DefaultLTR());
  ASSERT_EQ(bidi.GetParagraphEmbeddingLevel(), 0);
  ASSERT_EQ(bidi.GetParagraphDirection(), Bidi::ParagraphDirection::Mixed);

@@ -180,7 +180,7 @@ TEST(IntlBidi, RtlOverride)
  // levels can be computed.
  LogicalRunIter logicalRunIter(
      bidi, MakeStringSpan(u"ltr\u202b___رائع___\u202a___ltr__"),
      Bidi::EmbeddingLevel::DefaultLTR());
      BidiEmbeddingLevel::DefaultLTR());
  ASSERT_EQ(bidi.GetParagraphEmbeddingLevel(), 0);
  ASSERT_EQ(bidi.GetParagraphDirection(), Bidi::ParagraphDirection::Mixed);

@@ -189,21 +189,21 @@ TEST(IntlBidi, RtlOverride)
    ASSERT_TRUE(logicalRun.isSome());
    ASSERT_EQ(logicalRun->string, MakeStringSpan(u"ltr"));
    ASSERT_EQ(logicalRun->embeddingLevel, 0);
    ASSERT_EQ(logicalRun->embeddingLevel.Direction(), Bidi::Direction::LTR);
    ASSERT_EQ(logicalRun->embeddingLevel.Direction(), BidiDirection::LTR);
  }
  {
    auto logicalRun = logicalRunIter.Next();
    ASSERT_TRUE(logicalRun.isSome());
    ASSERT_EQ(logicalRun->string, MakeStringSpan(u"\u202b___رائع___"));
    ASSERT_EQ(logicalRun->embeddingLevel, 1);
    ASSERT_EQ(logicalRun->embeddingLevel.Direction(), Bidi::Direction::RTL);
    ASSERT_EQ(logicalRun->embeddingLevel.Direction(), BidiDirection::RTL);
  }
  {
    auto logicalRun = logicalRunIter.Next();
    ASSERT_TRUE(logicalRun.isSome());
    ASSERT_EQ(logicalRun->string, MakeStringSpan(u"\u202a___ltr__"));
    ASSERT_EQ(logicalRun->embeddingLevel, 2);
    ASSERT_EQ(logicalRun->embeddingLevel.Direction(), Bidi::Direction::LTR);
    ASSERT_EQ(logicalRun->embeddingLevel.Direction(), BidiDirection::LTR);
  }
  {
    auto logicalRun = logicalRunIter.Next();
@@ -219,24 +219,24 @@ TEST(IntlBidi, VisualRuns)
      bidi,
      MakeStringSpan(
          u"first visual run التشغيل البصري الثاني third visual run"),
      Bidi::EmbeddingLevel::DefaultLTR());
      BidiEmbeddingLevel::DefaultLTR());
  {
    Maybe<VisualRun> run = visualRunIter.Next();
    ASSERT_TRUE(run.isSome());
    ASSERT_EQ(run->string, MakeStringSpan(u"first visual run "));
    ASSERT_EQ(run->direction, Bidi::Direction::LTR);
    ASSERT_EQ(run->direction, BidiDirection::LTR);
  }
  {
    Maybe<VisualRun> run = visualRunIter.Next();
    ASSERT_TRUE(run.isSome());
    ASSERT_EQ(run->string, MakeStringSpan(u"التشغيل البصري الثاني"));
    ASSERT_EQ(run->direction, Bidi::Direction::RTL);
    ASSERT_EQ(run->direction, BidiDirection::RTL);
  }
  {
    Maybe<VisualRun> run = visualRunIter.Next();
    ASSERT_TRUE(run.isSome());
    ASSERT_EQ(run->string, MakeStringSpan(u" third visual run"));
    ASSERT_EQ(run->direction, Bidi::Direction::LTR);
    ASSERT_EQ(run->direction, BidiDirection::LTR);
  }
  {
    Maybe<VisualRun> run = visualRunIter.Next();
@@ -250,24 +250,24 @@ TEST(IntlBidi, VisualRunsWithEmbeds)
  Bidi bidi{};
  VisualRunIter visualRunIter(
      bidi, MakeStringSpan(u"ltr\u202b___رائع___\u202a___ltr___"),
      Bidi::EmbeddingLevel::DefaultLTR());
      BidiEmbeddingLevel::DefaultLTR());
  {
    Maybe<VisualRun> run = visualRunIter.Next();
    ASSERT_TRUE(run.isSome());
    ASSERT_EQ(run->string, MakeStringSpan(u"ltr"));
    ASSERT_EQ(run->direction, Bidi::Direction::LTR);
    ASSERT_EQ(run->direction, BidiDirection::LTR);
  }
  {
    Maybe<VisualRun> run = visualRunIter.Next();
    ASSERT_TRUE(run.isSome());
    ASSERT_EQ(run->string, MakeStringSpan(u"\u202a___ltr___"));
    ASSERT_EQ(run->direction, Bidi::Direction::LTR);
    ASSERT_EQ(run->direction, BidiDirection::LTR);
  }
  {
    Maybe<VisualRun> run = visualRunIter.Next();
    ASSERT_TRUE(run.isSome());
    ASSERT_EQ(run->string, MakeStringSpan(u"\u202b___رائع___"));
    ASSERT_EQ(run->direction, Bidi::Direction::RTL);
    ASSERT_EQ(run->direction, BidiDirection::RTL);
  }
  {
    Maybe<VisualRun> run = visualRunIter.Next();
Loading