Bug 1415766. P1 - we never pass anything other than NS_SEEK_SET to Seek(). r=bechen,gerald

MozReview-Commit-ID: AgvapCwwSpr

--HG--
extra : rebase_source : 2ba05b44f228c3d9a9440202c024abbd5487282f
extra : intermediate-source : f2ec0fec7c544171e7567beed322349dfb8e59a8
extra : source : 8e34a87b250f800897a761d2ccd408959007d02b
This commit is contained in:
JW Wang 2017-11-02 14:26:24 +08:00
Родитель f9f14101f3
Коммит cd5164d38d
2 изменённых файлов: 6 добавлений и 28 удалений

Просмотреть файл

@ -25,7 +25,6 @@
#include "nsContentUtils.h" #include "nsContentUtils.h"
#include "nsIObserverService.h" #include "nsIObserverService.h"
#include "nsIPrincipal.h" #include "nsIPrincipal.h"
#include "nsISeekableStream.h"
#include "nsPrintfCString.h" #include "nsPrintfCString.h"
#include "nsProxyRelease.h" #include "nsProxyRelease.h"
#include "nsThreadUtils.h" #include "nsThreadUtils.h"
@ -2414,41 +2413,22 @@ MediaCacheStream::SetPlaybackRate(uint32_t aBytesPerSecond)
} }
nsresult nsresult
MediaCacheStream::Seek(int32_t aWhence, int64_t aOffset) MediaCacheStream::Seek(int64_t aOffset)
{ {
NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread"); NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
ReentrantMonitorAutoEnter mon(mMediaCache->GetReentrantMonitor()); ReentrantMonitorAutoEnter mon(mMediaCache->GetReentrantMonitor());
if (mClosed) if (mClosed) {
return NS_ERROR_FAILURE;
int64_t oldOffset = mStreamOffset;
int64_t newOffset = mStreamOffset;
switch (aWhence) {
case PR_SEEK_END:
if (mStreamLength < 0)
return NS_ERROR_FAILURE;
newOffset = mStreamLength + aOffset;
break;
case PR_SEEK_CUR:
newOffset += aOffset;
break;
case PR_SEEK_SET:
newOffset = aOffset;
break;
default:
NS_ERROR("Unknown whence");
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
int64_t oldOffset = mStreamOffset;
int64_t newOffset = aOffset;
if (!IsOffsetAllowed(newOffset)) { if (!IsOffsetAllowed(newOffset)) {
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
mStreamOffset = newOffset; mStreamOffset = newOffset;
LOG("Stream %p Seek to %" PRId64, this, mStreamOffset); LOG("Stream %p Seek to %" PRId64, this, mStreamOffset);
mMediaCache->NoteSeek(this, oldOffset); mMediaCache->NoteSeek(this, oldOffset);
mMediaCache->QueueUpdate(); mMediaCache->QueueUpdate();
return NS_OK; return NS_OK;
} }
@ -2669,7 +2649,7 @@ MediaCacheStream::ReadAt(int64_t aOffset, char* aBuffer,
NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread"); NS_ASSERTION(!NS_IsMainThread(), "Don't call on main thread");
ReentrantMonitorAutoEnter mon(mMediaCache->GetReentrantMonitor()); ReentrantMonitorAutoEnter mon(mMediaCache->GetReentrantMonitor());
nsresult rv = Seek(nsISeekableStream::NS_SEEK_SET, aOffset); nsresult rv = Seek(aOffset);
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
return Read(aBuffer, aCount, aBytes); return Read(aBuffer, aCount, aBytes);
} }

Просмотреть файл

@ -339,9 +339,7 @@ public:
// These methods must be called on a different thread from the main // These methods must be called on a different thread from the main
// thread. They should always be called on the same thread for a given // thread. They should always be called on the same thread for a given
// stream. // stream.
// This can fail when aWhence is NS_SEEK_END and no stream length nsresult Seek(int64_t aOffset);
// is known.
nsresult Seek(int32_t aWhence, int64_t aOffset);
int64_t Tell(); int64_t Tell();
// *aBytes gets the number of bytes that were actually read. This can // *aBytes gets the number of bytes that were actually read. This can
// be less than aCount. If the first byte of data is not in the cache, // be less than aCount. If the first byte of data is not in the cache,