Bug 631058 - Backing out changesets 0d43e33ce134 and 60d7b8a4c275. r=wes, a=backout-scary-stuff
--- a/content/base/test/file_mozfiledataurl_inner.html
+++ b/content/base/test/file_mozfiledataurl_inner.html
@@ -57,17 +57,17 @@ function iframeNotifyParent(e) {
}
onload = function() {
img = document.getElementById('img');
img.onerror = img.onload = imgNotifyParent;
iframe = document.getElementById('iframe');
iframe.onerror = iframe.onload = iframeNotifyParent;
audio = document.getElementById('audio');
- audio.onerror = audio.onloadedmetadata = audioNotifyParent;
+ audio.onerror = audio.oncanplay = audioNotifyParent;
}
</script>
<body>
<img id=img>
<audio id=audio>
<iframe id=iframe></iframe>
</html>
--- a/content/base/test/test_mozfiledataurl.html
+++ b/content/base/test/test_mozfiledataurl.html
@@ -7,17 +7,17 @@
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body onload="gen.next()">
<p id="display">
<iframe id=inner></iframe>
<iframe id=iframe></iframe>
<img id=img onload="gen.send(event);">
-<audio id=audio onloadedmetadata="gen.send(event);">
+<audio id=audio oncanplay="gen.send(event);">
<input type=file id=fileList>
</p>
<div id="content" style="display: none">
</div>
<pre id="test">
<script class="testbody" type="application/javascript;version=1.8">
@@ -85,21 +85,21 @@ function runTest() {
isnot(res.width, 120, "correct error width");
isnot(res.height, 90, "correct error height");
// Attempt to load an audio in this document
var file = getFile("file_mozfiledataurl_audio.ogg");
var fileurl = URL.createObjectURL(file);
audio.src = fileurl;
var e = (yield);
- is(e.type, "loadedmetadata", "loaded successfully");
+ is(e.type, "canplay", "loaded successfully");
// Revoke url and attempt to load a audio in this document
audio.src = "file_mozfiledataurl_audio.ogg";
- is((yield).type, "loadedmetadata", "successfully reset audio");
+ is((yield).type, "canplay", "successfully reset audio");
URL.revokeObjectURL(fileurl);
todo(false, "urls need to act like 404s, not fail to parse");
/* img.src = fileurl;
var e = (yield);
is(e.type, "error", "failed successfully");
isnot(img.width, 120, "correct error width");
isnot(img.height, 90, "correct error height");
*/
@@ -108,17 +108,17 @@ function runTest() {
var fileurl = URL.createObjectURL(file);
isnot(fileurl, oldFileurl, "URL.createObjectURL generated the same url twice");
// Attempt to load an audio in a different same-origin document
inner.src = innerSameSiteURI;
yield;
inner.contentWindow.postMessage(JSON.stringify({audio:fileurl}), "*");
var res = (yield);
- is(res.type, "loadedmetadata", "loaded successfully");
+ is(res.type, "canplay", "loaded successfully");
// Attempt to load an audio in a different cross-origin document
inner.src = innerCrossSiteURI;
yield;
inner.contentWindow.postMessage(JSON.stringify({audio:fileurl}), "*");
var res = (yield);
is(res.type, "error", "failed successfully");
--- a/content/html/content/public/nsHTMLMediaElement.h
+++ b/content/html/content/public/nsHTMLMediaElement.h
@@ -323,29 +323,16 @@ public:
already_AddRefed<nsILoadGroup> GetDocumentLoadGroup();
/**
* Returns PR_TRUE if the media has played or completed a seek.
* Used by video frame to determine whether to paint the poster.
*/
PRBool GetPlayedOrSeeked() const { return mHasPlayedOrSeeked; }
- /**
- * The preloading action to perform. These dictate how we react to the
- * preload attribute. See mPreloadAction.
- */
- enum PreloadAction {
- PRELOAD_UNDEFINED = 0, // not determined - used only for initialization
- PRELOAD_NONE = 1, // do not preload
- PRELOAD_METADATA = 2, // preload only the metadata (and first frame)
- PRELOAD_ENOUGH = 3 // preload enough data to allow uninterrupted
- // playback
- };
- PreloadAction GetPreloadAction() const { return mPreloadAction; }
-
nsresult CopyInnerTo(nsGenericElement* aDest) const;
/**
* Sets the Accept header on the HTTP channel to the required
* video or audio MIME types.
*/
virtual nsresult SetAcceptHeader(nsIHttpChannel* aChannel) = 0;
@@ -487,16 +474,28 @@ protected:
enum PreloadAttrValue {
PRELOAD_ATTR_EMPTY, // set to ""
PRELOAD_ATTR_NONE, // set to "none"
PRELOAD_ATTR_METADATA, // set to "metadata"
PRELOAD_ATTR_AUTO // set to "auto"
};
/**
+ * The preloading action to perform. These dictate how we react to the
+ * preload attribute. See mPreloadAction.
+ */
+ enum PreloadAction {
+ PRELOAD_UNDEFINED = 0, // not determined - used only for initialization
+ PRELOAD_NONE = 1, // do not preload
+ PRELOAD_METADATA = 2, // preload only the metadata (and first frame)
+ PRELOAD_ENOUGH = 3 // preload enough data to allow uninterrupted
+ // playback
+ };
+
+ /**
* Suspends the load of resource at aURI, so that it can be resumed later
* by ResumeLoad(). This is called when we have a media with a 'preload'
* attribute value of 'none', during the resource selection algorithm.
*/
void SuspendLoad(nsIURI* aURI);
/**
* Resumes a previously suspended load (suspended by SuspendLoad(uri)).
--- a/content/media/nsBuiltinDecoder.cpp
+++ b/content/media/nsBuiltinDecoder.cpp
@@ -850,20 +850,16 @@ void nsBuiltinDecoder::Resume(PRBool aFo
mStream->Resume();
}
if (aForceBuffering) {
MonitorAutoEnter mon(mMonitor);
mDecoderStateMachine->StartBuffering();
}
}
-nsHTMLMediaElement::PreloadAction nsBuiltinDecoder::GetPreloadAction() {
- return mElement->GetPreloadAction();
-}
-
void nsBuiltinDecoder::StopProgressUpdates()
{
NS_ASSERTION(IsCurrentThread(mStateMachineThread), "Should be on state machine thread.");
mIgnoreProgressData = PR_TRUE;
if (mStream) {
mStream->SetReadMode(nsMediaCacheStream::MODE_METADATA);
}
}
--- a/content/media/nsBuiltinDecoder.h
+++ b/content/media/nsBuiltinDecoder.h
@@ -445,19 +445,16 @@ class nsBuiltinDecoder : public nsMediaD
return mDecoderStateMachine->GetBuffered(aBuffered);
}
virtual void NotifyDataArrived(const char* aBuffer, PRUint32 aLength, PRUint32 aOffset) {
return mDecoderStateMachine->NotifyDataArrived(aBuffer, aLength, aOffset);
}
public:
- // Return the preloadAction
- nsHTMLMediaElement::PreloadAction GetPreloadAction();
-
// Return the current state. Can be called on any thread. If called from
// a non-main thread, the decoder monitor must be held.
PlayState GetState() {
return mPlayState;
}
// Stop updating the bytes downloaded for progress notifications. Called
// when seeking to prevent wild changes to the progress notification.
--- a/content/media/nsBuiltinDecoderStateMachine.cpp
+++ b/content/media/nsBuiltinDecoderStateMachine.cpp
@@ -982,24 +982,21 @@ nsresult nsBuiltinDecoderStateMachine::R
continue;
}
VideoData* videoData = FindStartTime();
if (videoData) {
MonitorAutoExit exitMon(mDecoder->GetMonitor());
RenderVideoFrame(videoData);
}
- if (mDecoder->GetPreloadAction() == nsHTMLMediaElement::PRELOAD_ENOUGH ||
- mDecoder->GetState() == nsBuiltinDecoder::PLAY_STATE_PLAYING)
- {
- // Start the decode threads, so that we can pre buffer the streams
- // and calculate the start time in order to determine the duration.
- if (NS_FAILED(StartDecodeThreads())) {
- continue;
- }
+
+ // Start the decode threads, so that we can pre buffer the streams.
+ // and calculate the start time in order to determine the duration.
+ if (NS_FAILED(StartDecodeThreads())) {
+ continue;
}
NS_ASSERTION(mStartTime != -1, "Must have start time");
NS_ASSERTION((!HasVideo() && !HasAudio()) ||
!mSeekable || mEndTime != -1,
"Active seekable media should have end time");
NS_ASSERTION(!mSeekable || GetDuration() != -1, "Seekable media should have duration");
LOG(PR_LOG_DEBUG, ("%p Media goes from %lldms to %lldms (duration %lldms) seekable=%d",
@@ -1021,49 +1018,22 @@ nsresult nsBuiltinDecoderStateMachine::R
if (HasAudio()) {
mEventManager.Init(info.mAudioChannels, info.mAudioRate);
mDecoder->RequestFrameBufferLength(frameBufferLength);
}
if (mState == DECODER_STATE_DECODING_METADATA) {
LOG(PR_LOG_DEBUG, ("%p Changed state from DECODING_METADATA to DECODING", mDecoder));
mState = DECODER_STATE_DECODING;
-
- // Start playback.
- if (mDecoder->GetState() == nsBuiltinDecoder::PLAY_STATE_PLAYING) {
- if (!IsPlaying()) {
- StartPlayback();
- }
- } else if (mDecoder->GetPreloadAction() != nsHTMLMediaElement::PRELOAD_ENOUGH) {
- if (mReader) {
- // Clear any frames queued up during FindStartTime() and reset
- // to the start of the stream to save memory.
- MonitorAutoExit exitMon(mDecoder->GetMonitor());
- mReader->ResetDecode();
+ }
- nsMediaStream* stream = mDecoder->GetCurrentStream();
- PRInt64 offset = mReader->GetInfo().mDataOffset;
- if (NS_FAILED(stream->Seek(nsISeekableStream::NS_SEEK_SET, offset))) {
- mState = DECODER_STATE_SHUTDOWN;
- }
- }
- // Note state can change when we release the decoder monitor to
- // call ResetDecode() above, so we must re-verify the state here.
- if (mState != DECODER_STATE_DECODING ||
- mDecoder->GetState() == nsBuiltinDecoder::PLAY_STATE_PLAYING) {
- continue;
- }
-
- // Shutdown the state machine thread, in order to save
- // memory on thread stacks, particuarly on Linux.
- nsCOMPtr<nsIRunnable> event = new ShutdownThreadEvent(mDecoder->mStateMachineThread);
- NS_DispatchToMainThread(event, NS_DISPATCH_NORMAL);
- mDecoder->mStateMachineThread = nsnull;
-
- return NS_OK;
+ // Start playback.
+ if (mDecoder->GetState() == nsBuiltinDecoder::PLAY_STATE_PLAYING) {
+ if (!IsPlaying()) {
+ StartPlayback();
}
}
}
break;
case DECODER_STATE_DECODING:
{
if (NS_FAILED(StartDecodeThreads())) {
--- a/content/media/nsMediaCache.cpp
+++ b/content/media/nsMediaCache.cpp
@@ -2062,38 +2062,33 @@ nsMediaCacheStream::Seek(PRInt32 aWhence
{
NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
nsAutoMonitor mon(gMediaCache->Monitor());
if (mClosed)
return NS_ERROR_FAILURE;
PRInt64 oldOffset = mStreamOffset;
- PRInt64 newOffset = mStreamOffset;
switch (aWhence) {
case PR_SEEK_END:
if (mStreamLength < 0)
return NS_ERROR_FAILURE;
- newOffset = mStreamLength + aOffset;
+ mStreamOffset = mStreamLength + aOffset;
break;
case PR_SEEK_CUR:
- newOffset += aOffset;
+ mStreamOffset += aOffset;
break;
case PR_SEEK_SET:
- newOffset = aOffset;
+ mStreamOffset = aOffset;
break;
default:
NS_ERROR("Unknown whence");
return NS_ERROR_FAILURE;
}
- if (newOffset < 0)
- return NS_ERROR_FAILURE;
- mStreamOffset = newOffset;
-
LOG(PR_LOG_DEBUG, ("Stream %p Seek to %lld", this, (long long)mStreamOffset));
gMediaCache->NoteSeek(this, oldOffset);
gMediaCache->QueueUpdate();
return NS_OK;
}
PRInt64
--- a/content/media/webm/nsWebMReader.cpp
+++ b/content/media/webm/nsWebMReader.cpp
@@ -330,17 +330,17 @@ nsresult nsWebMReader::ReadMetadata()
default:
mInfo.mStereoMode = STEREO_MODE_MONO;
}
}
// mDataOffset is not used by the WebM backend.
// See bug 566779 for a suggestion to refactor
// and remove it.
- mInfo.mDataOffset = 0;
+ mInfo.mDataOffset = -1;
}
else if (!mHasAudio && type == NESTEGG_TRACK_AUDIO) {
nestegg_audio_params params;
r = nestegg_track_audio_params(mContext, track, ¶ms);
if (r == -1) {
Cleanup();
return NS_ERROR_FAILURE;
}