Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(996)

Unified Diff: third_party/WebKit/Source/modules/vr/VRController.cpp

Issue 2614873002: Ensure navigator.getVRDisplays always resolves. (Closed)
Patch Set: Removed some unneeded includes in test Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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) {

Powered by Google App Engine
This is Rietveld 408576698