mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 11:25:00 +00:00
Bug 678057 - 'Workers: overrideMimeType() removed from XHR, breaks web content, diverges from main-thread XHR'. r=sicking.
--HG-- extra : transplant_source : %D5r%ADtwT%DF%BAO-2sav%CCD%E2Y%B2Q
This commit is contained in:
parent
af38a5be63
commit
3bbbbf1418
@ -259,7 +259,6 @@ class XMLHttpRequest
|
||||
SLOT_channel = 0,
|
||||
SLOT_responseXML,
|
||||
SLOT_responseText,
|
||||
SLOT_mozResponseArrayBuffer,
|
||||
SLOT_status,
|
||||
SLOT_statusText,
|
||||
SLOT_readyState,
|
||||
@ -389,8 +388,6 @@ private:
|
||||
if (!JS_SetReservedSlot(aCx, obj, SLOT_channel, JSVAL_NULL) ||
|
||||
!JS_SetReservedSlot(aCx, obj, SLOT_responseXML, JSVAL_NULL) ||
|
||||
!JS_SetReservedSlot(aCx, obj, SLOT_responseText, emptyString) ||
|
||||
!JS_SetReservedSlot(aCx, obj, SLOT_mozResponseArrayBuffer,
|
||||
JSVAL_NULL) ||
|
||||
!JS_SetReservedSlot(aCx, obj, SLOT_status, zero) ||
|
||||
!JS_SetReservedSlot(aCx, obj, SLOT_statusText, emptyString) ||
|
||||
!JS_SetReservedSlot(aCx, obj, SLOT_readyState, zero) ||
|
||||
@ -732,6 +729,25 @@ private:
|
||||
|
||||
return priv->SetRequestHeader(aCx, header, value);
|
||||
}
|
||||
|
||||
static JSBool
|
||||
OverrideMimeType(JSContext* aCx, uintN aArgc, jsval* aVp)
|
||||
{
|
||||
JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
|
||||
|
||||
XMLHttpRequestPrivate* priv =
|
||||
GetInstancePrivate(aCx, obj, sFunctions[7].name);
|
||||
if (!priv) {
|
||||
return false;
|
||||
}
|
||||
|
||||
JSString* mimeType;
|
||||
if (!JS_ConvertArguments(aCx, aArgc, JS_ARGV(aCx, aVp), "S", &mimeType)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return priv->OverrideMimeType(aCx, mimeType);
|
||||
}
|
||||
};
|
||||
|
||||
JSClass XMLHttpRequest::sClass = {
|
||||
@ -751,7 +767,6 @@ JSPropertySpec XMLHttpRequest::sProperties[] = {
|
||||
GENERIC_READONLY_PROPERTY(channel)
|
||||
GENERIC_READONLY_PROPERTY(responseXML)
|
||||
GENERIC_READONLY_PROPERTY(responseText)
|
||||
GENERIC_READONLY_PROPERTY(mozResponseArrayBuffer)
|
||||
GENERIC_READONLY_PROPERTY(status)
|
||||
GENERIC_READONLY_PROPERTY(statusText)
|
||||
GENERIC_READONLY_PROPERTY(readyState)
|
||||
@ -790,6 +805,7 @@ JSFunctionSpec XMLHttpRequest::sFunctions[] = {
|
||||
JS_FN("send", Send, 0, FUNCTION_FLAGS),
|
||||
JS_FN("sendAsBinary", SendAsBinary, 1, FUNCTION_FLAGS),
|
||||
JS_FN("setRequestHeader", SetRequestHeader, 2, FUNCTION_FLAGS),
|
||||
JS_FN("overrideMimeType", OverrideMimeType, 1, FUNCTION_FLAGS),
|
||||
JS_FS_END
|
||||
};
|
||||
|
||||
|
@ -1056,6 +1056,24 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class OverrideMimeTypeRunnable : public WorkerThreadProxySyncRunnable
|
||||
{
|
||||
nsCString mMimeType;
|
||||
|
||||
public:
|
||||
OverrideMimeTypeRunnable(WorkerPrivate* aWorkerPrivate, Proxy* aProxy,
|
||||
const nsCString& aMimeType)
|
||||
: WorkerThreadProxySyncRunnable(aWorkerPrivate, aProxy), mMimeType(aMimeType)
|
||||
{ }
|
||||
|
||||
intN
|
||||
MainThreadRun()
|
||||
{
|
||||
nsresult rv = mProxy->mXHR->OverrideMimeType(mMimeType);
|
||||
return GetDOMExceptionCodeFromResult(rv);
|
||||
}
|
||||
};
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
void
|
||||
@ -1624,6 +1642,36 @@ XMLHttpRequestPrivate::SetRequestHeader(JSContext* aCx, JSString* aHeader,
|
||||
return runnable->Dispatch(aCx);
|
||||
}
|
||||
|
||||
bool
|
||||
XMLHttpRequestPrivate::OverrideMimeType(JSContext* aCx, JSString* aMimeType)
|
||||
{
|
||||
mWorkerPrivate->AssertIsOnWorkerThread();
|
||||
|
||||
if (mCanceled) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// We're supposed to throw if the state is not OPENED or HEADERS_RECEIVED. We
|
||||
// can detect OPENED really easily but we can't detect HEADERS_RECEIVED in a
|
||||
// non-racy way until the XHR state machine actually runs on this thread
|
||||
// (bug 671047). For now we're going to let this work only if the Send()
|
||||
// method has not been called.
|
||||
if (!mProxy || SendInProgress()) {
|
||||
ThrowDOMExceptionForCode(aCx, INVALID_STATE_ERR);
|
||||
return false;
|
||||
}
|
||||
|
||||
nsDependentJSString mimeType;
|
||||
if (!mimeType.init(aCx, aMimeType)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
nsRefPtr<OverrideMimeTypeRunnable> runnable =
|
||||
new OverrideMimeTypeRunnable(mWorkerPrivate, mProxy,
|
||||
NS_ConvertUTF16toUTF8(mimeType));
|
||||
return runnable->Dispatch(aCx);
|
||||
}
|
||||
|
||||
bool
|
||||
XMLHttpRequestPrivate::MaybeDispatchPrematureAbortEvents(JSContext* aCx,
|
||||
bool aFromOpen)
|
||||
|
@ -141,6 +141,9 @@ public:
|
||||
bool
|
||||
SetRequestHeader(JSContext* aCx, JSString* aHeader, JSString* aValue);
|
||||
|
||||
bool
|
||||
OverrideMimeType(JSContext* aCx, JSString* aMimeType);
|
||||
|
||||
private:
|
||||
void
|
||||
ReleaseProxy();
|
||||
@ -154,6 +157,12 @@ private:
|
||||
bool
|
||||
DispatchPrematureAbortEvent(JSContext* aCx, JSObject* aTarget,
|
||||
PRUint64 aEventType, bool aUploadTarget);
|
||||
|
||||
bool
|
||||
SendInProgress() const
|
||||
{
|
||||
return mJSObjectRootCount != 0;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace xhr
|
||||
|
@ -75,6 +75,7 @@ function runTest() {
|
||||
};
|
||||
|
||||
xhr.open("GET", "testXHR.txt");
|
||||
xhr.overrideMimeType("text/plain");
|
||||
xhr.send(null);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user