Backout changesets e0aab5011b70, 0040f406ea6d (Bug 462959) due to intermittent crashes in its own test.
authorMarco Bonardo <mbonardo@mozilla.com>
Tue, 02 Aug 2011 23:36:14 +0200
changeset 73724 c8f939f67ab5af6d3450601a844b140362e46b0f
parent 73723 b0e4ea1084d1db0d2145119fcc444866956924ab
child 73725 d722773c9c636a78828da3cb74cc7e2f6c4c32ef
push id2
push userbsmedberg@mozilla.com
push dateFri, 19 Aug 2011 14:38:13 +0000
bugs462959
milestone8.0a1
backs oute0aab5011b705bc41e1307590c51320d5380cfe4
0040f406ea6d85fac4e773a2f44487175917b2d8
Backout changesets e0aab5011b70, 0040f406ea6d (Bug 462959) due to intermittent crashes in its own test.
content/html/content/public/nsHTMLMediaElement.h
content/html/content/src/nsHTMLMediaElement.cpp
content/html/content/src/nsTimeRanges.cpp
content/html/content/src/nsTimeRanges.h
content/media/test/Makefile.in
content/media/test/manifest.js
content/media/test/test_played.html
dom/interfaces/html/nsIDOMHTMLAudioElement.idl
dom/interfaces/html/nsIDOMHTMLMediaElement.idl
dom/interfaces/html/nsIDOMHTMLVideoElement.idl
--- a/content/html/content/public/nsHTMLMediaElement.h
+++ b/content/html/content/public/nsHTMLMediaElement.h
@@ -45,17 +45,16 @@
 #include "nsIHttpChannel.h"
 #include "nsThreadUtils.h"
 #include "nsIDOMRange.h"
 #include "nsCycleCollectionParticipant.h"
 #include "nsILoadGroup.h"
 #include "nsIObserver.h"
 #include "ImageLayers.h"
 #include "nsAudioStream.h"
-#include "nsTimeRanges.h"
 
 // Define to output information on decoding and painting framerate
 /* #define DEBUG_FRAME_RATE 1 */
 
 typedef PRUint16 nsMediaNetworkState;
 typedef PRUint16 nsMediaReadyState;
 
 class nsHTMLMediaElement : public nsGenericHTMLElement,
@@ -620,22 +619,16 @@ protected:
 
   // An audio stream for writing audio directly from JS.
   nsRefPtr<nsAudioStream> mAudioStream;
 
   // PR_TRUE if MozAudioAvailable events can be safely dispatched, based on
   // a media and element same-origin check.
   PRBool mAllowAudioData;
 
-  // Range of time played.
-  nsTimeRanges mPlayed;
-
-  // Temporary variable for storing a time, when the stream starts to play
-  double mCurrentPlayRangeStart;
-
   // If true then we have begun downloading the media content.
   // Set to false when completed, or not yet started.
   PRPackedBool mBegun;
 
   // True when the decoder has loaded enough data to display the
   // first frame of the content.
   PRPackedBool mLoadedFirstFrame;
 
--- a/content/html/content/src/nsHTMLMediaElement.cpp
+++ b/content/html/content/src/nsHTMLMediaElement.cpp
@@ -34,16 +34,17 @@
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 #include "nsIDOMHTMLMediaElement.h"
 #include "nsIDOMHTMLSourceElement.h"
 #include "nsHTMLMediaElement.h"
+#include "nsTimeRanges.h"
 #include "nsGenericHTMLElement.h"
 #include "nsPresContext.h"
 #include "nsIPresShell.h"
 #include "nsGkAtoms.h"
 #include "nsSize.h"
 #include "nsIFrame.h"
 #include "nsIDocument.h"
 #include "nsIDOMDocument.h"
