IDL changes for gamepad support

https://bugs.webkit.org/show_bug.cgi?id=71753

Patch by Scott Graham <scottmg@chromium.org> on 2011-11-18
Reviewed by Adam Barth.

Source/WebCore:

IDL changes and associated plumbing to expose list of gamepad objects
on navigator object (per current spec). Full patch is
https://bugs.webkit.org/show_bug.cgi?id=69451. Only basic existence
test until more plumbing in future patches.

Test: gamepad/gamepad-api.html

* WebCore.gypi:
* bindings/generic/RuntimeEnabledFeatures.h:
(WebCore::RuntimeEnabledFeatures::setWebkitGamepadsEnabled):
(WebCore::RuntimeEnabledFeatures::webkitGamepadsEnabled):
* page/Gamepad.cpp: Added.
(WebCore::Gamepad::Gamepad):
(WebCore::Gamepad::axes):
(WebCore::Gamepad::buttons):
(WebCore::Gamepad::~Gamepad):
* page/Gamepad.h: Added.
* page/Gamepad.idl: Added.
* page/GamepadList.cpp: Added.
(WebCore::GamepadList::~GamepadList):
(WebCore::GamepadList::set):
(WebCore::GamepadList::length):
(WebCore::GamepadList::item):
* page/GamepadList.h: Added.
(WebCore::GamepadList::create):
(WebCore::GamepadList::GamepadList):
* page/GamepadList.idl: Added.
* page/Navigator.cpp:
(WebCore::Navigator::webkitGamepads):
* page/Navigator.h:
* page/Navigator.idl:

Source/WebKit/chromium:

Update to use vendor-prefixed enable.

* src/WebRuntimeFeatures.cpp:
(WebKit::WebRuntimeFeatures::enableGamepad):
(WebKit::WebRuntimeFeatures::isGamepadEnabled):

Tools:

Runtime enable gamepad in chromium test shell.

* DumpRenderTree/chromium/TestShell.cpp:
(TestShell::TestShell):

LayoutTests:

Add basic api existence test.

