Bug 783426: Patch 1 - Async DOMRequest Firing; r=sicking

This commit is contained in:
Kyle Machulis 2012-08-23 09:52:29 -07:00
parent 5a0bd9d7ca
commit 87763f254a
2 changed files with 80 additions and 1 deletions

View File

@ -12,6 +12,7 @@
#include "nsEventDispatcher.h"
#include "nsDOMEvent.h"
#include "nsContentUtils.h"
#include "nsThreadUtils.h"
using mozilla::dom::DOMRequest;
using mozilla::dom::DOMRequestService;
@ -222,3 +223,79 @@ DOMRequestService::FireError(nsIDOMDOMRequest* aRequest,
return NS_OK;
}
class FireSuccessAsyncTask : public nsRunnable
{
public:
FireSuccessAsyncTask(nsIDOMDOMRequest* aRequest,
const jsval& aResult) :
mReq(aRequest),
mResult(aResult)
{
JSContext* cx = mReq->GetJSContextForEventHandlers();
JS_AddValueRoot(cx, &mResult);
}
nsresult
Run()
{
static_cast<DOMRequest*>(mReq)->FireSuccess(mResult);
return NS_OK;
}
~FireSuccessAsyncTask()
{
JSContext* cx = mReq->GetJSContextForEventHandlers();
JS_RemoveValueRoot(cx, &mResult);
}
private:
nsIDOMDOMRequest* mReq;
jsval mResult;
};
class FireErrorAsyncTask : public nsRunnable
{
public:
FireErrorAsyncTask(nsIDOMDOMRequest* aRequest,
const nsAString& aError) :
mReq(aRequest),
mError(aError)
{
}
nsresult
Run()
{
static_cast<DOMRequest*>(mReq)->FireError(mError);
return NS_OK;
}
private:
nsIDOMDOMRequest* mReq;
nsString mError;
};
NS_IMETHODIMP
DOMRequestService::FireSuccessAsync(nsIDOMDOMRequest* aRequest,
const jsval& aResult)
{
NS_ENSURE_STATE(aRequest);
nsCOMPtr<nsIRunnable> asyncTask = new FireSuccessAsyncTask(aRequest, aResult);
if (NS_FAILED(NS_DispatchToMainThread(asyncTask))) {
NS_WARNING("Failed to dispatch to main thread!");
return NS_ERROR_FAILURE;
}
return NS_OK;
}
NS_IMETHODIMP
DOMRequestService::FireErrorAsync(nsIDOMDOMRequest* aRequest,
const nsAString& aError)
{
NS_ENSURE_STATE(aRequest);
nsCOMPtr<nsIRunnable> asyncTask = new FireErrorAsyncTask(aRequest, aError);
if (NS_FAILED(NS_DispatchToMainThread(asyncTask))) {
NS_WARNING("Failed to dispatch to main thread!");
return NS_ERROR_FAILURE;
}
return NS_OK;
}

View File

@ -21,11 +21,13 @@ interface nsIDOMDOMRequest : nsIDOMEventTarget
attribute nsIDOMEventListener onerror;
};
[scriptable, builtinclass, uuid(eebcdf29-f8fa-4c36-bbc7-2146b1cbaf7b)]
[scriptable, builtinclass, uuid(10996de9-e6f6-4058-97bd-45f1fe065eb5)]
interface nsIDOMRequestService : nsISupports
{
nsIDOMDOMRequest createRequest(in nsIDOMWindow window);
void fireSuccess(in nsIDOMDOMRequest request, in jsval result);
void fireError(in nsIDOMDOMRequest request, in DOMString error);
void fireSuccessAsync(in nsIDOMDOMRequest request, in jsval result);
void fireErrorAsync(in nsIDOMDOMRequest request, in DOMString error);
};