From 48eba85f08f59f9eadef094941a57c7b6b31f98e Mon Sep 17 00:00:00 2001 From: Wes Johnston Date: Mon, 6 Aug 2012 15:26:02 -0700 Subject: [PATCH] Bug 780718 - Return false from DOMRequestService is preventDefault was called on events. r=sicking --- dom/base/DOMRequest.cpp | 30 +++++++++++-------- dom/base/DOMRequest.h | 9 +++--- dom/base/nsIDOMDOMRequest.idl | 6 ++-- dom/base/test/test_domrequest.html | 14 +++++++-- .../DeviceStorageRequestChild.cpp | 9 ++++-- dom/devicestorage/nsDeviceStorage.cpp | 9 ++++-- dom/file/ArchiveRequest.cpp | 13 ++++---- dom/file/FileRequest.cpp | 7 +++-- 8 files changed, 61 insertions(+), 36 deletions(-) diff --git a/dom/base/DOMRequest.cpp b/dom/base/DOMRequest.cpp index 7dcf3d41761..5531517e508 100644 --- a/dom/base/DOMRequest.cpp +++ b/dom/base/DOMRequest.cpp @@ -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(aRequest)->FireSuccess(aResult); + static_cast(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(aRequest)->FireError(aError); + static_cast(aRequest)->FireError(aError, aDefaultActionEnabled); return NS_OK; } diff --git a/dom/base/DOMRequest.h b/dom/base/DOMRequest.h index 74aca2687f8..b02555b431c 100644 --- a/dom/base/DOMRequest.h +++ b/dom/base/DOMRequest.h @@ -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(); diff --git a/dom/base/nsIDOMDOMRequest.idl b/dom/base/nsIDOMDOMRequest.idl index b4498633353..5a8b5ad72a0 100644 --- a/dom/base/nsIDOMDOMRequest.idl +++ b/dom/base/nsIDOMDOMRequest.idl @@ -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); }; diff --git a/dom/base/test/test_domrequest.html b/dom/base/test/test_domrequest.html index 1f2019efdcd..ad5933a92b2 100644 --- a/dom/base/test/test_domrequest.html +++ b/dom/base/test/test_domrequest.html @@ -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"); + diff --git a/dom/devicestorage/DeviceStorageRequestChild.cpp b/dom/devicestorage/DeviceStorageRequestChild.cpp index 996592f9de8..b072f141357 100644 --- a/dom/devicestorage/DeviceStorageRequestChild.cpp +++ b/dom/devicestorage/DeviceStorageRequestChild.cpp @@ -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; } diff --git a/dom/devicestorage/nsDeviceStorage.cpp b/dom/devicestorage/nsDeviceStorage.cpp index 6f0cc549824..96ecdeffc48 100644 --- a/dom/devicestorage/nsDeviceStorage.cpp +++ b/dom/devicestorage/nsDeviceStorage.cpp @@ -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; } diff --git a/dom/file/ArchiveRequest.cpp b/dom/file/ArchiveRequest.cpp index 43b5734c426..ef30eb0520e 100644 --- a/dom/file/ArchiveRequest.cpp +++ b/dom/file/ArchiveRequest.cpp @@ -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 >& aFileList, nsresult aStatus) { + bool allowDefault; if (aStatus != NS_OK) { - FireError(aStatus); + FireError(aStatus, &allowDefault); return NS_OK; } @@ -148,10 +151,10 @@ ArchiveRequest::ReaderReady(nsTArray >& aFileList, } if (NS_SUCCEEDED(rv)) { - FireSuccess(result); + FireSuccess(result, &allowDefault); } else { - FireError(rv); + FireError(rv, &allowDefault); } return NS_OK; diff --git a/dom/file/FileRequest.cpp b/dom/file/FileRequest.cpp index 8b626fc51f8..cdd295d077f 100644 --- a/dom/file/FileRequest.cpp +++ b/dom/file/FileRequest.cpp @@ -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;