Chromium Code Reviews| Index: third_party/WebKit/Source/modules/vr/VRDisplay.cpp |
| diff --git a/third_party/WebKit/Source/modules/vr/VRDisplay.cpp b/third_party/WebKit/Source/modules/vr/VRDisplay.cpp |
| index eb5950d44d394193f96dc9d3ae47e35d98459849..5b90912f6b1a650853f319f9dddccefd240b21ee 100644 |
| --- a/third_party/WebKit/Source/modules/vr/VRDisplay.cpp |
| +++ b/third_party/WebKit/Source/modules/vr/VRDisplay.cpp |
| @@ -46,7 +46,8 @@ VRDisplay::VRDisplay(NavigatorVR* navigatorVR) |
| m_eyeParametersRight(new VREyeParameters()), |
| m_depthNear(0.01), |
| m_depthFar(10000.0), |
| - m_fullscreenCheckTimer(this, &VRDisplay::onFullscreenCheck) {} |
| + m_fullscreenCheckTimer(this, &VRDisplay::onFullscreenCheck), |
| + m_binding(this) {} |
| VRDisplay::~VRDisplay() {} |
| @@ -109,14 +110,21 @@ VRPose* VRDisplay::getPose() { |
| void VRDisplay::updatePose() { |
| if (m_canUpdateFramePose) { |
| - m_framePose = controller()->getPose(m_displayId); |
| + if (!m_service) |
| + return; |
| + device::blink::VRPosePtr pose; |
| + m_service->GetPose(&pose); |
| + m_framePose = std::move(pose); |
| if (m_isPresenting) |
| m_canUpdateFramePose = false; |
| } |
| } |
| void VRDisplay::resetPose() { |
| - controller()->resetPose(m_displayId); |
| + if (!m_service) |
| + return; |
| + |
| + m_service->ResetPose(); |
| } |
| VREyeParameters* VRDisplay::getEyeParameters(const String& whichEye) { |
| @@ -239,7 +247,16 @@ ScriptPromise VRDisplay::requestPresent(ScriptState* scriptState, |
| if (firstPresent) { |
| bool secureContext = scriptState->getExecutionContext()->isSecureContext(); |
| - controller()->requestPresent(resolver, m_displayId, secureContext); |
| + if (!m_service) { |
| + DOMException* exception = DOMException::create( |
| + InvalidStateError, "The service is no longer active."); |
| + resolver->reject(exception); |
| + return promise; |
| + } |
| + m_service->RequestPresent( |
| + secureContext, convertToBaseCallback(WTF::bind( |
| + &VRDisplay::onPresentComplete, wrapPersistent(this), |
| + wrapPersistent(resolver)))); |
| } else { |
| updateLayerBounds(); |
| resolver->resolve(); |
| @@ -248,6 +265,18 @@ ScriptPromise VRDisplay::requestPresent(ScriptState* scriptState, |
| return promise; |
| } |
| +void VRDisplay::onPresentComplete(ScriptPromiseResolver* resolver, |
| + bool success) { |
| + if (success) { |
| + this->beginPresent(resolver); |
| + } else { |
| + this->forceExitPresent(); |
| + DOMException* exception = DOMException::create( |
| + NotAllowedError, "Presentation request was denied."); |
| + resolver->reject(exception); |
| + } |
| +} |
| + |
| ScriptPromise VRDisplay::exitPresent(ScriptState* scriptState) { |
| ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
| ScriptPromise promise = resolver->promise(); |
| @@ -260,7 +289,13 @@ ScriptPromise VRDisplay::exitPresent(ScriptState* scriptState) { |
| return promise; |
| } |
| - controller()->exitPresent(m_displayId); |
| + if (!m_service) { |
| + DOMException* exception = |
| + DOMException::create(InvalidStateError, "VRService is not available."); |
| + resolver->reject(exception); |
| + return promise; |
| + } |
| + m_service->ExitPresent(); |
| resolver->resolve(); |
| @@ -340,8 +375,10 @@ void VRDisplay::updateLayerBounds() { |
| rightBounds->height = 1.0f; |
| } |
| - controller()->updateLayerBounds(m_displayId, std::move(leftBounds), |
| - std::move(rightBounds)); |
| + if (!m_service) |
| + return; |
| + |
| + m_service->UpdateLayerBounds(std::move(leftBounds), std::move(rightBounds)); |
| } |
| HeapVector<VRLayer> VRDisplay::getLayers() { |
| @@ -388,10 +425,33 @@ void VRDisplay::submitFrame() { |
| m_renderingContext->restoreColorMask(); |
| m_renderingContext->restoreClearColor(); |
| - controller()->submitFrame(m_displayId, m_framePose.Clone()); |
| + if (!m_service) |
| + return; |
| + |
| + m_service->SubmitFrame(m_framePose.Clone()); |
| m_canUpdateFramePose = true; |
| } |
| +void VRDisplay::OnDisplayChanged(device::blink::VRDisplayPtr display) { |
| + update(display); |
| +} |
| + |
| +void VRDisplay::OnExitPresent() { |
| + forceExitPresent(); |
| +} |
| + |
| +void VRDisplay::OnDisplayConnected(device::blink::VRDisplayPtr display) { |
| + update(display); |
| + |
| + m_navigatorVR->fireVREvent(VRDisplayEvent::create( |
| + EventTypeNames::vrdisplayconnect, true, false, this, "connect")); |
| +} |
| + |
| +void VRDisplay::OnDisplayDisconnected() { |
| + m_navigatorVR->fireVREvent(VRDisplayEvent::create( |
| + EventTypeNames::vrdisplaydisconnect, true, false, this, "disconnect")); |
| +} |
| + |
| void VRDisplay::onFullscreenCheck(TimerBase*) { |
| // TODO: This is a temporary measure to track if fullscreen mode has been |
| // exited by the UA. If so we need to end VR presentation. Soon we won't |
| @@ -402,10 +462,20 @@ void VRDisplay::onFullscreenCheck(TimerBase*) { |
| m_isPresenting = false; |
| m_navigatorVR->fireVRDisplayPresentChange(this); |
| m_fullscreenCheckTimer.stop(); |
| - controller()->exitPresent(m_displayId); |
| + if (!m_service) |
| + return; |
| + m_service->ExitPresent(); |
| } |
| } |
| +void VRDisplay::RegisterDisplayService() { |
| + m_service->RegisterDisplayService(m_binding.CreateInterfacePtrAndBind()); |
|
leonhsl(Using Gerrit)
2016/10/17 09:03:29
As mentioned before, m_binding can only be bound o
shaobo.yan
2016/10/18 01:10:48
Yes. Will update it.
|
| +} |
| + |
| +void VRDisplay::shutdownMessagePipe() { |
| + m_binding.Close(); |
| +} |
| + |
| DEFINE_TRACE(VRDisplay) { |
| visitor->trace(m_navigatorVR); |
| visitor->trace(m_capabilities); |