| 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 1b60be23498139951a0436ac4773af8df5ef63d5..a27fa2028bcae6db3968cf7cb0a54dd74e4531fb 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::GetProxy(&m_service));
|
| + m_service.set_connection_error_handler(convertToBaseCallback(
|
| + WTF::bind(&VRController::dispose, wrapWeakPersistent(this))));
|
| m_service->SetClient(
|
| m_binding.CreateInterfacePtrAndBind(),
|
| convertToBaseCallback(
|
| @@ -33,15 +35,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;
|
| }
|
| @@ -109,6 +106,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) {
|
|
|