diff --git a/dom/media/TextTrackCue.cpp b/dom/media/TextTrackCue.cpp index 1a441a0aeb17..823d49863952 100644 --- a/dom/media/TextTrackCue.cpp +++ b/dom/media/TextTrackCue.cpp @@ -9,6 +9,7 @@ #include "mozilla/dom/TextTrackRegion.h" #include "nsComponentManagerUtils.h" #include "mozilla/ClearOnShutdown.h" +#include "unicode/ubidi.h" extern mozilla::LazyLogModule gTextTrackLog; @@ -205,10 +206,24 @@ PositionAlignSetting TextTrackCue::ComputedPositionAlign() { return PositionAlignSetting::Line_left; } else if (mAlign == AlignSetting::Right) { return PositionAlignSetting::Line_right; + } else if (mAlign == AlignSetting::Start) { + return IsTextBaseDirectionLTR() ? PositionAlignSetting::Line_left + : PositionAlignSetting::Line_right; + } else if (mAlign == AlignSetting::End) { + return IsTextBaseDirectionLTR() ? PositionAlignSetting::Line_right + : PositionAlignSetting::Line_left; } return PositionAlignSetting::Center; } +bool TextTrackCue::IsTextBaseDirectionLTR() const { + // The returned result by `ubidi_getBaseDirection` might be `neutral` if the + // text only contains netural charaters. In this case, we would treat its + // base direction as LTR. + return ubidi_getBaseDirection(mText.BeginReading(), mText.Length()) != + UBIDI_RTL; +} + void TextTrackCue::NotifyDisplayStatesChanged() { if (!mReset) { return; diff --git a/dom/media/TextTrackCue.h b/dom/media/TextTrackCue.h index e2d3e556b146..9569a5a2358d 100644 --- a/dom/media/TextTrackCue.h +++ b/dom/media/TextTrackCue.h @@ -298,6 +298,8 @@ class TextTrackCue final : public DOMEventTargetHelper { void SetDefaultCueSettings(); nsresult StashDocument(); + bool IsTextBaseDirectionLTR() const; + RefPtr mDocument; nsString mText; double mStartTime;