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

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

Issue 2167643003: Refactored VRService interaction and added VRServiceClient (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Liberal sprinkling of 'u's Created 4 years, 5 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 455d7006905e9c9198af59a550dd4713c2a13cfe..a11b23eb95555747a65c3282bc9dbc7ff62c87dc 100644
--- a/third_party/WebKit/Source/modules/vr/VRController.cpp
+++ b/third_party/WebKit/Source/modules/vr/VRController.cpp
@@ -4,48 +4,39 @@
#include "modules/vr/VRController.h"
+#include "core/dom/DOMException.h"
+#include "core/dom/Document.h"
#include "core/frame/LocalFrame.h"
+#include "modules/vr/NavigatorVR.h"
#include "modules/vr/VRGetDevicesCallback.h"
-#include "platform/RuntimeEnabledFeatures.h"
-#include "platform/mojo/MojoHelper.h"
#include "public/platform/ServiceRegistry.h"
-namespace blink {
-
-VRController::~VRController()
-{
-}
+#include "wtf/Assertions.h"
-void VRController::provideTo(LocalFrame& frame, ServiceRegistry* registry)
-{
- ASSERT(RuntimeEnabledFeatures::webVREnabled());
- Supplement<LocalFrame>::provideTo(frame, supplementName(), registry ? new VRController(frame, registry) : nullptr);
-}
-
-VRController* VRController::from(LocalFrame& frame)
-{
- return static_cast<VRController*>(Supplement<LocalFrame>::from(frame, supplementName()));
-}
+namespace blink {
-VRController::VRController(LocalFrame& frame, ServiceRegistry* registry)
+VRController::VRController(NavigatorVR* navigatorVR)
+ : ContextLifecycleObserver(navigatorVR->document())
+ , m_navigatorVR(navigatorVR)
+ , m_binding(this)
{
- ASSERT(!m_service.is_bound());
- registry->connectToRemoteService(mojo::GetProxy(&m_service));
+ navigatorVR->document()->frame()->serviceRegistry()->connectToRemoteService(mojo::GetProxy(&m_service));
+ m_service->SetClient(m_binding.CreateInterfacePtrAndBind());
}
-const char* VRController::supplementName()
+VRController::~VRController()
{
- return "VRController";
}
-void VRController::getDisplays(std::unique_ptr<VRGetDevicesCallback> callback)
+void VRController::getDisplays(ScriptPromiseResolver* resolver)
{
if (!m_service) {
- callback->onError();
+ DOMException* exception = DOMException::create(InvalidStateError, "The service is no longer active.");
+ resolver->reject(exception);
return;
}
- m_pendingGetDevicesCallbacks.append(std::move(callback));
+ m_pendingGetDevicesCallbacks.append(WTF::wrapUnique(new VRGetDevicesCallback(resolver)));
m_service->GetDisplays(convertToBaseCallback(WTF::bind(&VRController::onGetDisplays, wrapPersistent(this))));
}
@@ -63,21 +54,84 @@ void VRController::resetPose(unsigned index)
{
if (!m_service)
return;
+
m_service->ResetPose(index);
}
+VRDisplay* VRController::createOrUpdateDisplay(const device::blink::VRDisplayPtr& display)
+{
+ VRDisplay* vrDisplay = getDisplayForIndex(display->index);
+ if (!vrDisplay) {
+ vrDisplay = new VRDisplay(m_navigatorVR);
+ m_displays.append(vrDisplay);
+ }
+
+ vrDisplay->update(display);
+ return vrDisplay;
+}
+
+VRDisplayVector VRController::updateDisplays(mojo::WTFArray<device::blink::VRDisplayPtr> displays)
+{
+ VRDisplayVector vrDisplays;
+
+ for (const auto& display : displays.PassStorage()) {
+ VRDisplay* vrDisplay = createOrUpdateDisplay(display);
+ vrDisplays.append(vrDisplay);
+ }
+
+ return vrDisplays;
+}
+
+VRDisplay* VRController::getDisplayForIndex(unsigned index)
+{
+ VRDisplay* display;
+ for (size_t i = 0; i < m_displays.size(); ++i) {
+ display = m_displays[i];
+ if (display->displayId() == index) {
+ return display;
+ }
+ }
+
+ return 0;
+}
+
void VRController::onGetDisplays(mojo::WTFArray<device::blink::VRDisplayPtr> displays)
{
+ VRDisplayVector outDisplays = updateDisplays(std::move(displays));
+
std::unique_ptr<VRGetDevicesCallback> callback = m_pendingGetDevicesCallbacks.takeFirst();
if (!callback)
return;
- callback->onSuccess(std::move(displays));
+ callback->onSuccess(outDisplays);
+}
+
+void VRController::OnDisplayChanged(device::blink::VRDisplayPtr display)
+{
+ VRDisplay* vrDisplay = getDisplayForIndex(display->index);
+ if (!vrDisplay)
+ return;
+
+ vrDisplay->update(display);
+}
+
+void VRController::contextDestroyed()
+{
+ // If the document context was destroyed, shut down the client connection
+ // and never call the mojo service again.
+ m_binding.Close();
+ m_service.reset();
+
+ // The context is not automatically cleared, so do it manually.
+ ContextLifecycleObserver::clearContext();
}
DEFINE_TRACE(VRController)
{
- Supplement<LocalFrame>::trace(visitor);
+ visitor->trace(m_navigatorVR);
+ visitor->trace(m_displays);
+
+ ContextLifecycleObserver::trace(visitor);
}
} // namespace blink
« no previous file with comments | « third_party/WebKit/Source/modules/vr/VRController.h ('k') | third_party/WebKit/Source/modules/vr/VRDisplay.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698