Bug 876238 - Convert DeviceAcceleration and DeviceRotationRate to WebIDL bindings. r=smaug

This commit is contained in:
Masatoshi Kimura 2014-01-02 07:52:47 +09:00
parent 9a53357c9c
commit 9de4f301b4
13 changed files with 343 additions and 283 deletions

View File

@ -5,7 +5,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsDOMDeviceMotionEvent.h"
#include "nsDOMClassInfoID.h"
#include "nsContentUtils.h"
using namespace mozilla;
using namespace mozilla::dom;
@ -19,82 +19,73 @@ NS_IMPL_ADDREF_INHERITED(nsDOMDeviceMotionEvent, nsDOMEvent)
NS_IMPL_RELEASE_INHERITED(nsDOMDeviceMotionEvent, nsDOMEvent)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(nsDOMDeviceMotionEvent)
NS_INTERFACE_MAP_ENTRY(nsIDOMDeviceMotionEvent)
NS_INTERFACE_MAP_END_INHERITING(nsDOMEvent)
NS_IMETHODIMP
nsDOMDeviceMotionEvent::InitDeviceMotionEvent(const nsAString & aEventTypeArg,
bool aCanBubbleArg,
bool aCancelableArg,
nsIDOMDeviceAcceleration* aAcceleration,
nsIDOMDeviceAcceleration* aAccelerationIncludingGravity,
nsIDOMDeviceRotationRate* aRotationRate,
double aInterval)
{
nsresult rv = nsDOMEvent::InitEvent(aEventTypeArg, aCanBubbleArg, aCancelableArg);
NS_ENSURE_SUCCESS(rv, rv);
mAcceleration = aAcceleration;
mAccelerationIncludingGravity = aAccelerationIncludingGravity;
mRotationRate = aRotationRate;
mInterval = aInterval;
return NS_OK;
}
void
nsDOMDeviceMotionEvent::InitDeviceMotionEvent(const nsAString& aType,
bool aCanBubble,
bool aCancelable,
nsIDOMDeviceAcceleration* aAcceleration,
nsIDOMDeviceAcceleration* aAccelerationIncludingGravity,
nsIDOMDeviceRotationRate* aRotationRate,
double aInterval,
const DeviceAccelerationInit& aAcceleration,
const DeviceAccelerationInit& aAccelerationIncludingGravity,
const DeviceRotationRateInit& aRotationRate,
Nullable<double> aInterval,
ErrorResult& aRv)
{
aRv = InitDeviceMotionEvent(aType,
aCanBubble,
aCancelable,
aAcceleration,
aAccelerationIncludingGravity,
aRotationRate,
aInterval);
aRv = nsDOMEvent::InitEvent(aType, aCanBubble, aCancelable);
if (aRv.Failed()) {
return;
}
mAcceleration = new nsDOMDeviceAcceleration(this, aAcceleration.mX,
aAcceleration.mY,
aAcceleration.mZ);
mAccelerationIncludingGravity =
new nsDOMDeviceAcceleration(this, aAccelerationIncludingGravity.mX,
aAccelerationIncludingGravity.mY,
aAccelerationIncludingGravity.mZ);
mRotationRate = new nsDOMDeviceRotationRate(this, aRotationRate.mAlpha,
aRotationRate.mBeta,
aRotationRate.mGamma);
mInterval = aInterval;
}
NS_IMETHODIMP
nsDOMDeviceMotionEvent::GetAcceleration(nsIDOMDeviceAcceleration **aAcceleration)
already_AddRefed<nsDOMDeviceMotionEvent>
nsDOMDeviceMotionEvent::Constructor(const GlobalObject& aGlobal,
const nsAString& aType,
const DeviceMotionEventInit& aEventInitDict,
ErrorResult& aRv)
{
NS_ENSURE_ARG_POINTER(aAcceleration);
nsCOMPtr<mozilla::dom::EventTarget> t =
do_QueryInterface(aGlobal.GetAsSupports());
nsRefPtr<nsDOMDeviceMotionEvent> e =
new nsDOMDeviceMotionEvent(t, nullptr, nullptr);
aRv = e->InitEvent(aType, aEventInitDict.mBubbles, aEventInitDict.mCancelable);
if (aRv.Failed()) {
return nullptr;
}
bool trusted = e->Init(t);
NS_IF_ADDREF(*aAcceleration = GetAcceleration());
return NS_OK;
}
e->mAcceleration = new nsDOMDeviceAcceleration(e,
aEventInitDict.mAcceleration.mX,
aEventInitDict.mAcceleration.mY,
aEventInitDict.mAcceleration.mZ);
NS_IMETHODIMP
nsDOMDeviceMotionEvent::GetAccelerationIncludingGravity(nsIDOMDeviceAcceleration **aAccelerationIncludingGravity)
{
NS_ENSURE_ARG_POINTER(aAccelerationIncludingGravity);
e->mAccelerationIncludingGravity = new nsDOMDeviceAcceleration(e,
aEventInitDict.mAccelerationIncludingGravity.mX,
aEventInitDict.mAccelerationIncludingGravity.mY,
aEventInitDict.mAccelerationIncludingGravity.mZ);
NS_IF_ADDREF(*aAccelerationIncludingGravity =
GetAccelerationIncludingGravity());
return NS_OK;
}
e->mRotationRate = new nsDOMDeviceRotationRate(e,
aEventInitDict.mRotationRate.mAlpha,
aEventInitDict.mRotationRate.mBeta,
aEventInitDict.mRotationRate.mGamma);
NS_IMETHODIMP
nsDOMDeviceMotionEvent::GetRotationRate(nsIDOMDeviceRotationRate **aRotationRate)
{
NS_ENSURE_ARG_POINTER(aRotationRate);
e->mInterval = aEventInitDict.mInterval;
e->SetTrusted(trusted);
NS_IF_ADDREF(*aRotationRate = GetRotationRate());
return NS_OK;
}
NS_IMETHODIMP
nsDOMDeviceMotionEvent::GetInterval(double *aInterval)
{
NS_ENSURE_ARG_POINTER(aInterval);
*aInterval = Interval();
return NS_OK;
return e.forget();
}
@ -112,91 +103,39 @@ NS_NewDOMDeviceMotionEvent(nsIDOMEvent** aInstancePtrResult,
}
DOMCI_DATA(DeviceAcceleration, nsDOMDeviceAcceleration)
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_1(nsDOMDeviceAcceleration, mOwner)
NS_INTERFACE_MAP_BEGIN(nsDOMDeviceAcceleration)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMDeviceAcceleration)
NS_INTERFACE_MAP_ENTRY(nsIDOMDeviceAcceleration)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(DeviceAcceleration)
NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(nsDOMDeviceAcceleration, AddRef)
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(nsDOMDeviceAcceleration, Release)
NS_IMPL_ADDREF(nsDOMDeviceAcceleration)
NS_IMPL_RELEASE(nsDOMDeviceAcceleration)
nsDOMDeviceAcceleration::nsDOMDeviceAcceleration(double aX, double aY, double aZ)
: mX(aX), mY(aY), mZ(aZ)
nsDOMDeviceAcceleration::nsDOMDeviceAcceleration(nsDOMDeviceMotionEvent* aOwner,
Nullable<double> aX,
Nullable<double> aY,
Nullable<double> aZ)
: mOwner(aOwner), mX(aX), mY(aY), mZ(aZ)
{
SetIsDOMBinding();
}
nsDOMDeviceAcceleration::~nsDOMDeviceAcceleration()
{
}
NS_IMETHODIMP
nsDOMDeviceAcceleration::GetX(double *aX)
{
NS_ENSURE_ARG_POINTER(aX);
*aX = mX;
return NS_OK;
}
NS_IMETHODIMP
nsDOMDeviceAcceleration::GetY(double *aY)
{
NS_ENSURE_ARG_POINTER(aY);
*aY = mY;
return NS_OK;
}
NS_IMETHODIMP
nsDOMDeviceAcceleration::GetZ(double *aZ)
{
NS_ENSURE_ARG_POINTER(aZ);
*aZ = mZ;
return NS_OK;
}
DOMCI_DATA(DeviceRotationRate, nsDOMDeviceRotationRate)
NS_INTERFACE_MAP_BEGIN(nsDOMDeviceRotationRate)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMDeviceRotationRate)
NS_INTERFACE_MAP_ENTRY(nsIDOMDeviceRotationRate)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(DeviceRotationRate)
NS_INTERFACE_MAP_END
NS_IMPL_ADDREF(nsDOMDeviceRotationRate)
NS_IMPL_RELEASE(nsDOMDeviceRotationRate)
nsDOMDeviceRotationRate::nsDOMDeviceRotationRate(double aAlpha, double aBeta, double aGamma)
: mAlpha(aAlpha), mBeta(aBeta), mGamma(aGamma)
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_1(nsDOMDeviceRotationRate, mOwner)
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(nsDOMDeviceRotationRate, AddRef)
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(nsDOMDeviceRotationRate, Release)
nsDOMDeviceRotationRate::nsDOMDeviceRotationRate(nsDOMDeviceMotionEvent* aOwner,
Nullable<double> aAlpha,
Nullable<double> aBeta,
Nullable<double> aGamma)
: mOwner(aOwner), mAlpha(aAlpha), mBeta(aBeta), mGamma(aGamma)
{
SetIsDOMBinding();
}
nsDOMDeviceRotationRate::~nsDOMDeviceRotationRate()
{
}
NS_IMETHODIMP
nsDOMDeviceRotationRate::GetAlpha(double *aAlpha)
{
NS_ENSURE_ARG_POINTER(aAlpha);
*aAlpha = mAlpha;
return NS_OK;
}
NS_IMETHODIMP
nsDOMDeviceRotationRate::GetBeta(double *aBeta)
{
NS_ENSURE_ARG_POINTER(aBeta);
*aBeta = mBeta;
return NS_OK;
}
NS_IMETHODIMP
nsDOMDeviceRotationRate::GetGamma(double *aGamma)
{
NS_ENSURE_ARG_POINTER(aGamma);
*aGamma = mGamma;
return NS_OK;
}