@@ -1086,26 +1087,16 @@ NS_IMETHODIMP nsHTMLMediaElement::GetCur
   *aCurrentTime = mDecoder ? mDecoder->GetCurrentTime() : 0.0;
   return NS_OK;
 }
 
 NS_IMETHODIMP nsHTMLMediaElement::SetCurrentTime(double aCurrentTime)
 {
   StopSuspendingAfterFirstFrame();
 
-  if (mCurrentPlayRangeStart != -1) {
-    double oldCurrentTime = 0;
-    GetCurrentTime(&oldCurrentTime);
-    LOG(PR_LOG_DEBUG, ("Adding a range: [%f, %f]", mCurrentPlayRangeStart, oldCurrentTime));
-    // Multiple seek without playing
-    if (mCurrentPlayRangeStart != oldCurrentTime) {
-      mPlayed.Add(mCurrentPlayRangeStart, oldCurrentTime);
-    }
-  }
-
   if (!mDecoder) {
     LOG(PR_LOG_DEBUG, ("%p SetCurrentTime(%f) failed: no decoder", this, aCurrentTime));
     return NS_ERROR_DOM_INVALID_STATE_ERR;
   }
 
   if (mReadyState == nsIDOMHTMLMediaElement::HAVE_NOTHING) {
     LOG(PR_LOG_DEBUG, ("%p SetCurrentTime(%f) failed: no source", this, aCurrentTime));
     return NS_ERROR_DOM_INVALID_STATE_ERR;
@@ -1125,19 +1116,16 @@ NS_IMETHODIMP nsHTMLMediaElement::SetCur
   }
 
   mPlayingBeforeSeek = IsPotentiallyPlaying();
   // The media backend is responsible for dispatching the timeupdate
   // event if it changes the playback position as a result of the seek.
   LOG(PR_LOG_DEBUG, ("%p SetCurrentTime(%f) starting seek", this, aCurrentTime));
   nsresult rv = mDecoder->Seek(clampedTime);
 
-  // Start a new range at position we seeked to
-  mCurrentPlayRangeStart = clampedTime;
-
   // We changed whether we're seeking so we need to AddRemoveSelfReference
   AddRemoveSelfReference();
 
   return rv;
 }
 
 /* readonly attribute double duration; */
 NS_IMETHODIMP nsHTMLMediaElement::GetDuration(double *aDuration)
@@ -1149,45 +1137,16 @@ NS_IMETHODIMP nsHTMLMediaElement::GetDur
 /* readonly attribute boolean paused; */
 NS_IMETHODIMP nsHTMLMediaElement::GetPaused(PRBool *aPaused)
 {
   *aPaused = mPaused;
 
   return NS_OK;
 }
 
