mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-24 05:11:16 +00:00
Bug 852257 - implement Gamepad.timestamp property; r=ted, r=smaug
--HG-- extra : rebase_source : 39bb03690dd1b455c73604eca3eb0f2811449a54 extra : amend_source : 34220433ef534585057c0a7f0fca370b8cb0bc86
This commit is contained in:
parent
d0c2ece498
commit
eb67e9d016
@ -4,6 +4,7 @@
|
||||
|
||||
#include "Gamepad.h"
|
||||
#include "nsAutoPtr.h"
|
||||
#include "nsPIDOMWindow.h"
|
||||
#include "nsTArray.h"
|
||||
#include "nsVariant.h"
|
||||
#include "mozilla/dom/GamepadBinding.h"
|
||||
@ -21,6 +22,18 @@ NS_INTERFACE_MAP_END
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(Gamepad, mParent, mButtons)
|
||||
|
||||
void
|
||||
Gamepad::UpdateTimestamp()
|
||||
{
|
||||
nsCOMPtr<nsPIDOMWindow> newWindow(do_QueryInterface(mParent));
|
||||
if(newWindow) {
|
||||
nsPerformance* perf = newWindow->GetPerformance();
|
||||
if (perf) {
|
||||
mTimestamp = perf->GetDOMTiming()->TimeStampToDOMHighRes(TimeStamp::Now());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Gamepad::Gamepad(nsISupports* aParent,
|
||||
const nsAString& aID, uint32_t aIndex,
|
||||
GamepadMappingType aMapping,
|
||||
@ -37,6 +50,7 @@ Gamepad::Gamepad(nsISupports* aParent,
|
||||
mButtons.InsertElementAt(i, new GamepadButton(mParent));
|
||||
}
|
||||
mAxes.InsertElementsAt(0, aNumAxes, 0.0f);
|
||||
UpdateTimestamp();
|
||||
}
|
||||
|
||||
void
|
||||
@ -57,6 +71,7 @@ Gamepad::SetButton(uint32_t aButton, bool aPressed, double aValue)
|
||||
MOZ_ASSERT(aButton < mButtons.Length());
|
||||
mButtons[aButton]->SetPressed(aPressed);
|
||||
mButtons[aButton]->SetValue(aValue);
|
||||
UpdateTimestamp();
|
||||
}
|
||||
|
||||
void
|
||||
@ -67,6 +82,7 @@ Gamepad::SetAxis(uint32_t aAxis, double aValue)
|
||||
mAxes[aAxis] = aValue;
|
||||
GamepadBinding::ClearCachedAxesValue(this);
|
||||
}
|
||||
UpdateTimestamp();
|
||||
}
|
||||
|
||||
void
|
||||
@ -90,6 +106,7 @@ Gamepad::SyncState(Gamepad* aOther)
|
||||
if (changed) {
|
||||
GamepadBinding::ClearCachedAxesValue(this);
|
||||
}
|
||||
UpdateTimestamp();
|
||||
}
|
||||
|
||||
already_AddRefed<Gamepad>
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "nsString.h"
|
||||
#include "nsTArray.h"
|
||||
#include "nsWrapperCache.h"
|
||||
#include "nsPerformance.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
@ -65,6 +66,11 @@ public:
|
||||
aID = mID;
|
||||
}
|
||||
|
||||
DOMHighResTimeStamp Timestamp() const
|
||||
{
|
||||
return mTimestamp;
|
||||
}
|
||||
|
||||
GamepadMappingType Mapping()
|
||||
{
|
||||
return mMapping;
|
||||
@ -92,6 +98,7 @@ public:
|
||||
|
||||
private:
|
||||
virtual ~Gamepad() {}
|
||||
void UpdateTimestamp();
|
||||
|
||||
protected:
|
||||
nsCOMPtr<nsISupports> mParent;
|
||||
@ -107,6 +114,7 @@ protected:
|
||||
// Current state of buttons, axes.
|
||||
nsTArray<nsRefPtr<GamepadButton>> mButtons;
|
||||
nsTArray<double> mAxes;
|
||||
DOMHighResTimeStamp mTimestamp;
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
|
@ -5,6 +5,7 @@ support-files =
|
||||
gamepad_frame_state.html
|
||||
mock_gamepad.js
|
||||
|
||||
[test_check_timestamp.html]
|
||||
[test_gamepad.html]
|
||||
skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop specific, initial triage
|
||||
[test_gamepad_connect_events.html]
|
||||
|
51
dom/tests/mochitest/gamepad/test_check_timestamp.html
Normal file
51
dom/tests/mochitest/gamepad/test_check_timestamp.html
Normal file
@ -0,0 +1,51 @@
|
||||
<!-- Any copyright is dedicated to the Public Domain.
|
||||
- http://creativecommons.org/publicdomain/zero/1.0/ -->
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<title>Test Gamepad.timestamp</title>
|
||||
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||||
</head>
|
||||
<body>
|
||||
<script type="text/javascript" src="mock_gamepad.js"></script>
|
||||
<script class="testbody" type="text/javascript">
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
var index = GamepadService.addGamepad("test gamepad", // id
|
||||
SpecialPowers.Ci.nsIGamepadServiceTest.NO_MAPPING,
|
||||
4, // buttons
|
||||
2);// axes
|
||||
|
||||
var timea=0;
|
||||
window.addEventListener("gamepadbuttondown", buttonpresshandler);
|
||||
|
||||
var firstPress = true;
|
||||
GamepadService.newButtonEvent(index, 0, true);
|
||||
GamepadService.newButtonEvent(index, 0, true);
|
||||
|
||||
function cleanup(){
|
||||
SpecialPowers.executeSoon(function() {
|
||||
GamepadService.removeGamepad(index);
|
||||
SimpleTest.finish();
|
||||
});
|
||||
}
|
||||
|
||||
function buttonpresshandler(e) {
|
||||
if(timea == 0){
|
||||
timea = e.gamepad.timestamp;
|
||||
}
|
||||
else{
|
||||
ok(timea <= e.gamepad.timestamp);
|
||||
}
|
||||
GamepadService.newButtonEvent(index, 0, false);
|
||||
if (!firstPress) {
|
||||
SpecialPowers.executeSoon(cleanup);
|
||||
}
|
||||
else {
|
||||
firstPress = false;
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@ -20,6 +20,7 @@ var index = GamepadService.addGamepad("test gamepad", // id
|
||||
// Press a button
|
||||
GamepadService.newButtonEvent(index, 0, true);
|
||||
function connecthandler(e) {
|
||||
ok(e.gamepad.timestamp <= performance.now());
|
||||
is(e.gamepad.id, "test gamepad", "correct gamepad name");
|
||||
is(e.gamepad.mapping, "standard", "standard mapping");
|
||||
is(e.gamepad.buttons.length, 4, "correct number of buttons");
|
||||
|
@ -51,4 +51,9 @@ interface Gamepad {
|
||||
*/
|
||||
[Pure, Cached, Frozen]
|
||||
readonly attribute sequence<double> axes;
|
||||
|
||||
/**
|
||||
* Timestamp from when the data of this device was last updated.
|
||||
*/
|
||||
readonly attribute DOMHighResTimeStamp timestamp;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user