View File

@ -5,44 +5,90 @@
#ifndef nsDOMDeviceMotionEvent_h__
#define nsDOMDeviceMotionEvent_h__
#include "nsIDOMDeviceMotionEvent.h"
#include "nsDOMEvent.h"
#include "mozilla/Attributes.h"
#include "mozilla/dom/DeviceMotionEventBinding.h"
class nsDOMDeviceRotationRate MOZ_FINAL : public nsIDOMDeviceRotationRate
class nsDOMDeviceRotationRate MOZ_FINAL : public nsWrapperCache
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIDOMDEVICEROTATIONRATE
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(nsDOMDeviceRotationRate)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(nsDOMDeviceRotationRate)
nsDOMDeviceRotationRate(double aAlpha, double aBeta, double aGamma);
nsDOMDeviceRotationRate(nsDOMDeviceMotionEvent* aOwner,
Nullable<double> aAlpha, Nullable<double> aBeta,
Nullable<double> aGamma);
nsDOMDeviceRotationRate(double aAlpha, double aBeta, double aGamma)
{
nsDOMDeviceRotationRate(nullptr, Nullable<double>(aAlpha),
Nullable<double>(aBeta), Nullable<double>(aGamma));
}
nsDOMDeviceMotionEvent* GetParentObject() const
{
return mOwner;
}
virtual JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aScope) MOZ_OVERRIDE
{
return mozilla::dom::DeviceRotationRateBinding::Wrap(aCx, aScope, this);
}
Nullable<double> GetAlpha() const { return mAlpha; }
Nullable<double> GetBeta() const { return mBeta; }
Nullable<double> GetGamma() const { return mGamma; }
private:
~nsDOMDeviceRotationRate();
protected:
double mAlpha, mBeta, mGamma;
nsRefPtr<nsDOMDeviceMotionEvent> mOwner;
Nullable<double> mAlpha, mBeta, mGamma;
};
class nsDOMDeviceAcceleration MOZ_FINAL : public nsIDOMDeviceAcceleration
class nsDOMDeviceAcceleration MOZ_FINAL : public nsWrapperCache
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIDOMDEVICEACCELERATION
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(nsDOMDeviceAcceleration)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(nsDOMDeviceAcceleration)
nsDOMDeviceAcceleration(double aX, double aY, double aZ);
nsDOMDeviceAcceleration(nsDOMDeviceMotionEvent* aOwner,
Nullable<double> aX, Nullable<double> aY,
Nullable<double> aZ);
nsDOMDeviceAcceleration(double aX, double aY, double aZ)
{
nsDOMDeviceAcceleration(nullptr, Nullable<double>(aX),
Nullable<double>(aY), Nullable<double>(aZ));
}
nsDOMDeviceMotionEvent* GetParentObject() const
{
return mOwner;
}
virtual JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aScope) MOZ_OVERRIDE
{
return mozilla::dom::DeviceAccelerationBinding::Wrap(aCx, aScope, this);
}
Nullable<double> GetX() const { return mX; }
Nullable<double> GetY() const { return mY; }
Nullable<double> GetZ() const { return mZ; }
private:
~nsDOMDeviceAcceleration();
protected:
double mX, mY, mZ;
nsRefPtr<nsDOMDeviceMotionEvent> mOwner;
Nullable<double> mX, mY, mZ;
};
class nsDOMDeviceMotionEvent MOZ_FINAL : public nsDOMEvent,
public nsIDOMDeviceMotionEvent
class nsDOMDeviceMotionEvent MOZ_FINAL : public nsDOMEvent
{
typedef mozilla::dom::DeviceAccelerationInit DeviceAccelerationInit;
typedef mozilla::dom::DeviceRotationRateInit DeviceRotationRateInit;
public:
nsDOMDeviceMotionEvent(mozilla::dom::EventTarget* aOwner,
@ -57,9 +103,6 @@ public:
// Forward to nsDOMEvent
NS_FORWARD_TO_NSDOMEVENT
// nsIDOMDeviceMotionEvent Interface
NS_DECL_NSIDOMDEVICEMOTIONEVENT
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsDOMDeviceMotionEvent, nsDOMEvent)
virtual JSObject* WrapObject(JSContext* aCx,
@ -68,22 +111,22 @@ public:
return mozilla::dom::DeviceMotionEventBinding::Wrap(aCx, aScope, this);
}
nsIDOMDeviceAcceleration* GetAcceleration()
nsDOMDeviceAcceleration* GetAcceleration() const
{
return mAcceleration;
}
nsIDOMDeviceAcceleration* GetAccelerationIncludingGravity()
nsDOMDeviceAcceleration* GetAccelerationIncludingGravity() const
{
return mAccelerationIncludingGravity;
}
nsIDOMDeviceRotationRate* GetRotationRate()
nsDOMDeviceRotationRate* GetRotationRate() const
{
return mRotationRate;
}
double Interval() const
Nullable<double> GetInterval() const
{
return mInterval;
}
@ -91,16 +134,23 @@ public:
void InitDeviceMotionEvent(const nsAString& aType,
bool aCanBubble,
bool aCancelable,
nsIDOMDeviceAcceleration* aAcceleration,
nsIDOMDeviceAcceleration* aAccelerationIncludingGravity,
nsIDOMDeviceRotationRate* aRotationRate,
double aInterval,
const DeviceAccelerationInit& aAcceleration,
const DeviceAccelerationInit& aAccelerationIncludingGravity,
const DeviceRotationRateInit& aRotationRate,
Nullable<double> aInterval,
mozilla::ErrorResult& aRv);
nsCOMPtr<nsIDOMDeviceAcceleration> mAcceleration;
nsCOMPtr<nsIDOMDeviceAcceleration> mAccelerationIncludingGravity;
nsCOMPtr<nsIDOMDeviceRotationRate> mRotationRate;
double mInterval;
static already_AddRefed<nsDOMDeviceMotionEvent>
Constructor(const mozilla::dom::GlobalObject& aGlobal,
const nsAString& aType,
const mozilla::dom::DeviceMotionEventInit& aEventInitDict,
mozilla::ErrorResult& aRv);
protected:
nsRefPtr<nsDOMDeviceAcceleration> mAcceleration;
nsRefPtr<nsDOMDeviceAcceleration> mAccelerationIncludingGravity;
nsRefPtr<nsDOMDeviceRotationRate> mRotationRate;
Nullable<double> mInterval;
};
#endif

