1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/shell/renderer/test_runner/gamepad_controller.h"
7 #include "content/shell/renderer/test_runner/TestInterfaces.h"
8 #include "content/shell/renderer/test_runner/WebTestDelegate.h"
9 #include "gin/arguments.h"
10 #include "gin/handle.h"
11 #include "gin/object_template_builder.h"
12 #include "gin/wrappable.h"
13 #include "third_party/WebKit/public/web/WebFrame.h"
14 #include "third_party/WebKit/public/web/WebKit.h"
15 #include "v8/include/v8.h"
17 using blink::WebFrame
;
18 using blink::WebGamepad
;
19 using blink::WebGamepads
;
23 class GamepadControllerBindings
24 : public gin::Wrappable
<GamepadControllerBindings
> {
26 static gin::WrapperInfo kWrapperInfo
;
28 static void Install(base::WeakPtr
<GamepadController
> controller
,
29 blink::WebFrame
* frame
);
32 explicit GamepadControllerBindings(
33 base::WeakPtr
<GamepadController
> controller
);
34 virtual ~GamepadControllerBindings();
37 virtual gin::ObjectTemplateBuilder
GetObjectTemplateBuilder(
38 v8::Isolate
* isolate
) OVERRIDE
;
40 void Connect(int index
);
41 void DispatchConnected(int index
);
42 void Disconnect(int index
);
43 void SetId(int index
, const std::string
& src
);
44 void SetButtonCount(int index
, int buttons
);
45 void SetButtonData(int index
, int button
, double data
);
46 void SetAxisCount(int index
, int axes
);
47 void SetAxisData(int index
, int axis
, double data
);
49 base::WeakPtr
<GamepadController
> controller_
;
51 DISALLOW_COPY_AND_ASSIGN(GamepadControllerBindings
);
54 gin::WrapperInfo
GamepadControllerBindings::kWrapperInfo
= {
55 gin::kEmbedderNativeGin
};
58 void GamepadControllerBindings::Install(
59 base::WeakPtr
<GamepadController
> controller
,
61 v8::Isolate
* isolate
= blink::mainThreadIsolate();
62 v8::HandleScope
handle_scope(isolate
);
63 v8::Handle
<v8::Context
> context
= frame
->mainWorldScriptContext();
64 if (context
.IsEmpty())
67 v8::Context::Scope
context_scope(context
);
69 gin::Handle
<GamepadControllerBindings
> bindings
=
70 gin::CreateHandle(isolate
, new GamepadControllerBindings(controller
));
71 if (bindings
.IsEmpty())
73 v8::Handle
<v8::Object
> global
= context
->Global();
74 global
->Set(gin::StringToV8(isolate
, "gamepadController"), bindings
.ToV8());
77 GamepadControllerBindings::GamepadControllerBindings(
78 base::WeakPtr
<GamepadController
> controller
)
79 : controller_(controller
) {}
81 GamepadControllerBindings::~GamepadControllerBindings() {}
83 gin::ObjectTemplateBuilder
GamepadControllerBindings::GetObjectTemplateBuilder(
84 v8::Isolate
* isolate
) {
85 return gin::Wrappable
<GamepadControllerBindings
>::GetObjectTemplateBuilder(
87 .SetMethod("connect", &GamepadControllerBindings::Connect
)
88 .SetMethod("dispatchConnected", &GamepadControllerBindings::DispatchConnected
)
89 .SetMethod("disconnect", &GamepadControllerBindings::Disconnect
)
90 .SetMethod("setId", &GamepadControllerBindings::SetId
)
91 .SetMethod("setButtonCount", &GamepadControllerBindings::SetButtonCount
)
92 .SetMethod("setButtonData", &GamepadControllerBindings::SetButtonData
)
93 .SetMethod("setAxisCount", &GamepadControllerBindings::SetAxisCount
)
94 .SetMethod("setAxisData", &GamepadControllerBindings::SetAxisData
);
97 void GamepadControllerBindings::Connect(int index
) {
99 controller_
->Connect(index
);
102 void GamepadControllerBindings::DispatchConnected(int index
) {
104 controller_
->DispatchConnected(index
);
107 void GamepadControllerBindings::Disconnect(int index
) {
109 controller_
->Disconnect(index
);
112 void GamepadControllerBindings::SetId(int index
, const std::string
& src
) {
114 controller_
->SetId(index
, src
);
117 void GamepadControllerBindings::SetButtonCount(int index
, int buttons
) {
119 controller_
->SetButtonCount(index
, buttons
);
122 void GamepadControllerBindings::SetButtonData(int index
,
126 controller_
->SetButtonData(index
, button
, data
);
129 void GamepadControllerBindings::SetAxisCount(int index
, int axes
) {
131 controller_
->SetAxisCount(index
, axes
);
134 void GamepadControllerBindings::SetAxisData(int index
, int axis
, double data
) {
136 controller_
->SetAxisData(index
, axis
, data
);
139 GamepadController::GamepadController() : delegate_(NULL
), weak_factory_(this) {
143 GamepadController::~GamepadController() {}
145 void GamepadController::Reset() {
146 memset(&gamepads_
, 0, sizeof(gamepads_
));
149 void GamepadController::Install(WebFrame
* frame
) {
150 GamepadControllerBindings::Install(weak_factory_
.GetWeakPtr(), frame
);
153 void GamepadController::SetDelegate(WebTestRunner::WebTestDelegate
* delegate
) {
154 delegate_
= delegate
;
157 void GamepadController::Connect(int index
) {
158 if (index
< 0 || index
>= static_cast<int>(WebGamepads::itemsLengthCap
))
160 gamepads_
.items
[index
].connected
= true;
161 gamepads_
.length
= 0;
162 for (unsigned i
= 0; i
< WebGamepads::itemsLengthCap
; ++i
) {
163 if (gamepads_
.items
[i
].connected
)
164 gamepads_
.length
= i
+ 1;
167 delegate_
->setGamepadData(gamepads_
);
170 void GamepadController::DispatchConnected(int index
) {
171 if (index
< 0 || index
>= static_cast<int>(WebGamepads::itemsLengthCap
))
173 const WebGamepad
& pad
= gamepads_
.items
[index
];
174 if (pad
.connected
&& delegate_
)
175 delegate_
->didConnectGamepad(index
, pad
);
178 void GamepadController::Disconnect(int index
) {
179 if (index
< 0 || index
>= static_cast<int>(WebGamepads::itemsLengthCap
))
181 WebGamepad
& pad
= gamepads_
.items
[index
];
182 pad
.connected
= false;
183 gamepads_
.length
= 0;
184 for (unsigned i
= 0; i
< WebGamepads::itemsLengthCap
; ++i
) {
185 if (gamepads_
.items
[i
].connected
)
186 gamepads_
.length
= i
+ 1;
189 delegate_
->setGamepadData(gamepads_
);
190 delegate_
->didDisconnectGamepad(index
, pad
);
194 void GamepadController::SetId(int index
, const std::string
& src
) {
195 if (index
< 0 || index
>= static_cast<int>(WebGamepads::itemsLengthCap
))
197 const char* p
= src
.c_str();
198 memset(gamepads_
.items
[index
].id
, 0, sizeof(gamepads_
.items
[index
].id
));
199 for (unsigned i
= 0; *p
&& i
< WebGamepad::idLengthCap
- 1; ++i
)
200 gamepads_
.items
[index
].id
[i
] = *p
++;
202 delegate_
->setGamepadData(gamepads_
);
205 void GamepadController::SetButtonCount(int index
, int buttons
) {
206 if (index
< 0 || index
>= static_cast<int>(WebGamepads::itemsLengthCap
))
208 if (buttons
< 0 || buttons
>= static_cast<int>(WebGamepad::buttonsLengthCap
))
210 gamepads_
.items
[index
].buttonsLength
= buttons
;
212 delegate_
->setGamepadData(gamepads_
);
215 void GamepadController::SetButtonData(int index
, int button
, double data
) {
216 if (index
< 0 || index
>= static_cast<int>(WebGamepads::itemsLengthCap
))
218 if (button
< 0 || button
>= static_cast<int>(WebGamepad::buttonsLengthCap
))
220 gamepads_
.items
[index
].buttons
[button
].value
= data
;
221 gamepads_
.items
[index
].buttons
[button
].pressed
= data
> 0.1f
;
223 delegate_
->setGamepadData(gamepads_
);
226 void GamepadController::SetAxisCount(int index
, int axes
) {
227 if (index
< 0 || index
>= static_cast<int>(WebGamepads::itemsLengthCap
))
229 if (axes
< 0 || axes
>= static_cast<int>(WebGamepad::axesLengthCap
))
231 gamepads_
.items
[index
].axesLength
= axes
;
233 delegate_
->setGamepadData(gamepads_
);
236 void GamepadController::SetAxisData(int index
, int axis
, double data
) {
237 if (index
< 0 || index
>= static_cast<int>(WebGamepads::itemsLengthCap
))
239 if (axis
< 0 || axis
>= static_cast<int>(WebGamepad::axesLengthCap
))
241 gamepads_
.items
[index
].axes
[axis
] = data
;
243 delegate_
->setGamepadData(gamepads_
);
246 } // namespace content