Bug 1276831 - part1 : VTTCue's position should be double or auto keyword.
MozReview-Commit-ID: 5zsEMxbwuEH
--- a/dom/media/TextTrackCue.cpp
+++ b/dom/media/TextTrackCue.cpp
@@ -28,17 +28,17 @@ NS_INTERFACE_MAP_END_INHERITING(DOMEvent
StaticRefPtr<nsIWebVTTParserWrapper> TextTrackCue::sParserWrapper;
// Set cue setting defaults based on step 19 & seq.
// in http://dev.w3.org/html5/webvtt/#parsing
void
TextTrackCue::SetDefaultCueSettings()
{
- mPosition = 50;
+ mPositionIsAutoKeyword = true;
mPositionAlign = PositionAlignSetting::Center;
mSize = 100.0;
mPauseOnExit = false;
mSnapToLines = true;
mLineIsAutoKeyword = true;
mAlign = AlignSetting::Center;
mLineAlign = LineAlignSetting::Start;
mVertical = DirectionSetting::_empty;
@@ -199,16 +199,30 @@ TextTrackCue::ComputedLine()
if (mTrack == track) {
break;
}
}
return (-1.0) * showingTracksNum;
}
+double
+TextTrackCue::ComputedPosition()
+{
+ // See spec https://w3c.github.io/webvtt/#cue-computed-position
+ if (!mPositionIsAutoKeyword) {
+ return mPosition;
+ } else if (mAlign == AlignSetting::Left) {
+ return 0.0;
+ } else if (mAlign == AlignSetting::Right) {
+ return 100.0;
+ }
+ return 50.0;
+}
+
PositionAlignSetting
TextTrackCue::ComputedPositionAlign()
{
// See spec https://w3c.github.io/webvtt/#cue-computed-position-alignment
if (mPositionAlign != PositionAlignSetting::Auto) {
return mPositionAlign;
} else if (mAlign == AlignSetting::Left) {
return PositionAlignSetting::Line_left;
--- a/dom/media/TextTrackCue.h
+++ b/dom/media/TextTrackCue.h
@@ -185,34 +185,45 @@ public:
if (mLineAlign == aLineAlign) {
return;
}
mReset = true;
mLineAlign = aLineAlign;
}
- int32_t Position() const
+ void GetPosition(OwningDoubleOrAutoKeyword& aPosition) const
{
- return mPosition;
+ if (mPositionIsAutoKeyword) {
+ aPosition.SetAsAutoKeyword() = AutoKeyword::Auto;
+ return;
+ }
+ aPosition.SetAsDouble() = mPosition;
}
- void SetPosition(int32_t aPosition, ErrorResult& aRv)
+ void SetPosition(const DoubleOrAutoKeyword& aPosition, ErrorResult& aRv)
{
- if (mPosition == aPosition) {
- return;
- }
-
- if (aPosition > 100 || aPosition < 0){
+ if (!aPosition.IsAutoKeyword() &&
+ (aPosition.GetAsDouble() > 100.0 || aPosition.GetAsDouble() < 0.0)){
aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
return;
}
- mReset = true;
- mPosition = aPosition;
+ if (aPosition.IsDouble() &&
+ (mPositionIsAutoKeyword || (aPosition.GetAsDouble() != mPosition))) {
+ mPositionIsAutoKeyword = false;
+ mPosition = aPosition.GetAsDouble();
+ mReset = true;
+ return;
+ }
+
+ if (aPosition.IsAutoKeyword() && !mPositionIsAutoKeyword) {
+ mPositionIsAutoKeyword = true;
+ mReset = true;
+ }
}
PositionAlignSetting PositionAlign() const
{
return mPositionAlign;
}
void SetPositionAlign(PositionAlignSetting aPositionAlign, ErrorResult& aRv)
@@ -295,16 +306,17 @@ public:
}
bool HasBeenReset()
{
return mReset;
}
double ComputedLine();
+ double ComputedPosition();
PositionAlignSetting ComputedPositionAlign();
// Helper functions for implementation.
bool
operator==(const TextTrackCue& rhs) const
{
return mId.Equals(rhs.mId);
}
@@ -360,17 +372,18 @@ private:
RefPtr<nsIDocument> mDocument;
nsString mText;
double mStartTime;
double mEndTime;
RefPtr<TextTrack> mTrack;
RefPtr<HTMLTrackElement> mTrackElement;
nsString mId;
- int32_t mPosition;
+ double mPosition;
+ bool mPositionIsAutoKeyword;
PositionAlignSetting mPositionAlign;
double mSize;
bool mPauseOnExit;
bool mSnapToLines;
RefPtr<TextTrackRegion> mRegion;
DirectionSetting mVertical;
bool mLineIsAutoKeyword;
double mLine;
--- a/dom/webidl/VTTCue.webidl
+++ b/dom/webidl/VTTCue.webidl
@@ -42,17 +42,17 @@ interface VTTCue : TextTrackCue {
[Pref="media.webvtt.regions.enabled"]
attribute VTTRegion? region;
attribute DirectionSetting vertical;
attribute boolean snapToLines;
attribute (double or AutoKeyword) line;
[SetterThrows]
attribute LineAlignSetting lineAlign;
[SetterThrows]
- attribute long position;
+ attribute (double or AutoKeyword) position;
[SetterThrows]
attribute PositionAlignSetting positionAlign;
[SetterThrows]
attribute double size;
attribute AlignSetting align;
attribute DOMString text;
DocumentFragment getCueAsHTML();
};
@@ -61,10 +61,12 @@ interface VTTCue : TextTrackCue {
partial interface VTTCue {
[ChromeOnly]
attribute HTMLDivElement? displayState;
[ChromeOnly]
readonly attribute boolean hasBeenReset;
[ChromeOnly]
readonly attribute double computedLine;
[ChromeOnly]
+ readonly attribute double computedPosition;
+ [ChromeOnly]
readonly attribute PositionAlignSetting computedPositionAlign;
};