Bug 780718 - Return false from DOMRequestService is preventDefault was called on events. r=sicking

This commit is contained in:
Wes Johnston 2012-08-06 15:26:02 -07:00
parent 1de3573fd4
commit 48eba85f08
8 changed files with 61 additions and 36 deletions

View File

@ -112,7 +112,7 @@ DOMRequest::GetError(nsIDOMDOMError** aError)
}
void
DOMRequest::FireSuccess(jsval aResult)
DOMRequest::FireSuccess(jsval aResult, bool* aDefaultActionEnabled)
{
NS_ASSERTION(!mDone, "mDone shouldn't have been set to true already!");
NS_ASSERTION(!mError, "mError shouldn't have been set!");
@ -124,11 +124,11 @@ DOMRequest::FireSuccess(jsval aResult)
}
mResult = aResult;
FireEvent(NS_LITERAL_STRING("success"), false, false);
FireEvent(NS_LITERAL_STRING("success"), false, false, aDefaultActionEnabled);
}
void
DOMRequest::FireError(const nsAString& aError)
DOMRequest::FireError(const nsAString& aError, bool* aDefaultActionEnabled)
{
NS_ASSERTION(!mDone, "mDone shouldn't have been set to true already!");
NS_ASSERTION(!mError, "mError shouldn't have been set!");
@ -137,11 +137,11 @@ DOMRequest::FireError(const nsAString& aError)
mDone = true;
mError = DOMError::CreateWithName(aError);
FireEvent(NS_LITERAL_STRING("error"), true, true);
FireEvent(NS_LITERAL_STRING("error"), true, true, aDefaultActionEnabled);
}
void
DOMRequest::FireError(nsresult aError)
DOMRequest::FireError(nsresult aError, bool* aDefaultActionEnabled)
{
NS_ASSERTION(!mDone, "mDone shouldn't have been set to true already!");
NS_ASSERTION(!mError, "mError shouldn't have been set!");
@ -150,11 +150,12 @@ DOMRequest::FireError(nsresult aError)
mDone = true;
mError = DOMError::CreateForNSResult(aError);
FireEvent(NS_LITERAL_STRING("error"), true, true);
FireEvent(NS_LITERAL_STRING("error"), true, true, aDefaultActionEnabled);
}
void
DOMRequest::FireEvent(const nsAString& aType, bool aBubble, bool aCancelable)
DOMRequest::FireEvent(const nsAString& aType, bool aBubble, bool aCancelable,
bool* aDefaultActionEnabled)
{
if (NS_FAILED(CheckInnerWindowCorrectness())) {
return;
@ -171,8 +172,7 @@ DOMRequest::FireEvent(const nsAString& aType, bool aBubble, bool aCancelable)
return;
}
bool dummy;
DispatchEvent(event, &dummy);
DispatchEvent(event, aDefaultActionEnabled);
}
void
@ -205,20 +205,24 @@ DOMRequestService::CreateRequest(nsIDOMWindow* aWindow,
NS_IMETHODIMP
DOMRequestService::FireSuccess(nsIDOMDOMRequest* aRequest,
const jsval& aResult)
const jsval& aResult,
bool* aDefaultActionEnabled)
{
NS_ENSURE_ARG_POINTER(aDefaultActionEnabled);
NS_ENSURE_STATE(aRequest);
static_cast<DOMRequest*>(aRequest)->FireSuccess(aResult);
static_cast<DOMRequest*>(aRequest)->FireSuccess(aResult, aDefaultActionEnabled);
return NS_OK;
}
NS_IMETHODIMP
DOMRequestService::FireError(nsIDOMDOMRequest* aRequest,
const nsAString& aError)
const nsAString& aError,
bool* aDefaultActionEnabled)
{
NS_ENSURE_ARG_POINTER(aDefaultActionEnabled);
NS_ENSURE_STATE(aRequest);
static_cast<DOMRequest*>(aRequest)->FireError(aError);
static_cast<DOMRequest*>(aRequest)->FireError(aError, aDefaultActionEnabled);
return NS_OK;
}

View File

@ -37,9 +37,9 @@ public:
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(DOMRequest,
nsDOMEventTargetHelper)
void FireSuccess(jsval aResult);
void FireError(const nsAString& aError);
void FireError(nsresult aError);
void FireSuccess(jsval aResult, bool* aDefaultActionEnabled);
void FireError(const nsAString& aError, bool* aDefaultActionEnabled);
void FireError(nsresult aError, bool* aDefaultActionEnabled);
DOMRequest(nsIDOMWindow* aWindow);
DOMRequest();
@ -52,7 +52,8 @@ public:
}
protected:
void FireEvent(const nsAString& aType, bool aBubble, bool aCancelable);
void FireEvent(const nsAString& aType, bool aBubble, bool aCancelable,
bool* aDefaultActionEnabled);
virtual void RootResultVal();
virtual void UnrootResultVal();

View File

@ -21,11 +21,11 @@ interface nsIDOMDOMRequest : nsIDOMEventTarget
attribute nsIDOMEventListener onerror;
};
[scriptable, builtinclass, uuid(eebcdf29-f8fa-4c36-bbc7-2146b1cbaf7b)]
[scriptable, builtinclass, uuid(46afe27a-d407-4eb8-95c4-aefbd2b63540)]
interface nsIDOMRequestService : nsISupports
{
nsIDOMDOMRequest createRequest(in nsIDOMWindow window);
void fireSuccess(in nsIDOMDOMRequest request, in jsval result);
void fireError(in nsIDOMDOMRequest request, in DOMString error);
bool fireSuccess(in nsIDOMDOMRequest request, in jsval result);
bool fireError(in nsIDOMDOMRequest request, in DOMString error);
};