View File

@ -23,39 +23,113 @@ SimpleTest.waitForExplicitFinish();
var checkMotion = function(event) {
window.removeEventListener("devicemotion", checkMotion, true);
is(event.acceleration.x, 1.5);
is(event.acceleration.y, 2.5);
is(event.acceleration.z, 3.5);
is(event.accelerationIncludingGravity.x, 4.5);
is(event.accelerationIncludingGravity.y, 5.5);
is(event.accelerationIncludingGravity.z, 6.5);
is(event.rotationRate.alpha, 7.5);
is(event.rotationRate.beta, 8.5);
is(event.rotationRate.gamma, 9.5);
is(event.acceleration.x, 1.5, "acceleration.x");
is(event.acceleration.y, 2.5, "acceleration.y");
is(event.acceleration.z, 3.5, "acceleration.z");
is(event.accelerationIncludingGravity.x, 4.5, "accelerationIncludingGravity.x");
is(event.accelerationIncludingGravity.y, 5.5, "accelerationIncludingGravity.y");
is(event.accelerationIncludingGravity.z, 6.5, "accelerationIncludingGravity.z");
is(event.rotationRate.alpha, 7.5, "rotationRate.alpha");
is(event.rotationRate.beta, 8.5, "rotationRate.beta");
is(event.rotationRate.gamma, 9.5, "rotationRate.gamma");
is(event.interval, 0.5, "interval");
var e = document.createEvent("DeviceMotionEvent");
e.initDeviceMotionEvent('devicemotion', true, true,
null, null, null, 0);
is(e.acceleration, null);
is(e.accelerationIncludingGravity, null);
is(e.rotationRate, null);
null, null, null, null);
is(e.acceleration.x, null, "acceleration.x");
is(e.acceleration.y, null, "acceleration.y");
is(e.acceleration.z, null, "acceleration.z");
is(e.accelerationIncludingGravity.x, null, "accelerationIncludingGravity.x");
is(e.accelerationIncludingGravity.y, null, "accelerationIncludingGravity.y");
is(e.accelerationIncludingGravity.z, null, "accelerationIncludingGravity.z");
is(e.rotationRate.alpha, null, "rotationRate.alpha");
is(e.rotationRate.beta, null, "rotationRate.beta");
is(e.rotationRate.gamma, null, "rotationRate.gamma");
is(e.interval, null, "interval");
e.initDeviceMotionEvent('devicemotion', true, true,
{}, {}, {}, 0);
is(e.acceleration.x, null, "acceleration.x");
is(e.acceleration.y, null, "acceleration.y");
is(e.acceleration.z, null, "acceleration.z");
is(e.accelerationIncludingGravity.x, null, "accelerationIncludingGravity.x");
is(e.accelerationIncludingGravity.y, null, "accelerationIncludingGravity.y");
is(e.accelerationIncludingGravity.z, null, "accelerationIncludingGravity.z");
is(e.rotationRate.alpha, null, "rotationRate.alpha");
is(e.rotationRate.beta, null, "rotationRate.beta");
is(e.rotationRate.gamma, null, "rotationRate.gamma");
is(e.interval, 0, "interval");
ok(isNaN(e.acceleration.x));
ok(isNaN(e.acceleration.y));
ok(isNaN(e.acceleration.z));
window.addEventListener("devicemotion", checkMotionCtor, true);
ok(isNaN(e.accelerationIncludingGravity.x));
ok(isNaN(e.accelerationIncludingGravity.y));
ok(isNaN(e.accelerationIncludingGravity.z));
event = new DeviceMotionEvent('devicemotion', {
bubbles: true, cancelable: true,
acceleration: {x:1.5,y:2.5,z:3.5},
accelerationIncludingGravity: {x:4.5,y:5.5,z:6.5},
rotationRate: {alpha:7.5,beta:8.5,gamma:9.5},
interval: 0.5
});
window.dispatchEvent(event);
};
ok(isNaN(e.rotationRate.alpha));
ok(isNaN(e.rotationRate.beta));
ok(isNaN(e.rotationRate.gamma));
var checkMotionCtor = function(event) {
window.removeEventListener("devicemotion", checkMotionCtor, true);
is(event.acceleration.x, 1.5, "acceleration.x");
is(event.acceleration.y, 2.5, "acceleration.y");
is(event.acceleration.z, 3.5, "acceleration.z");
is(event.accelerationIncludingGravity.x, 4.5, "accelerationIncludingGravity.x");
is(event.accelerationIncludingGravity.y, 5.5, "accelerationIncludingGravity.y");
is(event.accelerationIncludingGravity.z, 6.5, "accelerationIncludingGravity.z");
is(event.rotationRate.alpha, 7.5, "rotationRate.alpha");
is(event.rotationRate.beta, 8.5, "rotationRate.beta");
is(event.rotationRate.gamma, 9.5, "rotationRate.gamma");
is(event.interval, 0.5, "interval");
var e = new DeviceMotionEvent('devicemotion');
is(e.acceleration.x, null, "acceleration.x");
is(e.acceleration.y, null, "acceleration.y");
is(e.acceleration.z, null, "acceleration.z");
is(e.accelerationIncludingGravity.x, null, "accelerationIncludingGravity.x");
is(e.accelerationIncludingGravity.y, null, "accelerationIncludingGravity.y");
is(e.accelerationIncludingGravity.z, null, "accelerationIncludingGravity.z");
is(e.rotationRate.alpha, null, "rotationRate.alpha");
is(e.rotationRate.beta, null, "rotationRate.beta");
is(e.rotationRate.gamma, null, "rotationRate.gamma");
is(e.interval, null, "interval");
e = new DeviceMotionEvent('devicemotion', {
bubbles: true, cancelable: true,
acceleration: null, accelerationIncludingGravity: null,
rotationRate: null, interval: null
});
is(e.acceleration.x, null, "acceleration.x");
is(e.acceleration.y, null, "acceleration.y");
is(e.acceleration.z, null, "acceleration.z");
is(e.accelerationIncludingGravity.x, null, "accelerationIncludingGravity.x");
is(e.accelerationIncludingGravity.y, null, "accelerationIncludingGravity.y");
is(e.accelerationIncludingGravity.z, null, "accelerationIncludingGravity.z");
is(e.rotationRate.alpha, null, "rotationRate.alpha");
is(e.rotationRate.beta, null, "rotationRate.beta");
is(e.rotationRate.gamma, null, "rotationRate.gamma");
is(e.interval, null, "interval");
e = new DeviceMotionEvent('devicemotion', {
bubbles: true, cancelable: true,
acceleration: {}, accelerationIncludingGravity: {},
rotationRate: {}, interval: 0
});
is(e.acceleration.x, null, "acceleration.x");
is(e.acceleration.y, null, "acceleration.y");
is(e.acceleration.z, null, "acceleration.z");
is(e.accelerationIncludingGravity.x, null, "accelerationIncludingGravity.x");
is(e.accelerationIncludingGravity.y, null, "accelerationIncludingGravity.y");
is(e.accelerationIncludingGravity.z, null, "accelerationIncludingGravity.z");
is(e.rotationRate.alpha, null, "rotationRate.alpha");
is(e.rotationRate.beta, null, "rotationRate.beta");
is(e.rotationRate.gamma, null, "rotationRate.gamma");
is(e.interval, 0, "interval");
SimpleTest.finish();
};
@ -70,7 +144,7 @@ event.initDeviceMotionEvent('devicemotion', true, true,
{x:1.5,y:2.5,z:3.5},
{x:4.5,y:5.5,z:6.5},
{alpha:7.5,beta:8.5,gamma:9.5},
0);
0.5);
window.dispatchEvent(event);
</script>

