Bug 1276831 - part1 : VTTCue's position should be double or auto keyword. draft
authorAlastor Wu <alwu@mozilla.com>
Wed, 15 Jun 2016 16:51:17 +0100
changeset 378257 4c560ce6eb648b077997ec981ca001153e192650
parent 378256 06cf5f333dc53741ea0937f740887a06f213f7a4
child 378258 3abd7fedf39b22c9957baac8e99942e3bb87a81b
push id20975
push useralwu@mozilla.com
push dateWed, 15 Jun 2016 15:52:52 +0000
bugs1276831
milestone50.0a1
Bug 1276831 - part1 : VTTCue's position should be double or auto keyword. MozReview-Commit-ID: 5zsEMxbwuEH
dom/media/TextTrackCue.cpp
dom/media/TextTrackCue.h
dom/webidl/VTTCue.webidl
--- 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;
 };