Bug 1311798 - Align XMLHttpRequest.abort() with the spec. r=baku

--HG--
extra : rebase_source : 29002a6d139a08b706e54dfa4c32163632455e67
This commit is contained in:
Thomas Wisniewski 2016-11-21 01:30:00 -05:00
Родитель 012910643b
Коммит d1cae84099
8 изменённых файлов: 82 добавлений и 26 удалений

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

@ -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