View File

@ -35,7 +35,7 @@ var ev = null;
req.onsuccess = function(e) {
ev = e;
}
reqserv.fireSuccess(req, "my result");
is(reqserv.fireSuccess(req, "my result"), true, "prevent default not detected");
ok(ev, "got success event");
is(ev.type, "success", "correct type during success");
is(ev.target, req, "correct target during success");
@ -49,7 +49,7 @@ ev = null;
req.onerror = function(e) {
ev = e;
}
reqserv.fireError(req, "OhMyError");
is(reqserv.fireError(req, "OhMyError"), true, "prevent default not detected");
ok(ev, "got success event");
is(ev.type, "error", "correct type during error");
is(ev.target, req, "correct target during error");
@ -57,6 +57,16 @@ is(req.readyState, "done", "correct readyState after error");
is(req.error.name, "OhMyError", "correct error after error");
is(req.result, undefined, "correct result after error");
// Test calling preventDefault on events
req.onsuccess = function(e) e.preventDefault();
reqserv.fireSuccess(req, "my result");
is(reqserv.fireSuccess(req, "my result"), false, "prevent default detected");
// fire error
req.onerror = function(e) e.preventDefault();
reqserv.fireError(req, "OhMyError");
is(reqserv.fireError(req, "OhMyError"), false, "prevent default detected");
</script>
</pre>
</body>

View File

@ -36,14 +36,16 @@ DeviceStorageRequestChild::Recv__delete__(const DeviceStorageResponseValue& aVal
case DeviceStorageResponseValue::TErrorResponse:
{
ErrorResponse r = aValue;
mRequest->FireError(r.error());
bool allowDefault;
mRequest->FireError(r.error(), &allowDefault);
break;
}
case DeviceStorageResponseValue::TSuccessResponse:
{
jsval result = StringToJsval(mRequest->GetOwner(), mFile->mPath);
mRequest->FireSuccess(result);
bool allowDefault;
mRequest->FireSuccess(result, &allowDefault);
break;
}
@ -65,7 +67,8 @@ DeviceStorageRequestChild::Recv__delete__(const DeviceStorageResponseValue& aVal
mimeType);
jsval result = BlobToJsval(mRequest->GetOwner(), blob);
mRequest->FireSuccess(result);
bool allowDefault;
mRequest->FireSuccess(result, &allowDefault);
break;
}

View File

@ -537,7 +537,8 @@ public:
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
mRequest->FireError(mError);
bool allowDefault;
mRequest->FireError(mError, &allowDefault);
mRequest = nullptr;
return NS_OK;
}
@ -578,7 +579,8 @@ ContinueCursorEvent::Run() {
cursor->mOkToCallContinue = true;
}
mRequest->FireSuccess(val);
bool allowDefault;
mRequest->FireSuccess(val, &allowDefault);
mRequest = nullptr;
return NS_OK;
}
@ -793,7 +795,8 @@ public:
result = StringToJsval(mRequest->GetOwner(), mPath);
}
mRequest->FireSuccess(result);
bool allowDefault;
mRequest->FireSuccess(result, &allowDefault);
mRequest = nullptr;
return NS_OK;
}

View File

@ -88,8 +88,10 @@ ArchiveRequest::Run()
// Register this request to the reader.
// When the reader is ready to return data, a 'Ready()' will be called
nsresult rv = mArchiveReader->RegisterRequest(this);
if (NS_FAILED(rv))
FireError(rv);
if (NS_FAILED(rv)) {
bool allowDefault;
FireError(rv, &allowDefault);
}
}
void
@ -109,8 +111,9 @@ nsresult
ArchiveRequest::ReaderReady(nsTArray<nsCOMPtr<nsIDOMFile> >& aFileList,
nsresult aStatus)
{
bool allowDefault;
if (aStatus != NS_OK) {
FireError(aStatus);
FireError(aStatus, &allowDefault);
return NS_OK;
}
@ -148,10 +151,10 @@ ArchiveRequest::ReaderReady(nsTArray<nsCOMPtr<nsIDOMFile> >& aFileList,
}
if (NS_SUCCEEDED(rv)) {
FireSuccess(result);
FireSuccess(result, &allowDefault);
}
else {
FireError(rv);
FireError(rv, &allowDefault);
}
return NS_OK;

View File

@ -62,8 +62,9 @@ FileRequest::NotifyHelperCompleted(FileHelper* aFileHelper)
nsresult rv = aFileHelper->mResultCode;
// If the request failed then fire error event and return.
bool allowDefault;
if (NS_FAILED(rv)) {
FireError(rv);
FireError(rv, &allowDefault);
return NS_OK;
}
@ -93,10 +94,10 @@ FileRequest::NotifyHelperCompleted(FileHelper* aFileHelper)
}
if (NS_SUCCEEDED(rv)) {
FireSuccess(result);
FireSuccess(result, &allowDefault);
}
else {
FireError(rv);
FireError(rv, &allowDefault);
}
return NS_OK;