зеркало из https://github.com/mozilla/gecko-dev.git
Bug 783426: Patch 1 - Async DOMRequest Firing; r=sicking
This commit is contained in:
Родитель
287a39048a
Коммит
79dc311d5f
|
@ -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(jsc, &mResult);
|
||||
}
|
||||
|
||||
nsresult
|
||||
Run()
|
||||
{
|
||||
static_cast<DOMRequest*>(mReq)->FireSuccess(mResult);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
~FireSuccessAsyncTask()
|
||||
{
|
||||
JSContext* cx = mReq->GetJSContextForEventHandlers();
|
||||
JS_RemoveValueRoot(jsc, &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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче