Chromium Code Reviews| Index: third_party/WebKit/Source/modules/vr/VRController.cpp |
| diff --git a/third_party/WebKit/Source/modules/vr/VRController.cpp b/third_party/WebKit/Source/modules/vr/VRController.cpp |
| index d65e078825eaaafa9acc0338243738a8db1140e2..047727841631e4599b534497705416d016e4c921 100644 |
| --- a/third_party/WebKit/Source/modules/vr/VRController.cpp |
| +++ b/third_party/WebKit/Source/modules/vr/VRController.cpp |
| @@ -58,12 +58,15 @@ void VRController::resetPose(unsigned index) |
| m_service->ResetPose(index); |
| } |
| -void VRController::requestPresent(unsigned index) |
| +void VRController::requestPresent(ScriptPromiseResolver* resolver, unsigned index) |
| { |
| - if (!m_service) |
| + if (!m_service) { |
| + DOMException* exception = DOMException::create(InvalidStateError, "The service is no longer active."); |
| + resolver->reject(exception); |
| return; |
| + } |
| - m_service->RequestPresent(index); |
| + m_service->RequestPresent(index, convertToBaseCallback(WTF::bind(&VRController::onPresentComplete, wrapPersistent(this), wrapPersistent(resolver), index))); |
| } |
| void VRController::exitPresent(unsigned index) |
| @@ -74,12 +77,12 @@ void VRController::exitPresent(unsigned index) |
| m_service->ExitPresent(index); |
| } |
| -void VRController::submitFrame(unsigned index) |
| +void VRController::submitFrame(unsigned index, device::blink::VRPosePtr pose) |
| { |
| if (!m_service) |
| return; |
| - m_service->SubmitFrame(index); |
| + m_service->SubmitFrame(index, std::move(pose)); |
| } |
| void VRController::updateLayerBounds(unsigned index, |
| @@ -140,6 +143,23 @@ void VRController::onGetDisplays(mojo::WTFArray<device::blink::VRDisplayPtr> dis |
| callback->onSuccess(outDisplays); |
| } |
| +void VRController::onPresentComplete(ScriptPromiseResolver* resolver, unsigned index, bool success) |
| +{ |
| + VRDisplay* vrDisplay = getDisplayForIndex(index); |
| + if (!vrDisplay) { |
| + DOMException* exception = DOMException::create(InvalidStateError, "VRDisplay not found."); |
| + resolver->reject(exception); |
|
haraken
2016/09/14 00:08:20
Don't we need to add 'return' here?
bajones
2016/09/14 00:30:03
Yes, we do. Thanks! Fixed.
|
| + } |
| + |
| + if (success) { |
| + vrDisplay->beginPresent(resolver); |
| + } else { |
| + vrDisplay->forceExitPresent(); |
| + DOMException* exception = DOMException::create(NotAllowedError, "Presentation request was denied."); |
| + resolver->reject(exception); |
| + } |
| +} |
| + |
| void VRController::OnDisplayChanged(device::blink::VRDisplayPtr display) |
| { |
| VRDisplay* vrDisplay = getDisplayForIndex(display->index); |
| @@ -149,6 +169,13 @@ void VRController::OnDisplayChanged(device::blink::VRDisplayPtr display) |
| vrDisplay->update(display); |
| } |
| +void VRController::OnExitPresent(unsigned index) |
| +{ |
| + VRDisplay* vrDisplay = getDisplayForIndex(index); |
| + if (vrDisplay) |
| + vrDisplay->forceExitPresent(); |
| +} |
| + |
| void VRController::contextDestroyed() |
| { |
| // If the document context was destroyed, shut down the client connection |