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:
Ben Turner 2011-08-13 12:43:51 -07:00
parent af38a5be63
commit 3bbbbf1418
4 changed files with 78 additions and 4 deletions

View File

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

View File

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

View File

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

View File

@ -75,6 +75,7 @@ function runTest() {
};
xhr.open("GET", "testXHR.txt");
xhr.overrideMimeType("text/plain");
xhr.send(null);
}