-/* readonly attribute nsIDOMHTMLTimeRanges played; */
-NS_IMETHODIMP nsHTMLMediaElement::GetPlayed(nsIDOMTimeRanges** aPlayed)
-{
-  nsRefPtr<nsTimeRanges> ranges = new nsTimeRanges();
-
-  PRUint32 timeRangeCount = 0;
-  mPlayed.GetLength(&timeRangeCount);
-  for (PRUint32 i = 0; i < timeRangeCount; i++) {
-    double begin;
-    double end;
-    mPlayed.Start(i, &begin);
-    mPlayed.End(i, &end);
-    ranges->Add(begin, end);
-  }
-
-  if (mCurrentPlayRangeStart != -1.0) {
-    double now = 0.0;
-    GetCurrentTime(&now);
-    if (mCurrentPlayRangeStart != now) {
-      ranges->Add(mCurrentPlayRangeStart, now);
-    }
-  }
-
-  ranges->Normalize();
-
-  ranges.forget(aPlayed);
-  return NS_OK;
-}
-
 /* void pause (); */
 NS_IMETHODIMP nsHTMLMediaElement::Pause()
 {
   if (mNetworkState == nsIDOMHTMLMediaElement::NETWORK_EMPTY) {
     LOG(PR_LOG_DEBUG, ("Loading due to Pause()"));
     nsresult rv = Load();
     NS_ENSURE_SUCCESS(rv, rv);
   } else if (mDecoder) {
@@ -1316,17 +1275,16 @@ nsHTMLMediaElement::nsHTMLMediaElement(a
     mLoadWaitStatus(NOT_WAITING),
     mVolume(1.0),
     mChannels(0),
     mRate(0),
     mPreloadAction(PRELOAD_UNDEFINED),
     mMediaSize(-1,-1),
     mLastCurrentTime(0.0),
     mAllowAudioData(PR_FALSE),
-    mCurrentPlayRangeStart(-1.0),
     mBegun(PR_FALSE),
     mLoadedFirstFrame(PR_FALSE),
     mAutoplaying(PR_TRUE),
     mAutoplayEnabled(PR_TRUE),
     mPaused(PR_TRUE),
     mMuted(PR_FALSE),
     mPlayingBeforeSeek(PR_FALSE),
     mPausedForInactiveDocument(PR_FALSE),
@@ -1417,20 +1375,16 @@ NS_IMETHODIMP nsHTMLMediaElement::Play()
       SetCurrentTime(0);
     }
     if (!mPausedForInactiveDocument) {
       nsresult rv = mDecoder->Play();
       NS_ENSURE_SUCCESS(rv, rv);
     }
   }
 
-  if (mCurrentPlayRangeStart == -1.0) {
-    GetCurrentTime(&mCurrentPlayRangeStart);
-  }
-
   // TODO: If the playback has ended, then the user agent must set
   // seek to the effective start.
   // TODO: The playback rate must be set to the default playback rate.
   if (mPaused) {
     DispatchAsyncEvent(NS_LITERAL_STRING("play"));
     switch (mReadyState) {
     case nsIDOMHTMLMediaElement::HAVE_NOTHING:
       DispatchAsyncEvent(NS_LITERAL_STRING("waiting"));
@@ -2075,23 +2029,16 @@ void nsHTMLMediaElement::Error(PRUint16 
 }
 
 void nsHTMLMediaElement::PlaybackEnded()
 {
   NS_ASSERTION(mDecoder->IsEnded(), "Decoder fired ended, but not in ended state");
   // We changed the state of IsPlaybackEnded which can affect AddRemoveSelfReference
   AddRemoveSelfReference();
 
-  double end = 0.0;
-  GetCurrentTime(&end);
-  if (mCurrentPlayRangeStart != end) {
-    mPlayed.Add(mCurrentPlayRangeStart, end);
-  }
-  mCurrentPlayRangeStart = -1.0;
-
   if (mDecoder && mDecoder->IsInfinite()) {
     LOG(PR_LOG_DEBUG, ("%p, got duration by reaching the end of the stream", this));
     DispatchAsyncEvent(NS_LITERAL_STRING("durationchange"));
   }
 
   FireTimeUpdate(PR_FALSE);
   DispatchAsyncEvent(NS_LITERAL_STRING("ended"));
 }
@@ -2503,17 +2450,17 @@ void nsHTMLMediaElement::NotifyAddedSour
   // resource selection algorithm.
   if (!HasAttr(kNameSpaceID_None, nsGkAtoms::src) &&
       mNetworkState == nsIDOMHTMLMediaElement::NETWORK_EMPTY)
   {
     QueueSelectResourceTask();
   }
 
   // A load was paused in the resource selection algorithm, waiting for
-  // a new source child to be added, resume the resource selection algorithm.
+  // a new source child to be added, resume the resource selction algorithm.
   if (mLoadWaitStatus == WAITING_FOR_SOURCE) {
     QueueLoadFromSourceTask();
   }
 }
 
 nsIContent* nsHTMLMediaElement::GetNextSource()
 {
   nsresult rv = NS_OK;
--- a/content/html/content/src/nsTimeRanges.cpp
+++ b/content/html/content/src/nsTimeRanges.cpp
@@ -80,33 +80,8 @@ nsTimeRanges::End(PRUint32 aIndex, doubl
   *aTime = mRanges[aIndex].mEnd;
   return NS_OK;
 }
 
 void
 nsTimeRanges::Add(double aStart, double aEnd) {
   mRanges.AppendElement(TimeRange(aStart,aEnd));
 }
-
-void
-nsTimeRanges::Normalize() {
-  if (mRanges.Length() <= 1) {
-    return;
-  }
-  nsAutoTArray<TimeRange, 4> normalized;
-
-  mRanges.Sort(CompareTimeRanges());
-
-  // This merges the intervals
-  TimeRange current(mRanges[0]);
-  for (PRUint32 i = 1; i < mRanges.Length(); i++) {
-    if (current.mEnd >= mRanges[i].mStart) {
-      current.mEnd = NS_MAX(current.mEnd, mRanges[i].mEnd);
-    } else {
-      normalized.AppendElement(current);
-      current = mRanges[i];
-    }
-  }
-
-  normalized.AppendElement(current);
-
-  mRanges = normalized;
-}
--- a/content/html/content/src/nsTimeRanges.h
+++ b/content/html/content/src/nsTimeRanges.h
@@ -50,40 +50,22 @@ public:
   NS_DECL_ISUPPORTS
   NS_DECL_NSIDOMTIMERANGES
 
   nsTimeRanges();
   ~nsTimeRanges();
 
   void Add(double aStart, double aEnd);
 
-  // See <http://www.whatwg.org/html/#normalized-timeranges-object>.
-  void Normalize();
-
 private:
 
   struct TimeRange {
     TimeRange(double aStart, double aEnd)
       : mStart(aStart),
         mEnd(aEnd) {}
     double mStart;
     double mEnd;
   };
 
-  struct CompareTimeRanges
-  {
-    PRBool Equals(const TimeRange& tr1, const TimeRange& tr2) const
-    {
-      return tr1.mStart == tr2.mStart && tr1.mEnd == tr2.mEnd;
-    }
-
-    // Here, we aim at time range normalization. That why we order only by start
-    // time, since the ranges can overlap.
-    PRBool LessThan(const TimeRange& tr1, const TimeRange& tr2) const
-    {
-      return tr1.mStart < tr2.mStart;
-    }
-  };
-
   nsAutoTArray<TimeRange,4> mRanges;
 };
 
 #endif // nsTimeRanges_h__
--- a/content/media/test/Makefile.in
+++ b/content/media/test/Makefile.in
@@ -121,17 +121,16 @@ include $(topsrcdir)/config/rules.mk
 		test_media_selection.html \
 		test_mozLoadFrom.html \
 		test_networkState.html \
 		test_new_audio.html \
 		test_paused.html \
 		test_paused_after_ended.html \
 		test_play_events.html \
 		test_play_events_2.html \
-		test_played.html \
 		test_playback.html \
 		test_playback_errors.html \
 		test_preload_actions.html \
 		test_preload_attribute.html \
 		test_progress.html \
 		test_reactivate.html \
 		test_readyState.html \
 		test_replay_metadata.html \
--- a/content/media/test/manifest.js
+++ b/content/media/test/manifest.js
@@ -18,24 +18,16 @@ var gProgressTests = [
   { name:"r11025_u8_c1.wav", type:"audio/x-wav", duration:1.0, size:11069 },
   { name:"big.wav", type:"audio/x-wav", duration:9.0, size:102444 },
   { name:"seek.ogv", type:"video/ogg", duration:3.966, size:285310 },
   { name:"320x240.ogv", type:"video/ogg", width:320, height:240, duration:0.233, size:28942 },
   { name:"seek.webm", type:"video/webm", duration:3.966, size:215529 },
   { name:"bogus.duh", type:"bogus/duh" }
 ];
 
-// Used by test_played
-var gPlayedTests = [
-  { name:"big.wav", type:"audio/x-wav", duration:9.0, size:102444 },
-  { name:"sound.ogg", type:"audio/ogg", duration:4.0, size:2603 },
-  { name:"seek.ogv", type:"video/ogg", duration:3.966, size:285310 },
-  { name:"seek.webm", type:"video/webm", duration:3.966 }
-];
-
 // Used by test_mozLoadFrom.  Need one test file per decoder backend, plus
 // anything for testing clone-specific bugs.
 var gCloneTests = gSmallTests.concat([
   // Actual duration is ~200ms, we have Content-Duration lie about it.
   { name:"bug520908.ogv", type:"video/ogg", duration:9000 },
 ]);
 
 // Used by test_play_twice.  Need one test file per decoder backend, plus
deleted file mode 100644
--- a/content/media/test/test_played.html
+++ /dev/null
@@ -1,233 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
-<title>Test played member for media elements</title>
-<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
-<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
-<script type="text/javascript" src="manifest.js"></script>
-</head>
-<body>
-<pre id='test'>
-<script class="testbody" type='application/javascript;version=1.8'>
-
-let manager = new MediaTestManager;
-
-function finish_test(element) {
-  if (element.parentNode)
-    element.parentNode.removeChild(element);
-  element.src = "";
-  manager.finished(element.token);
-}
-
-// Check that a file has been played in its entirety
-function check_full_file_played(element) {
-  element.addEventListener('ended', function() {
-    let interval_count = element.played.length;
-    is(interval_count, 1, "normal play: a.played.length must be 1");
-    is(element.played.start(0), 0, "start time shall be 0");
-    is(element.played.end(0), element.duration, "end time shall be duration");
-    finish_test(element);
-  }, false);
-}
-
-var tests = [
-// Without playing, check that player.played.length == 0
-{
-  setup : function(element) {
-    element.addEventListener("loadedmetadata", function() {
-      is(element.played.length, 0, "audio: initial played.length equals zero");
-      finish_test(element);
-    });
-  }
-},
-// Play the file, test the range we have
-{
-  setup : function(element) {
-    check_full_file_played(element);
-    element.play();
-  }
-},
-
-// Play the first half of the file, pause, play
-// and check we have only one range
-{
-  setup : function (element) {
-    let onEnded = function() {
-      element.pause();
-      element.currentTime = 0;
-      element.play();
-    }
-    element.addEventListener("ended", onEnded, false);
-    check_full_file_played(element);
-    element.play();
-  }
-},
-
-// Play the first half of the file, seek back, while
-// continuing to play. We shall have only one range
-{
-  setup : function (element) {
-    let onTimeUpdate = function() {
-      if (element.currentTime > element.duration / 2) {
-        element.removeEventListener("timeupdate", onTimeUpdate, false);
-        element.currentTime = element.duration / 4;
-      }
-    }
-    element.addEventListener("timeupdate", onTimeUpdate, false);
-    check_full_file_played(element);
-    element.play();
-  }
-},
-
-// Play and seek to have two ranges, and check that, as well a
-// boundaries
-{
-  setup : function (element) {
-    let onTimeUpdate = function() {
-      if (element.currentTime > element.duration / 2) {
-        element.removeEventListener("timeupdate", onTimeUpdate, false);
-        element.pause();
-        element.currentTime += element.duration / 10;
-        element.play();
-      }
-    }
-
-    element.addEventListener("loadedmetadata", function() {
-      element.addEventListener("timeupdate", onTimeUpdate, false);
-    }, false);
-
-
-    element.addEventListener("ended", function() {
-      if (element.played.length > 1) {
-        is(element.played.length, 2, "element.played.length == 2");
-        var guess = element.played.end(0) + element.duration / 10.0;
-        ok(rangeCheck(element.played.start(1), guess), "we should have seeked forward by one tenth of the duration");
-        is(element.played.end(1), element.duration, "end of second range shall be the total duration");
-      }
-      is(element.played.start(0), 0, "start of first range shall be 0");
-      finish_test(element);
-    }, false);
-
-    element.play();
-  }
-},
-
-// Play and seek to have to overlapping ranges. They should be merged, to a
-// range spanning all the test audio file.
-{
-  setup : function (element) {
-    let onTimeUpdate = function() {
-      if (element.currentTime > element.duration / 2) {
-        element.removeEventListener("timeupdate", onTimeUpdate, false);
-        element.currentTime = element.duration / 3;
-      }
-    };
-    element.addEventListener("loadedmetadata", function() {
-      element.addEventListener("timeupdate", onTimeUpdate, false);
-      check_full_file_played(element);
-      element.play();
-    }, false);
-  }
-},
-
-// Play to create two ranges, in the reverse order. check that they are sorted.
-{
-  setup : function (element) {
-    function end() {
-      element.pause();
-      let p = element.played;
-      ok(p.length >= 1, "There should be at least one range");
-      is(p.start(0), element.duration / 6,
-         "Start of first range should be the sixth of the duration");
-      ok(p.end(p.length - 1) > 5 * element.duration / 6,
-         "End of last range should be greater that five times the sixth of the duration");
-      finish_test(element);
-    }
-
-    function pauseseekrestart() {
-      element.pause();
-      element.currentTime = element.duration / 6;
-      element.play();
-    }
-
-    function onTimeUpdate_pauseseekrestart() {
-      if (element.currentTime > 5 * element.duration / 6) {
-        element.removeEventListener("timeupdate", onTimeUpdate_pauseseekrestart, false);
-        pauseseekrestart();
-        element.addEventListener("timeupdate", onTimeUpdate_end, false);
-      }
-    }
-
-    function onTimeUpdate_end() {
-      if (element.currentTime > 3 * element.duration / 6) {
-        element.removeEventListener("timeupdate", onTimeUpdate_end, false);
-        end();
-      }
-    }
-
-    element.addEventListener("timeupdate", onTimeUpdate_pauseseekrestart, false);
-
-    element.addEventListener('loadedmetadata', function() {
-      element.currentTime = 4 * element.duration / 6;
-      element.play();
-    }, false);
-  }
-},
-// Seek repeatedly without playing. No range should appear.
-{
-  setup : function(element) {
-    let index = 1;
-
-    element.addEventListener('ended', function() {
-      is(element.played.length, 0, "element.played.length should be 0");
-      finish_test(element);
-    }, false);
-
-    element.addEventListener('seeked', function() {
-      index++;
-      element.currentTime = index * element.duration / 5;
-    }, false);
-
-    element.addEventListener('loadedmetadata', function() {
-      element.currentTime = element.duration / 5;
-    }, false);
-  }
-}
-];
-
-function rangeCheck(n1, n2) {
-  var THRESHOLD = 0.35;
-  var diff = Math.abs(n1 - n2);
-  return diff < THRESHOLD;
-}
-
-function createTestArray(tests) {
-  var A = [];
-  for (var i = 0; i < tests.length; i++) {
-    for (var k = 0; k < gPlayedTests.length; k++) {
-      A.push({
-        setup : tests[i].setup,
-        name : gPlayedTests[k].name,
-        type : gPlayedTests[k].type
-      });
-    }
-  }
-  return A;
-}
-
-function startTest(test, token) {
-  var elemType = /^audio/.test(test.type) ? "audio" : "video";
-  var element = document.createElement(elemType);
-  element.src = test.name;
-  element.token = token;
-  test.setup(element);
-  manager.started(token);
-}
-
-manager.runTests(createTestArray(tests), startTest);
-
-</script>
-</pre>
-</body>
-</html>
--- a/dom/interfaces/html/nsIDOMHTMLAudioElement.idl
+++ b/dom/interfaces/html/nsIDOMHTMLAudioElement.idl
@@ -47,17 +47,17 @@
  * <audio> element.
  *
  * For more information on this interface, please see
  * http://www.whatwg.org/specs/web-apps/current-work/#audio
  *
  * @status UNDER_DEVELOPMENT
  */
 
-[scriptable, uuid(1f2437f1-6037-40c4-bfb6-105c6c60f0ca)]
+[scriptable, uuid(f0d4977c-9632-4fab-bc9b-91c250a6ef96)]
 interface nsIDOMHTMLAudioElement : nsIDOMHTMLMediaElement
 {
   // Setup the audio stream for writing
   void mozSetup(in PRUint32 channels, in PRUint32 rate);
 
   // Write audio to the audio stream
   [implicit_jscontext]
   unsigned long mozWriteAudio(in jsval data);
--- a/dom/interfaces/html/nsIDOMHTMLMediaElement.idl
+++ b/dom/interfaces/html/nsIDOMHTMLMediaElement.idl
@@ -52,17 +52,17 @@
 
 // undef the GetCurrentTime macro defined in WinBase.h from the MS Platform SDK
 %{C++
 #ifdef GetCurrentTime
 #undef GetCurrentTime
 #endif
 %}
 
-[scriptable, uuid(c8a5f714-97de-4e2c-8394-2397870224bb)]
+[scriptable, uuid(d8213322-46d8-47ca-a15c-2abae47ddfde)]
 interface nsIDOMHTMLMediaElement : nsIDOMHTMLElement
 {
   // error state
   readonly attribute nsIDOMMediaError error;
 
   // network state
            attribute DOMString src;
   readonly attribute DOMString currentSrc;
@@ -84,17 +84,16 @@ interface nsIDOMHTMLMediaElement : nsIDO
   const unsigned short HAVE_ENOUGH_DATA = 4;
   readonly attribute unsigned short readyState;
   readonly attribute boolean seeking;
 
   // playback state
            attribute double currentTime;
   readonly attribute double duration;
   readonly attribute boolean paused;
-  readonly attribute nsIDOMTimeRanges played;
   readonly attribute boolean ended;
   readonly attribute boolean mozAutoplayEnabled;
            attribute boolean autoplay;
   void play();
   void pause();
 
   // controls
            attribute boolean controls;
--- a/dom/interfaces/html/nsIDOMHTMLVideoElement.idl
+++ b/dom/interfaces/html/nsIDOMHTMLVideoElement.idl
@@ -43,25 +43,25 @@
  * <video> element.
  *
  * For more information on this interface, please see
  * http://www.whatwg.org/specs/web-apps/current-work/#video
  *
  * @status UNDER_DEVELOPMENT
  */
 
-[scriptable, uuid(169f0ff1-511a-453d-86b6-346c1e936122)]
+[scriptable, uuid(00c757ec-db7b-477e-95cd-b2a03b0f8634)]
 interface nsIDOMHTMLVideoElement : nsIDOMHTMLMediaElement
 {
-           attribute long width;
+           attribute long width; 
            attribute long height;
   readonly attribute unsigned long videoWidth;
   readonly attribute unsigned long videoHeight;
            attribute DOMString poster;
-
+           
   // A count of the number of video frames that have demuxed from the media
   // resource. If we were playing perfectly, we'd be able to paint this many
   // frames.
   readonly attribute unsigned long mozParsedFrames;
 
   // A count of the number of frames that have been decoded. We may drop
   // frames if the decode is taking too much time.
   readonly attribute unsigned long mozDecodedFrames;