зеркало из https://github.com/mozilla/gecko-dev.git
Backout c41ceb365f00, 626abc356c25, and b756cab77bac (bug 839838) for non-unified build bustage on a CLOSED TREE
This commit is contained in:
Родитель
914394a0f9
Коммит
29e674ec77
|
@ -43,11 +43,6 @@ protected:
|
|||
|
||||
private:
|
||||
DOMCursor() MOZ_DELETE;
|
||||
// Calling Then() on DOMCursor is a mistake, since the DOMCursor object
|
||||
// should not have a .then() method from JS' point of view.
|
||||
already_AddRefed<mozilla::dom::Promise>
|
||||
Then(JSContext* aCx, AnyCallback* aResolveCallback,
|
||||
AnyCallback* aRejectCallback, ErrorResult& aRv) MOZ_DELETE;
|
||||
|
||||
nsCOMPtr<nsICursorContinueCallback> mCallback;
|
||||
bool mFinished;
|
||||
|
|
|
@ -10,15 +10,11 @@
|
|||
#include "nsThreadUtils.h"
|
||||
#include "DOMCursor.h"
|
||||
#include "nsIDOMEvent.h"
|
||||
#include "mozilla/dom/Promise.h"
|
||||
#include "mozilla/dom/ScriptSettings.h"
|
||||
|
||||
using mozilla::dom::AnyCallback;
|
||||
using mozilla::dom::DOMError;
|
||||
using mozilla::dom::DOMRequest;
|
||||
using mozilla::dom::DOMRequestService;
|
||||
using mozilla::dom::DOMCursor;
|
||||
using mozilla::dom::Promise;
|
||||
using mozilla::AutoSafeJSContext;
|
||||
|
||||
DOMRequest::DOMRequest(nsPIDOMWindow* aWindow)
|
||||
|
@ -29,24 +25,16 @@ DOMRequest::DOMRequest(nsPIDOMWindow* aWindow)
|
|||
{
|
||||
}
|
||||
|
||||
DOMRequest::~DOMRequest()
|
||||
{
|
||||
mResult.setUndefined();
|
||||
mozilla::DropJSObjects(this);
|
||||
}
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_CLASS(DOMRequest)
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(DOMRequest,
|
||||
DOMEventTargetHelper)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mError)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPromise)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(DOMRequest,
|
||||
DOMEventTargetHelper)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mError)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mPromise)
|
||||
tmp->mResult = JSVAL_VOID;
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
|
||||
|
||||
|
@ -119,10 +107,6 @@ DOMRequest::FireSuccess(JS::Handle<JS::Value> aResult)
|
|||
mResult = aResult;
|
||||
|
||||
FireEvent(NS_LITERAL_STRING("success"), false, false);
|
||||
|
||||
if (mPromise) {
|
||||
mPromise->MaybeResolve(mResult);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -136,10 +120,6 @@ DOMRequest::FireError(const nsAString& aError)
|
|||
mError = new DOMError(GetOwner(), aError);
|
||||
|
||||
FireEvent(NS_LITERAL_STRING("error"), true, true);
|
||||
|
||||
if (mPromise) {
|
||||
mPromise->MaybeRejectBrokenly(mError);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -153,10 +133,6 @@ DOMRequest::FireError(nsresult aError)
|
|||
mError = new DOMError(GetOwner(), aError);
|
||||
|
||||
FireEvent(NS_LITERAL_STRING("error"), true, true);
|
||||
|
||||
if (mPromise) {
|
||||
mPromise->MaybeRejectBrokenly(mError);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -171,10 +147,6 @@ DOMRequest::FireDetailedError(DOMError* aError)
|
|||
mError = aError;
|
||||
|
||||
FireEvent(NS_LITERAL_STRING("error"), true, true);
|
||||
|
||||
if (mPromise) {
|
||||
mPromise->MaybeRejectBrokenly(mError);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -203,31 +175,6 @@ DOMRequest::RootResultVal()
|
|||
mozilla::HoldJSObjects(this);
|
||||
}
|
||||
|
||||
already_AddRefed<Promise>
|
||||
DOMRequest::Then(JSContext* aCx, AnyCallback* aResolveCallback,
|
||||
AnyCallback* aRejectCallback, ErrorResult& aRv)
|
||||
{
|
||||
if (!mPromise) {
|
||||
mPromise = Promise::Create(DOMEventTargetHelper::GetParentObject(), aRv);
|
||||
if (aRv.Failed()) {
|
||||
return nullptr;
|
||||
}
|
||||
if (mDone) {
|
||||
// Since we create mPromise lazily, it's possible that the DOMRequest object
|
||||
// has already fired its success/error event. In that case we should
|
||||
// manually resolve/reject mPromise here. mPromise will take care of
|
||||
// calling the callbacks on |promise| as needed.
|
||||
if (mError) {
|
||||
mPromise->MaybeRejectBrokenly(mError);
|
||||
} else {
|
||||
mPromise->MaybeResolve(mResult);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return mPromise->Then(aCx, aResolveCallback, aRejectCallback, aRv);
|
||||
}
|
||||
|
||||
NS_IMPL_ISUPPORTS(DOMRequestService, nsIDOMRequestService)
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -306,7 +253,7 @@ public:
|
|||
const JS::Value& aResult)
|
||||
{
|
||||
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
|
||||
mozilla::ThreadsafeAutoSafeJSContext cx;
|
||||
AutoSafeJSContext cx;
|
||||
nsRefPtr<FireSuccessAsyncTask> asyncTask = new FireSuccessAsyncTask(cx, aRequest, aResult);
|
||||
if (NS_FAILED(NS_DispatchToMainThread(asyncTask))) {
|
||||
NS_WARNING("Failed to dispatch to main thread!");
|
||||
|
|
|
@ -18,16 +18,12 @@
|
|||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
class AnyCallback;
|
||||
class Promise;
|
||||
|
||||
class DOMRequest : public DOMEventTargetHelper,
|
||||
public nsIDOMDOMRequest
|
||||
{
|
||||
protected:
|
||||
JS::Heap<JS::Value> mResult;
|
||||
nsRefPtr<DOMError> mError;
|
||||
nsRefPtr<Promise> mPromise;
|
||||
bool mDone;
|
||||
|
||||
public:
|
||||
|
@ -71,9 +67,6 @@ public:
|
|||
IMPL_EVENT_HANDLER(success)
|
||||
IMPL_EVENT_HANDLER(error)
|
||||
|
||||
already_AddRefed<mozilla::dom::Promise>
|
||||
Then(JSContext* aCx, AnyCallback* aResolveCallback,
|
||||
AnyCallback* aRejectCallback, ErrorResult& aRv);
|
||||
|
||||
void FireSuccess(JS::Handle<JS::Value> aResult);
|
||||
void FireError(const nsAString& aError);
|
||||
|
@ -83,7 +76,11 @@ public:
|
|||
explicit DOMRequest(nsPIDOMWindow* aWindow);
|
||||
|
||||
protected:
|
||||
virtual ~DOMRequest();
|
||||
virtual ~DOMRequest()
|
||||
{
|
||||
mResult = JSVAL_VOID;
|
||||
mozilla::DropJSObjects(this);
|
||||
}
|
||||
|
||||
void FireEvent(const nsAString& aType, bool aBubble, bool aCancelable);
|
||||
|
||||
|
|
|
@ -51,7 +51,6 @@ var tests = [
|
|||
ok("readyState" in req, "cursor has readyState");
|
||||
ok("done" in req, "cursor has finished");
|
||||
ok("continue" in req, "cursor has continue");
|
||||
ok(!("then" in req), "cursor should not have a then method");
|
||||
|
||||
is(req.readyState, "pending", "readyState is pending");
|
||||
is(req.result, undefined, "result is undefined");
|
||||
|
|
|
@ -17,212 +17,59 @@
|
|||
var reqserv = SpecialPowers.getDOMRequestService();
|
||||
ok("createRequest" in reqserv, "appears to be a service");
|
||||
|
||||
function testBasics() {
|
||||
// create a request
|
||||
var req = reqserv.createRequest(window);
|
||||
ok("result" in req, "request has result");
|
||||
ok("error" in req, "request has error");
|
||||
ok("onsuccess" in req, "request has onsuccess");
|
||||
ok("onerror" in req, "request has onerror");
|
||||
ok("readyState" in req, "request has readyState");
|
||||
ok("then" in req, "request has then");
|
||||
// create a request
|
||||
var req = reqserv.createRequest(window);
|
||||
ok("result" in req, "request has result");
|
||||
ok("error" in req, "request has error");
|
||||
ok("onsuccess" in req, "request has onsuccess");
|
||||
ok("onerror" in req, "request has onerror");
|
||||
ok("readyState" in req, "request has readyState");
|
||||
|
||||
is(req.readyState, "pending", "readyState is pending");
|
||||
is(req.result, undefined, "result is undefined");
|
||||
is(req.onsuccess, null, "onsuccess is null");
|
||||
is(req.onerror, null, "onerror is null");
|
||||
is(req.readyState, "pending", "readyState is pending");
|
||||
is(req.result, undefined, "result is undefined");
|
||||
is(req.onsuccess, null, "onsuccess is null");
|
||||
is(req.onerror, null, "onerror is null");
|
||||
|
||||
runTest();
|
||||
// fire success
|
||||
var ev = null;
|
||||
req.onsuccess = function(e) {
|
||||
ev = e;
|
||||
}
|
||||
reqserv.fireSuccess(req, "my result");
|
||||
ok(ev, "got success event");
|
||||
is(ev.type, "success", "correct type during success");
|
||||
is(ev.target, req, "correct target during success");
|
||||
is(req.readyState, "done", "correct readyState after success");
|
||||
is(req.error, null, "correct error after success");
|
||||
is(req.result, "my result", "correct result after success");
|
||||
|
||||
function testSuccess() {
|
||||
// fire success
|
||||
var req = reqserv.createRequest(window);
|
||||
var ev = null;
|
||||
req.onsuccess = function(e) {
|
||||
ev = e;
|
||||
}
|
||||
var result = null;
|
||||
var promise = req.then(function(r) {
|
||||
is(r, "my result", "correct result when resolving the promise");
|
||||
result = r;
|
||||
runTest();
|
||||
}, function(e) {
|
||||
ok(false, "promise should not be rejected");
|
||||
runTest();
|
||||
});
|
||||
ok(promise instanceof Promise, "then() should return a Promise");
|
||||
reqserv.fireSuccess(req, "my result");
|
||||
ok(ev, "got success event");
|
||||
is(ev.type, "success", "correct type during success");
|
||||
is(ev.target, req, "correct target during success");
|
||||
is(req.readyState, "done", "correct readyState after success");
|
||||
is(req.error, null, "correct error after success");
|
||||
is(req.result, "my result", "correct result after success");
|
||||
is(result, null, "Promise should not be resolved synchronously");
|
||||
// fire error
|
||||
req = reqserv.createRequest(window);
|
||||
ev = null;
|
||||
req.onerror = function(e) {
|
||||
ev = e;
|
||||
}
|
||||
reqserv.fireError(req, "OhMyError");
|
||||
ok(ev, "got error event");
|
||||
is(ev.type, "error", "correct type during error");
|
||||
is(ev.target, req, "correct target during error");
|
||||
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");
|
||||
|
||||
function testError() {
|
||||
// fire error
|
||||
var req = reqserv.createRequest(window);
|
||||
var ev = null;
|
||||
req.onerror = function(e) {
|
||||
ev = e;
|
||||
}
|
||||
var error = null;
|
||||
var promise = req.then(function(r) {
|
||||
ok(false, "promise should not be resolved");
|
||||
runTest();
|
||||
}, function(e) {
|
||||
ok(e instanceof DOMError, "got error rejection");
|
||||
ok(e === req.error, "got correct error when rejecting the promise");
|
||||
error = e;
|
||||
runTest();
|
||||
});
|
||||
ok(promise instanceof Promise, "then() should return a Promise");
|
||||
reqserv.fireError(req, "OhMyError");
|
||||
ok(ev, "got error event");
|
||||
is(ev.type, "error", "correct type during error");
|
||||
is(ev.target, req, "correct target during error");
|
||||
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");
|
||||
is(error, null, "Promise should not be rejected synchronously");
|
||||
}
|
||||
|
||||
function testDetailedError() {
|
||||
// fire detailed error
|
||||
var req = reqserv.createRequest(window);
|
||||
var ev = null;
|
||||
req.onerror = function(e) {
|
||||
ev = e;
|
||||
};
|
||||
var error = null;
|
||||
var promise = req.then(function(r) {
|
||||
ok(false, "promise should not be resolved");
|
||||
runTest();
|
||||
}, function(e) {
|
||||
ok(e instanceof DOMError, "got error rejection");
|
||||
ok(e === req.error, "got correct error when rejecting the promise");
|
||||
error = e;
|
||||
runTest();
|
||||
});
|
||||
ok(promise instanceof Promise, "then() should return a Promise");
|
||||
reqserv.fireDetailedError(req, new DOMError("detailedError"));
|
||||
ok(ev, "got error event");
|
||||
is(ev.type, "error", "correct type during error");
|
||||
is(ev.target, req, "correct target during error");
|
||||
is(req.readyState, "done", "correct readyState after error");
|
||||
is(req.error.name, "detailedError", "correct error after error");
|
||||
is(req.result, undefined, "correct result after error");
|
||||
is(error, null, "Promise should not be rejected synchronously");
|
||||
}
|
||||
|
||||
function testThenAfterSuccess() {
|
||||
// fire success
|
||||
var req = reqserv.createRequest(window);
|
||||
var ev = null;
|
||||
req.onsuccess = function(e) {
|
||||
ev = e;
|
||||
}
|
||||
reqserv.fireSuccess(req, "my result");
|
||||
ok(ev, "got success event");
|
||||
is(ev.type, "success", "correct type during success");
|
||||
is(ev.target, req, "correct target during success");
|
||||
is(req.readyState, "done", "correct readyState after success");
|
||||
is(req.error, null, "correct error after success");
|
||||
is(req.result, "my result", "correct result after success");
|
||||
var result = null;
|
||||
var promise = req.then(function(r) {
|
||||
is(r, "my result", "correct result when resolving the promise");
|
||||
result = r;
|
||||
runTest();
|
||||
}, function(e) {
|
||||
ok(false, "promise should not be rejected");
|
||||
runTest();
|
||||
});
|
||||
ok(promise instanceof Promise, "then() should return a Promise");
|
||||
is(result, null, "Promise should not be resolved synchronously");
|
||||
}
|
||||
|
||||
function testThenAfterError() {
|
||||
// fire error
|
||||
var req = reqserv.createRequest(window);
|
||||
var ev = null;
|
||||
req.onerror = function(e) {
|
||||
ev = e;
|
||||
}
|
||||
reqserv.fireError(req, "OhMyError");
|
||||
ok(ev, "got error event");
|
||||
is(ev.type, "error", "correct type during error");
|
||||
is(ev.target, req, "correct target during error");
|
||||
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");
|
||||
var error = null;
|
||||
var promise = req.then(function(r) {
|
||||
ok(false, "promise should not be resolved");
|
||||
runTest();
|
||||
}, function(e) {
|
||||
ok(e instanceof DOMError, "got error rejection");
|
||||
ok(e === req.error, "got correct error when rejecting the promise");
|
||||
error = e;
|
||||
runTest();
|
||||
});
|
||||
ok(promise instanceof Promise, "then() should return a Promise");
|
||||
is(error, null, "Promise should not be rejected synchronously");
|
||||
}
|
||||
|
||||
function testDetailedError() {
|
||||
// fire detailed error
|
||||
var req = reqserv.createRequest(window);
|
||||
var ev = null;
|
||||
req.onerror = function(e) {
|
||||
ev = e;
|
||||
};
|
||||
var error = null;
|
||||
var promise = req.then(function(r) {
|
||||
ok(false, "promise should not be resolved");
|
||||
runTest();
|
||||
}, function(e) {
|
||||
ok(e instanceof DOMError, "got error rejection");
|
||||
ok(e === req.error, "got correct error when rejecting the promise");
|
||||
error = e;
|
||||
runTest();
|
||||
});
|
||||
ok(promise instanceof Promise, "then() should return a Promise");
|
||||
reqserv.fireDetailedError(req, new DOMError("detailedError"));
|
||||
ok(ev, "got error event");
|
||||
is(ev.type, "error", "correct type during error");
|
||||
is(ev.target, req, "correct target during error");
|
||||
is(req.readyState, "done", "correct readyState after error");
|
||||
is(req.error.name, "detailedError", "correct error after error");
|
||||
is(req.result, undefined, "correct result after error");
|
||||
is(error, null, "Promise should not be rejected synchronously");
|
||||
}
|
||||
|
||||
var tests = [
|
||||
testBasics,
|
||||
testSuccess,
|
||||
testError,
|
||||
testDetailedError,
|
||||
testThenAfterSuccess,
|
||||
testThenAfterError,
|
||||
];
|
||||
|
||||
function runTest() {
|
||||
if (!tests.length) {
|
||||
SimpleTest.finish();
|
||||
return;
|
||||
}
|
||||
|
||||
var test = tests.shift();
|
||||
test();
|
||||
}
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
runTest();
|
||||
|
||||
// fire detailed error
|
||||
req = reqserv.createRequest(window);
|
||||
ev = null;
|
||||
req.onerror = function(e) {
|
||||
ev = e;
|
||||
};
|
||||
reqserv.fireDetailedError(req, new DOMError("detailedError"));
|
||||
ok(ev, "got error event");
|
||||
is(ev.type, "error", "correct type during error");
|
||||
is(ev.target, req, "correct target during error");
|
||||
is(req.readyState, "done", "correct readyState after error");
|
||||
is(req.error.name, "detailedError", "correct error after error");
|
||||
is(req.result, undefined, "correct result after error");
|
||||
</script>
|
||||
</pre>
|
||||
</body>
|
||||
|
|
|
@ -352,10 +352,6 @@ DOMInterfaces = {
|
|||
'headerFile': 'mozilla/dom/DOMRect.h',
|
||||
},
|
||||
|
||||
'DOMRequest': {
|
||||
'implicitJSContext': [ 'then' ],
|
||||
},
|
||||
|
||||
'DOMSettableTokenList': {
|
||||
'nativeType': 'nsDOMSettableTokenList',
|
||||
},
|
||||
|
|
|
@ -236,24 +236,6 @@ ToJSValue(JSContext* aCx, JS::Handle<JS::Value> aArgument,
|
|||
return MaybeWrapValue(aCx, aValue);
|
||||
}
|
||||
|
||||
// Accept existing JS values on the Heap (which may not be same-compartment with us
|
||||
inline bool
|
||||
ToJSValue(JSContext* aCx, JS::Heap<JS::Value> aArgument,
|
||||
JS::MutableHandle<JS::Value> aValue)
|
||||
{
|
||||
aValue.set(aArgument);
|
||||
return MaybeWrapValue(aCx, aValue);
|
||||
}
|
||||
|
||||
// Accept existing rooted JS values (which may not be same-compartment with us
|
||||
inline bool
|
||||
ToJSValue(JSContext* aCx, JS::Rooted<JS::Value> aArgument,
|
||||
JS::MutableHandle<JS::Value> aValue)
|
||||
{
|
||||
aValue.set(aArgument);
|
||||
return MaybeWrapValue(aCx, aValue);
|
||||
}
|
||||
|
||||
// Accept nsresult, for use in rejections, and create an XPCOM
|
||||
// exception object representing that nsresult.
|
||||
bool
|
||||
|
|
|
@ -3,10 +3,8 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
interface DOMCursor : EventTarget {
|
||||
interface DOMCursor : DOMRequest {
|
||||
readonly attribute boolean done;
|
||||
[Throws]
|
||||
void continue();
|
||||
};
|
||||
|
||||
DOMCursor implements DOMRequestShared;
|
||||
|
|
|
@ -5,8 +5,7 @@
|
|||
|
||||
enum DOMRequestReadyState { "pending", "done" };
|
||||
|
||||
[NoInterfaceObject]
|
||||
interface DOMRequestShared {
|
||||
interface DOMRequest : EventTarget {
|
||||
readonly attribute DOMRequestReadyState readyState;
|
||||
|
||||
readonly attribute any result;
|
||||
|
@ -15,13 +14,3 @@ interface DOMRequestShared {
|
|||
attribute EventHandler onsuccess;
|
||||
attribute EventHandler onerror;
|
||||
};
|
||||
|
||||
interface DOMRequest : EventTarget {
|
||||
// The [TreatNonCallableAsNull] annotation is required since then() should do
|
||||
// nothing instead of throwing errors when non-callable arguments are passed.
|
||||
[NewObject, Throws]
|
||||
Promise<any> then([TreatNonCallableAsNull] optional AnyCallback? fulfillCallback = null,
|
||||
[TreatNonCallableAsNull] optional AnyCallback? rejectCallback = null);
|
||||
};
|
||||
|
||||
DOMRequest implements DOMRequestShared;
|
||||
|
|
|
@ -220,7 +220,7 @@ class Heap : public js::HeapBase<T>
|
|||
* that will be used for both lvalue and rvalue copies, so we can simply
|
||||
* omit the rvalue variant.
|
||||
*/
|
||||
Heap(const Heap<T> &p) { init(p.ptr); }
|
||||
explicit Heap(const Heap<T> &p) { init(p.ptr); }
|
||||
|
||||
~Heap() {
|
||||
if (js::GCMethods<T>::needsPostBarrier(ptr))
|
||||
|
|
Загрузка…
Ссылка в новой задаче