зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1311798
- Align XMLHttpRequest.abort() with the spec. r=baku
--HG-- extra : rebase_source : 29002a6d139a08b706e54dfa4c32163632455e67
This commit is contained in:
Родитель
012910643b
Коммит
d1cae84099
|
@ -1064,10 +1064,75 @@ XMLHttpRequestMainThread::CloseRequestWithError(const ProgressEventType aType)
|
|||
}
|
||||
|
||||
void
|
||||
XMLHttpRequestMainThread::Abort(ErrorResult& arv)
|
||||
XMLHttpRequestMainThread::RequestErrorSteps(const ProgressEventType aEventType,
|
||||
const nsresult aOptionalException,
|
||||
ErrorResult& aRv)
|
||||
{
|
||||
// Step 1
|
||||
mState = State::done;
|
||||
|
||||
StopProgressEventTimer();
|
||||
|
||||
// Step 2
|
||||
mFlagSend = false;
|
||||
|
||||
// Step 3
|
||||
ResetResponse();
|
||||
|
||||
// If we're in the destructor, don't risk dispatching an event.
|
||||
if (mFlagDeleted) {
|
||||
mFlagSyncLooping = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// Step 4
|
||||
if (mFlagSynchronous && NS_FAILED(aOptionalException)) {
|
||||
aRv.Throw(aOptionalException);
|
||||
return;
|
||||
}
|
||||
|
||||
// Step 5
|
||||
FireReadystatechangeEvent();
|
||||
|
||||
// Step 6
|
||||
if (mUpload && !mUploadComplete) {
|
||||
|
||||
// Step 6-1
|
||||
mUploadComplete = true;
|
||||
|
||||
// Step 6-2
|
||||
if (mFlagHadUploadListenersOnSend) {
|
||||
|
||||
// Steps 6-3, 6-4 (loadend is fired for us)
|
||||
DispatchProgressEvent(mUpload, aEventType, 0, -1);
|
||||
}
|
||||
}
|
||||
|
||||
// Steps 7 and 8 (loadend is fired for us)
|
||||
DispatchProgressEvent(this, aEventType, 0, -1);
|
||||
}
|
||||
|
||||
void
|
||||
XMLHttpRequestMainThread::Abort(ErrorResult& aRv)
|
||||
{
|
||||
mFlagAborted = true;
|
||||
CloseRequestWithError(ProgressEventType::abort);
|
||||
|
||||
// Step 1
|
||||
CloseRequest();
|
||||
|
||||
// Step 2
|
||||
if ((mState == State::opened && mFlagSend) ||
|
||||
mState == State::headers_received ||
|
||||
mState == State::loading) {
|
||||
RequestErrorSteps(ProgressEventType::abort, NS_OK, aRv);
|
||||
}
|
||||
|
||||
// Step 3
|
||||
if (mState == State::done) {
|
||||
ChangeState(State::unsent, false); // no ReadystateChange event
|
||||
}
|
||||
|
||||
mFlagSyncLooping = false;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
|
|
@ -395,6 +395,11 @@ public:
|
|||
aRv = SendInternal(&body);
|
||||
}
|
||||
|
||||
void
|
||||
RequestErrorSteps(const ProgressEventType aEventType,
|
||||
const nsresult aOptionalException,
|
||||
ErrorResult& aRv);
|
||||
|
||||
void
|
||||
Abort() {
|
||||
ErrorResult rv;
|
||||
|
|
|
@ -1669,7 +1669,9 @@ XMLHttpRequestWorker::MaybeDispatchPrematureAbortEvents(ErrorResult& aRv)
|
|||
|
||||
// Only send readystatechange event when state changed.
|
||||
bool isStateChanged = false;
|
||||
if (mStateData.mReadyState != 4) {
|
||||
if ((mStateData.mReadyState == 1 && mStateData.mFlagSend) ||
|
||||
mStateData.mReadyState == 2 ||
|
||||
mStateData.mReadyState == 3) {
|
||||
isStateChanged = true;
|
||||
mStateData.mReadyState = 4;
|
||||
}
|
||||
|
@ -1811,6 +1813,8 @@ XMLHttpRequestWorker::SendInternal(SendRunnable* aRunnable,
|
|||
aRunnable->SetSyncLoopTarget(syncLoopTarget);
|
||||
aRunnable->SetHaveUploadListeners(hasUploadListeners);
|
||||
|
||||
mStateData.mFlagSend = true;
|
||||
|
||||
aRunnable->Dispatch(aRv);
|
||||
if (aRv.Failed()) {
|
||||
// Dispatch() may have spun the event loop and we may have already unrooted.
|
||||
|
@ -1837,6 +1841,7 @@ XMLHttpRequestWorker::SendInternal(SendRunnable* aRunnable,
|
|||
if (!autoSyncLoop->Run() && !aRv.Failed()) {
|
||||
aRv.Throw(NS_ERROR_FAILURE);
|
||||
}
|
||||
mStateData.mFlagSend = false;
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
@ -33,15 +33,16 @@ public:
|
|||
uint32_t mStatus;
|
||||
nsCString mStatusText;
|
||||
uint16_t mReadyState;
|
||||
bool mFlagSend;
|
||||
JS::Heap<JS::Value> mResponse;
|
||||
nsresult mResponseTextResult;
|
||||
nsresult mStatusResult;
|
||||
nsresult mResponseResult;
|
||||
|
||||
StateData()
|
||||
: mStatus(0), mReadyState(0), mResponse(JS::UndefinedValue()),
|
||||
mResponseTextResult(NS_OK), mStatusResult(NS_OK),
|
||||
mResponseResult(NS_OK)
|
||||
: mStatus(0), mReadyState(0), mFlagSend(false),
|
||||
mResponse(JS::UndefinedValue()), mResponseTextResult(NS_OK),
|
||||
mStatusResult(NS_OK), mResponseResult(NS_OK)
|
||||
{ }
|
||||
|
||||
void trace(JSTracer* trc);
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
[abort-during-open.htm]
|
||||
type: testharness
|
||||
[XMLHttpRequest: abort() during OPEN]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[abort-during-open.worker.html]
|
||||
type: testharness
|
||||
[Untitled]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[abort-event-abort.htm]
|
||||
type: testharness
|
||||
[XMLHttpRequest: The abort() method: do not fire abort event in OPENED state when send() flag is unset.]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[send-data-unexpected-tostring.htm]
|
||||
type: testharness
|
||||
[abort() called from data stringification]
|
||||
expected: FAIL
|
||||
|
Загрузка…
Ссылка в новой задаче