View File

@ -109,7 +109,6 @@
#include "nsIDOMCSSPageRule.h"
#include "nsIDOMCSSStyleRule.h"
#include "nsIDOMCSSStyleSheet.h"
#include "nsIDOMDeviceMotionEvent.h" //nsIDOMDeviceAcceleration
#include "nsIDOMXULCommandDispatcher.h"
#ifndef MOZ_DISABLE_CRYPTOLEGACY
#include "nsIDOMCRMFObject.h"
@ -327,11 +326,6 @@ static nsDOMClassInfoData sClassInfoData[] = {
// Misc Core related classes
NS_DEFINE_CLASSINFO_DATA(DeviceAcceleration, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(DeviceRotationRate, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
// CSS classes
NS_DEFINE_CLASSINFO_DATA(CSSStyleRule, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
@ -997,14 +991,6 @@ nsDOMClassInfo::Init()
DOM_CLASSINFO_MAP_ENTRY(nsIDOMDOMConstructor)
DOM_CLASSINFO_MAP_END
DOM_CLASSINFO_MAP_BEGIN(DeviceAcceleration, nsIDOMDeviceAcceleration)
DOM_CLASSINFO_MAP_ENTRY(nsIDOMDeviceAcceleration)
DOM_CLASSINFO_MAP_END
DOM_CLASSINFO_MAP_BEGIN(DeviceRotationRate, nsIDOMDeviceRotationRate)
DOM_CLASSINFO_MAP_ENTRY(nsIDOMDeviceRotationRate)
DOM_CLASSINFO_MAP_END
DOM_CLASSINFO_MAP_BEGIN(CSSStyleRule, nsIDOMCSSStyleRule)
DOM_CLASSINFO_MAP_ENTRY(nsIDOMCSSStyleRule)
DOM_CLASSINFO_MAP_END

View File

@ -9,9 +9,6 @@ DOMCI_CLASS(Location)
DOMCI_CLASS(DOMPrototype)
DOMCI_CLASS(DOMConstructor)
DOMCI_CLASS(DeviceAcceleration)
DOMCI_CLASS(DeviceRotationRate)
// CSS classes
DOMCI_CLASS(CSSStyleRule)
DOMCI_CLASS(CSSCharsetRule)

View File

@ -303,10 +303,20 @@ DOMInterfaces = {
'resultNotAddRefed': [ 'delayTime' ],
},
'DeviceAcceleration': {
'nativeType': 'nsDOMDeviceAcceleration',
'headerFile': 'nsDOMDeviceMotionEvent.h',
},
'DeviceMotionEvent': {
'nativeType': 'nsDOMDeviceMotionEvent',
},
'DeviceRotationRate': {
'nativeType': 'nsDOMDeviceRotationRate',
'headerFile': 'nsDOMDeviceMotionEvent.h',
},
'DeviceStorage': {
'nativeType': 'nsDOMDeviceStorage',
'headerFile': 'DeviceStorage.h',
@ -1857,8 +1867,6 @@ addExternalIface('ActivityOptions', nativeType='nsIDOMMozActivityOptions',
headerFile='nsIDOMActivityOptions.h')
addExternalIface('Counter')
addExternalIface('CSSRule')
addExternalIface('DeviceAcceleration', headerFile='nsIDOMDeviceMotionEvent.h', notflattened=True)
addExternalIface('DeviceRotationRate', headerFile='nsIDOMDeviceMotionEvent.h', notflattened=True)
addExternalIface('mozIDOMApplication', nativeType='mozIDOMApplication', headerFile='nsIDOMApplicationRegistry.h')
addExternalIface('CSSRuleList')
addExternalIface('DOMStringList')

View File

@ -9750,6 +9750,7 @@ class CGBindingRoot(CGThing):
bindingHeaders = [header for (header, include) in
bindingHeaders.iteritems() if include]
declareIncludes = ['mozilla/dom/BindingDeclarations.h',
'mozilla/dom/Nullable.h',
'mozilla/ErrorResult.h',
'jspubtd.h',
'js/RootingAPI.h',

View File

@ -14,7 +14,6 @@ XPIDL_SOURCES += [
'nsIDOMCustomEvent.idl',
'nsIDOMDataContainerEvent.idl',
'nsIDOMDataTransfer.idl',
'nsIDOMDeviceMotionEvent.idl',
'nsIDOMDeviceOrientationEvent.idl',
'nsIDOMDOMTransactionEvent.idl',
'nsIDOMDragEvent.idl',

View File

@ -1,40 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* 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/. */
#include "nsIDOMEvent.idl"
[scriptable, uuid(2AD6EBC0-35AB-41D0-A755-0CA6A0E21565)]
interface nsIDOMDeviceAcceleration : nsISupports
{
readonly attribute double x;
readonly attribute double y;
readonly attribute double z;
};
[scriptable, uuid(E76AC929-61FE-4519-9EAC-D496A53CBC9B)]
interface nsIDOMDeviceRotationRate : nsISupports
{
readonly attribute double alpha;
readonly attribute double beta;
readonly attribute double gamma;
};
[scriptable, builtinclass, uuid(64c300f8-4bf9-47d0-86bc-2fafd7de38c7)]
interface nsIDOMDeviceMotionEvent : nsIDOMEvent
{
void initDeviceMotionEvent(in DOMString eventTypeArg,
in boolean canBubbleArg,
in boolean cancelableArg,
in nsIDOMDeviceAcceleration acceleration,
in nsIDOMDeviceAcceleration accelerationIncludingGravity,
in nsIDOMDeviceRotationRate rotationRate,
in double interval);
readonly attribute nsIDOMDeviceAcceleration acceleration;
readonly attribute nsIDOMDeviceAcceleration accelerationIncludingGravity;
readonly attribute nsIDOMDeviceRotationRate rotationRate;
readonly attribute double interval;
};

View File

@ -348,43 +348,59 @@ nsDeviceSensors::FireDOMMotionEvent(nsIDOMDocument *domdoc,
switch (type) {
case nsIDeviceSensorData::TYPE_LINEAR_ACCELERATION:
mLastAcceleration = new nsDOMDeviceAcceleration(x, y, z);
if (mLastAcceleration.empty()) {
mLastAcceleration.construct();
}
mLastAcceleration.ref().mX.SetValue(x);
mLastAcceleration.ref().mY.SetValue(y);
mLastAcceleration.ref().mZ.SetValue(z);
break;
case nsIDeviceSensorData::TYPE_ACCELERATION:
mLastAccelerationIncluduingGravity = new nsDOMDeviceAcceleration(x, y, z);
if (mLastAccelerationIncluduingGravity.empty()) {
mLastAccelerationIncluduingGravity.construct();
}
mLastAccelerationIncluduingGravity.ref().mX.SetValue(x);
mLastAccelerationIncluduingGravity.ref().mY.SetValue(y);
mLastAccelerationIncluduingGravity.ref().mZ.SetValue(z);
break;
case nsIDeviceSensorData::TYPE_GYROSCOPE:
mLastRotationRate = new nsDOMDeviceRotationRate(x, y, z);
if (mLastRotationRate.empty()) {
mLastRotationRate.construct();
}
mLastRotationRate.ref().mAlpha.SetValue(x);
mLastRotationRate.ref().mBeta.SetValue(y);
mLastRotationRate.ref().mGamma.SetValue(z);
break;
}
if (!fireEvent && (!mLastAcceleration || !mLastAccelerationIncluduingGravity || !mLastRotationRate)) {
if (!fireEvent && (mLastAcceleration.empty() ||
mLastAccelerationIncluduingGravity.empty() ||
mLastRotationRate.empty())) {
return;
}
nsCOMPtr<nsIDOMEvent> event;
domdoc->CreateEvent(NS_LITERAL_STRING("DeviceMotionEvent"), getter_AddRefs(event));
nsCOMPtr<nsIDOMDeviceMotionEvent> me = do_QueryInterface(event);
if (!me)
return;
nsDOMDeviceMotionEvent* me = static_cast<nsDOMDeviceMotionEvent*>(event.get());
ErrorResult rv;
me->InitDeviceMotionEvent(NS_LITERAL_STRING("devicemotion"),
true,
false,
mLastAcceleration,
mLastAccelerationIncluduingGravity,
mLastRotationRate,
DEFAULT_SENSOR_POLL);
mLastAcceleration.ref(),
mLastAccelerationIncluduingGravity.ref(),
mLastRotationRate.ref(),
Nullable<double>(DEFAULT_SENSOR_POLL),
rv);
event->SetTrusted(true);
bool defaultActionEnabled = true;
target->DispatchEvent(event, &defaultActionEnabled);
mLastRotationRate = nullptr;
mLastAccelerationIncluduingGravity = nullptr;
mLastAcceleration = nullptr;
mLastRotationRate.destroy();
mLastAccelerationIncluduingGravity.destroy();
mLastAcceleration.destroy();
mLastDOMMotionEventTime = TimeStamp::Now();
}

View File

@ -6,13 +6,11 @@
#define nsDeviceSensors_h
#include "nsIDeviceSensors.h"
#include "nsIDOMDeviceMotionEvent.h"
#include "nsCOMArray.h"
#include "nsTArray.h"
#include "nsCOMPtr.h"
#include "nsITimer.h"
#include "nsIDOMDeviceOrientationEvent.h"
#include "nsIDOMDeviceMotionEvent.h"
#include "nsDOMDeviceMotionEvent.h"
#include "mozilla/TimeStamp.h"
#include "mozilla/HalSensor.h"
@ -28,6 +26,8 @@ class EventTarget;
class nsDeviceSensors : public nsIDeviceSensors, public mozilla::hal::ISensorObserver
{
typedef mozilla::dom::DeviceAccelerationInit DeviceAccelerationInit;
typedef mozilla::dom::DeviceRotationRateInit DeviceRotationRateInit;
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIDEVICESENSORS
@ -74,9 +74,9 @@ private:
mozilla::TimeStamp mLastDOMMotionEventTime;
bool mIsUserProximityNear;
nsRefPtr<nsDOMDeviceAcceleration> mLastAcceleration;
nsRefPtr<nsDOMDeviceAcceleration> mLastAccelerationIncluduingGravity;
nsRefPtr<nsDOMDeviceRotationRate> mLastRotationRate;
mozilla::Maybe<DeviceAccelerationInit> mLastAcceleration;
mozilla::Maybe<DeviceAccelerationInit> mLastAccelerationIncluduingGravity;
mozilla::Maybe<DeviceRotationRateInit> mLastRotationRate;
};
#endif

View File

@ -194,12 +194,10 @@ var interfaceNamesInGlobalScope =
"DelayNode",
"DesktopNotification",
"DesktopNotificationCenter",
"DeviceAcceleration",
"DeviceLightEvent",
"DeviceMotionEvent",
"DeviceOrientationEvent",
"DeviceProximityEvent",
"DeviceRotationRate",
"DeviceStorage",
"DeviceStorageChangeEvent",
"Document",

View File

@ -4,23 +4,55 @@
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
interface DeviceAcceleration;
interface DeviceRotationRate;
[NoInterfaceObject]
interface DeviceAcceleration {
readonly attribute double? x;
readonly attribute double? y;
readonly attribute double? z;
};
interface DeviceMotionEvent : Event
{
[NoInterfaceObject]
interface DeviceRotationRate {
readonly attribute double? alpha;
readonly attribute double? beta;
readonly attribute double? gamma;
};
[Constructor(DOMString type, optional DeviceMotionEventInit eventInitDict)]
interface DeviceMotionEvent : Event {
readonly attribute DeviceAcceleration? acceleration;
readonly attribute DeviceAcceleration? accelerationIncludingGravity;
readonly attribute DeviceRotationRate? rotationRate;
readonly attribute double? interval;
};
dictionary DeviceAccelerationInit {
double? x = null;
double? y = null;
double? z = null;
};
dictionary DeviceRotationRateInit {
double? alpha = null;
double? beta = null;
double? gamma = null;
};
dictionary DeviceMotionEventInit : EventInit {
DeviceAccelerationInit acceleration;
DeviceAccelerationInit accelerationIncludingGravity;
DeviceRotationRateInit rotationRate;
double? interval = null;
};
// Mozilla extensions.
partial interface DeviceMotionEvent {
[Throws]
void initDeviceMotionEvent(DOMString type,
boolean canBubble,
boolean cancelable,
DeviceAcceleration? acceleration,
DeviceAcceleration? accelerationIncludingGravity,
DeviceRotationRate? rotationRate,
double interval);
readonly attribute DeviceAcceleration? acceleration;
readonly attribute DeviceAcceleration? accelerationIncludingGravity;
readonly attribute DeviceRotationRate? rotationRate;
readonly attribute double interval;
DeviceAccelerationInit acceleration,
DeviceAccelerationInit accelerationIncludingGravity,
DeviceRotationRateInit rotationRate,
double? interval);
};