| 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 52a020797bd6e61201aa725781c1f57808606a7f..72d06a160834b3d7e724502672b554b9c144aa20 100644
|
| --- a/third_party/WebKit/Source/modules/vr/VRController.cpp
|
| +++ b/third_party/WebKit/Source/modules/vr/VRController.cpp
|
| @@ -23,6 +23,8 @@ VRController::VRController(NavigatorVR* navigatorVR)
|
| m_binding(this) {
|
| navigatorVR->document()->frame()->interfaceProvider()->getInterface(
|
| mojo::MakeRequest(&m_service));
|
| + m_service.set_connection_error_handler(convertToBaseCallback(
|
| + WTF::bind(&VRController::dispose, wrapWeakPersistent(this))));
|
| m_service->SetClient(
|
| m_binding.CreateInterfacePtrAndBind(),
|
| convertToBaseCallback(
|
| @@ -32,15 +34,10 @@ VRController::VRController(NavigatorVR* navigatorVR)
|
| VRController::~VRController() {}
|
|
|
| void VRController::getDisplays(ScriptPromiseResolver* resolver) {
|
| - if (!m_service) {
|
| - DOMException* exception = DOMException::create(
|
| - InvalidStateError, "The service is no longer active.");
|
| - resolver->reject(exception);
|
| - return;
|
| - }
|
| -
|
| - // If we've previously synced the VRDisplays just return the current list.
|
| - if (m_displaySynced) {
|
| + // If we've previously synced the VRDisplays or no longer have a valid service
|
| + // connection just return the current list. In the case of the service being
|
| + // disconnected this will be an empty array.
|
| + if (!m_service || m_displaySynced) {
|
| resolver->resolve(m_displays);
|
| return;
|
| }
|
| @@ -106,6 +103,11 @@ void VRController::dispose() {
|
| // Shutdown all displays' message pipe
|
| for (size_t i = 0; i < m_displays.size(); ++i)
|
| m_displays[i]->dispose();
|
| +
|
| + m_displays.clear();
|
| +
|
| + // Ensure that any outstanding getDisplays promises are resolved.
|
| + onGetDisplays();
|
| }
|
|
|
| DEFINE_TRACE(VRController) {
|
|
|