* gamepad/gamepad-api-expected.txt: Added.
* gamepad/gamepad-api.html: Added.
* gamepad/gamepad-test.js: Added.
(logConsole):
(testExpected):
(reportExpected):
(waitForEventAndEnd):
(waitForEvent._eventCallback):
(waitForEvent):
(waitForEventAndTest._eventCallback):
(waitForEventAndTest):
(waitForEventTestAndEnd):
(endTest):
(logResult):
(consoleWrite):
* platform/chromium/fast/dom/navigator-detached-no-crash-expected.txt:
* platform/efl/Skipped:
* platform/gtk/Skipped:
* platform/mac/Skipped:
* platform/qt/Skipped:
* platform/win/Skipped:
* platform/wincairo/Skipped:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@100833 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent 6541c0db
2011-11-18 Scott Graham <scottmg@chromium.org>
IDL changes for gamepad support
https://bugs.webkit.org/show_bug.cgi?id=71753
Reviewed by Adam Barth.
Add basic api existence test.
* gamepad/gamepad-api-expected.txt: Added.
* gamepad/gamepad-api.html: Added.
* gamepad/gamepad-test.js: Added.
(logConsole):
(testExpected):
(reportExpected):
(waitForEventAndEnd):
(waitForEvent._eventCallback):
(waitForEvent):
(waitForEventAndTest._eventCallback):
(waitForEventAndTest):
(waitForEventTestAndEnd):
(endTest):
(logResult):
(consoleWrite):
* platform/chromium/fast/dom/navigator-detached-no-crash-expected.txt:
* platform/efl/Skipped:
* platform/gtk/Skipped:
* platform/mac/Skipped:
* platform/qt/Skipped:
* platform/win/Skipped:
* platform/wincairo/Skipped:
2011-11-18 Sheriff Bot <webkit.review.bot@gmail.com>
Unreviewed, rolling out r100693.
EXPECTED (navigator.webkitGamepads !== 'undefined') OK
END OF TEST
Make sure the main polling access point exists on navigator.
<!DOCTYPE html>
<body>
<script src="gamepad-test.js"></script>
<script>
testExpected("navigator.webkitGamepads", undefined, "!==");
endTest();
</script>
<p>Make sure the main polling access point exists on navigator.</p>
</body>
var console = null;
var printFullTestDetails = true; // This is optionaly switched of by test whose tested values can differ. (see disableFullTestDetailsPrinting())
logConsole();
if (window.layoutTestController) {
layoutTestController.dumpAsText();
layoutTestController.waitUntilDone();
}
function logConsole()
{
if (!console && document.body) {
console = document.createElement('div');
document.body.appendChild(console);
}
return console;
}
function testExpected(testFuncString, expected, comparison)
{
try {
var observed = eval(testFuncString);
} catch (ex) {
consoleWrite(ex);
return;
}
if (comparison === undefined)
comparison = '==';
var success = false;
switch (comparison)
{
case '<': success = observed < expected; break;
case '<=': success = observed <= expected; break;
case '>': success = observed > expected; break;
case '>=': success = observed >= expected; break;
case '!=': success = observed != expected; break;
case '!==': success = observed !== expected; break;
case '==': success = observed == expected; break;
case '===': success = observed === expected; break;
}
reportExpected(success, testFuncString, comparison, expected, observed)
}
var testNumber = 0;
function reportExpected(success, testFuncString, comparison, expected, observed)
{
testNumber++;
var msg = "Test " + testNumber;
if (printFullTestDetails || !success)
msg = "EXPECTED (<em>" + testFuncString + " </em>" + comparison + " '<em>" + expected + "</em>')";
if (!success)
msg += ", OBSERVED '<em>" + observed + "</em>'";
logResult(success, msg);
}
function waitForEventAndEnd(element, eventName, funcString)
{
waitForEvent(element, eventName, funcString, true)
}
function waitForEvent(element, eventName, func, endit)
{
function _eventCallback(event)
{
consoleWrite("EVENT(" + eventName + ")");
if (func)
func(event);
if (endit)
endTest();
}
element.addEventListener(eventName, _eventCallback);
}
function waitForEventAndTest(element, eventName, testFuncString, endit)
{
function _eventCallback(event)
{
logResult(eval(testFuncString), "EVENT(" + eventName + ") TEST(" + testFuncString + ")");
if (endit)
endTest();
}
element.addEventListener(eventName, _eventCallback);
}
function waitForEventTestAndEnd(element, eventName, testFuncString)
{
waitForEventAndTest(element, eventName, testFuncString, true);
}
var testEnded = false;
function endTest()
{
consoleWrite("END OF TEST");
testEnded = true;
if (window.layoutTestController)
layoutTestController.notifyDone();
}
function logResult(success, text)
{
if (success)
consoleWrite(text + " <span style='color:green'>OK</span>");
else
consoleWrite(text + " <span style='color:red'>FAIL</span>");
}
function consoleWrite(text)
{
if (testEnded)
return;
logConsole().innerHTML += text + "<br>";
}
......@@ -17,6 +17,7 @@ navigator.registerProtocolHandler() threw err TypeError: Not enough arguments
navigator.userAgent is OK
navigator.vendor is OK
navigator.vendorSub is OK
navigator.webkitGamepads is OK
navigator.appCodeName is OK
navigator.appName is OK
navigator.appVersion is OK
......@@ -34,4 +35,5 @@ navigator.registerProtocolHandler() threw err TypeError: Not enough arguments
navigator.userAgent is OK
navigator.vendor is OK
navigator.vendorSub is OK
navigator.webkitGamepads is OK
......@@ -1909,6 +1909,9 @@ fast/forms/month
fast/forms/time
fast/forms/week
# ENABLE_GAMEPAD not enabled.
gamepad/
# MutationObservers are net yet enabled. http://webkit.org/b/68729
fast/mutation
......
......@@ -258,6 +258,9 @@ fast/forms/month
fast/forms/time
fast/forms/week
# ENABLE_GAMEPAD not enabled.
gamepad/
# Speech input is not yet enabled.
fast/speech
......
......@@ -214,6 +214,9 @@ fast/forms/month
fast/forms/time
fast/forms/week
# ENABLE_GAMEPAD not enabled.
gamepad/
# Speech input is not yet enabled.
fast/speech
......
......@@ -89,6 +89,9 @@ fast/forms/month
fast/forms/time
fast/forms/week
# ENABLE_GAMEPAD not enabled.
gamepad/
# ENABLE(INPUT_SPEECH) is disabled.
fast/speech
......
......@@ -1122,6 +1122,9 @@ fast/forms/month
fast/forms/time
fast/forms/week
# ENABLE_GAMEPAD not enabled.
gamepad/
# Speech input is not yet enabled.
fast/speech
......
......@@ -1639,6 +1639,9 @@ fast/forms/month
fast/forms/time
fast/forms/week
# ENABLE_GAMEPAD not enabled.
gamepad/
# Speech input is not yet enabled.
fast/speech
......
2011-11-18 Scott Graham <scottmg@chromium.org>
IDL changes for gamepad support
https://bugs.webkit.org/show_bug.cgi?id=71753
Reviewed by Adam Barth.
IDL changes and associated plumbing to expose list of gamepad objects
on navigator object (per current spec). Full patch is
https://bugs.webkit.org/show_bug.cgi?id=69451. Only basic existence
test until more plumbing in future patches.
Test: gamepad/gamepad-api.html
* WebCore.gypi:
* bindings/generic/RuntimeEnabledFeatures.h:
(WebCore::RuntimeEnabledFeatures::setWebkitGamepadsEnabled):
(WebCore::RuntimeEnabledFeatures::webkitGamepadsEnabled):
* page/Gamepad.cpp: Added.
(WebCore::Gamepad::Gamepad):
(WebCore::Gamepad::axes):
(WebCore::Gamepad::buttons):
(WebCore::Gamepad::~Gamepad):
* page/Gamepad.h: Added.
* page/Gamepad.idl: Added.
* page/GamepadList.cpp: Added.
(WebCore::GamepadList::~GamepadList):
(WebCore::GamepadList::set):
(WebCore::GamepadList::length):
(WebCore::GamepadList::item):
* page/GamepadList.h: Added.
(WebCore::GamepadList::create):
(WebCore::GamepadList::GamepadList):
* page/GamepadList.idl: Added.
* page/Navigator.cpp:
(WebCore::Navigator::webkitGamepads):
* page/Navigator.h:
* page/Navigator.idl:
2011-11-18 Sheriff Bot <webkit.review.bot@gmail.com>
Unreviewed, rolling out r100693.
......@@ -1402,6 +1402,8 @@
'page/DOMSelection.idl',
'page/DOMWindow.idl',
'page/EventSource.idl',
'page/Gamepad.idl',
'page/GamepadList.idl',
'page/Geolocation.idl',
'page/Geoposition.idl',
'page/History.idl',
......@@ -2949,6 +2951,10 @@
'page/FrameActionScheduler.h',
'page/FrameTree.cpp',
'page/FrameView.cpp',
'page/Gamepad.cpp',
'page/Gamepad.h',
'page/GamepadList.cpp',
'page/GamepadList.h',
'page/Geolocation.cpp',
'page/GeolocationController.cpp',
'page/GroupSettings.cpp',
......
......@@ -172,8 +172,8 @@ public:
#endif
#if ENABLE(GAMEPAD)
static void setGamepadsEnabled(bool isEnabled) { isGamepadEnabled = isEnabled; }
static bool gamepadsEnabled() { return isGamepadEnabled; }
static void setWebkitGamepadsEnabled(bool isEnabled) { isGamepadEnabled = isEnabled; }
static bool webkitGamepadsEnabled() { return isGamepadEnabled; }
#endif
#if ENABLE(QUOTA)
......
// Copyright (C) 2011, Google Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
// DAMAGE.
#include "config.h"
#include "Gamepad.h"
#if ENABLE(GAMEPAD)
#include <wtf/text/WTFString.h>
namespace WebCore {
Gamepad::Gamepad()
{
}
void Gamepad::axes(unsigned count, float* data)
{
m_axes.resize(count);
std::copy(data, data + count, m_axes.begin());
}
void Gamepad::buttons(unsigned count, float* data)
{
m_buttons.resize(count);
std::copy(data, data + count, m_buttons.begin());
}
Gamepad::~Gamepad()
{
}
} // namespace WebCore
#endif // ENABLE(GAMEPAD)
// Copyright (C) 2011, Google Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
// DAMAGE.
#ifndef Gamepad_h
#define Gamepad_h
#if ENABLE(GAMEPAD)
#include <wtf/RefCounted.h>
#include <wtf/Vector.h>
#include <wtf/text/WTFString.h>
namespace WebCore {
class Gamepad: public RefCounted<Gamepad> {
public:
static PassRefPtr<Gamepad> create()
{
return adoptRef(new Gamepad);
}
~Gamepad();
typedef Vector<float> FloatVector;
const String& id() const { return m_id; }
void id(const String& id) { m_id = id; }
unsigned index() const { return m_index; }
void index(unsigned val) { m_index = val; }
unsigned long long timestamp() const { return m_timestamp; }
void timestamp(unsigned long long val) { m_timestamp = val; }
const FloatVector& axes() const { return m_axes; }
void axes(unsigned count, float* data);
const FloatVector& buttons() const { return m_buttons; }
void buttons(unsigned count, float* data);
private:
Gamepad();
String m_id;
unsigned m_index;
unsigned long long m_timestamp;
FloatVector m_axes;
FloatVector m_buttons;
};
} // namespace WebCore
#endif // ENABLE(GAMEPAD)
#endif // Gamepad_h
// Copyright (C) 2011, Google Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
// DAMAGE.
module dom {
interface [
Conditional=GAMEPAD
] Gamepad {
readonly attribute DOMString id;
readonly attribute unsigned long index;
readonly attribute unsigned long long timestamp;
readonly attribute float[] axes;
readonly attribute float[] buttons;
};
}
// Copyright (C) 2011, Google Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
// DAMAGE.
#include "config.h"
#include "GamepadList.h"
#include "Gamepad.h"
#if ENABLE(GAMEPAD)
namespace WebCore {
GamepadList::~GamepadList()
{
}
void GamepadList::set(unsigned index, PassRefPtr<Gamepad> gamepad)
{
if (index >= kMaximumGamepads)
return;
m_items[index] = gamepad;
}
unsigned GamepadList::length() const
{
return kMaximumGamepads;
}
Gamepad* GamepadList::item(unsigned index)
{
return index < length() ? m_items[index].get() : 0;
}
} // namespace WebCore
#endif // ENABLE(GAMEPAD)
// Copyright (C) 2011, Google Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
// DAMAGE.
#ifndef GamepadList_h
#define GamepadList_h
#if ENABLE(GAMEPAD)
#include "Gamepad.h"
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/Vector.h>
namespace WebCore {
typedef Vector<RefPtr<Gamepad> > GamepadVector;
class GamepadList : public RefCounted<GamepadList> {
public:
static PassRefPtr<GamepadList> create() { return adoptRef(new GamepadList); }
~GamepadList();
void set(unsigned index, PassRefPtr<Gamepad>);
Gamepad* item(unsigned index);
unsigned length() const;
private:
enum { kMaximumGamepads = 4 };
GamepadList() { }
RefPtr<Gamepad> m_items[kMaximumGamepads];
};
} // namespace WebCore
#endif // ENABLE(GAMEPAD)
#endif // GamepadList_h
// Copyright (C) 2011, Google Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL