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

Side by Side 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, 4 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/vr/VRController.h" 5 #include "modules/vr/VRController.h"
6 6
7 #include "core/dom/DOMException.h"
8 #include "core/dom/Document.h"
7 #include "core/frame/LocalFrame.h" 9 #include "core/frame/LocalFrame.h"
10 #include "modules/vr/NavigatorVR.h"
8 #include "modules/vr/VRGetDevicesCallback.h" 11 #include "modules/vr/VRGetDevicesCallback.h"
9 #include "platform/RuntimeEnabledFeatures.h"
10 #include "platform/mojo/MojoHelper.h"
11 #include "public/platform/ServiceRegistry.h" 12 #include "public/platform/ServiceRegistry.h"
12 13
14 #include "wtf/Assertions.h"
15
13 namespace blink { 16 namespace blink {
14 17
18 VRController::VRController(NavigatorVR* navigatorVR)
19 : ContextLifecycleObserver(navigatorVR->document())
20 , m_navigatorVR(navigatorVR)
21 , m_binding(this)
22 {
23 navigatorVR->document()->frame()->serviceRegistry()->connectToRemoteService( mojo::GetProxy(&m_service));
24 m_service->SetClient(m_binding.CreateInterfacePtrAndBind());
25 }
26
15 VRController::~VRController() 27 VRController::~VRController()
16 { 28 {
17 } 29 }
18 30
19 void VRController::provideTo(LocalFrame& frame, ServiceRegistry* registry) 31 void VRController::getDisplays(ScriptPromiseResolver* resolver)
20 {
21 ASSERT(RuntimeEnabledFeatures::webVREnabled());
22 Supplement<LocalFrame>::provideTo(frame, supplementName(), registry ? new VR Controller(frame, registry) : nullptr);
23 }
24
25 VRController* VRController::from(LocalFrame& frame)
26 {
27 return static_cast<VRController*>(Supplement<LocalFrame>::from(frame, supple mentName()));
28 }
29
30 VRController::VRController(LocalFrame& frame, ServiceRegistry* registry)
31 {
32 ASSERT(!m_service.is_bound());
33 registry->connectToRemoteService(mojo::GetProxy(&m_service));
34 }
35
36 const char* VRController::supplementName()
37 {
38 return "VRController";
39 }
40
41 void VRController::getDisplays(std::unique_ptr<VRGetDevicesCallback> callback)
42 { 32 {
43 if (!m_service) { 33 if (!m_service) {
44 callback->onError(); 34 DOMException* exception = DOMException::create(InvalidStateError, "The s ervice is no longer active.");
35 resolver->reject(exception);
45 return; 36 return;
46 } 37 }
47 38
48 m_pendingGetDevicesCallbacks.append(std::move(callback)); 39 m_pendingGetDevicesCallbacks.append(WTF::wrapUnique(new VRGetDevicesCallback (resolver)));
49 m_service->GetDisplays(convertToBaseCallback(WTF::bind(&VRController::onGetD isplays, wrapPersistent(this)))); 40 m_service->GetDisplays(convertToBaseCallback(WTF::bind(&VRController::onGetD isplays, wrapPersistent(this))));
50 } 41 }
51 42
52 device::blink::VRPosePtr VRController::getPose(unsigned index) 43 device::blink::VRPosePtr VRController::getPose(unsigned index)
53 { 44 {
54 if (!m_service) 45 if (!m_service)
55 return nullptr; 46 return nullptr;
56 47
57 device::blink::VRPosePtr pose; 48 device::blink::VRPosePtr pose;
58 m_service->GetPose(index, &pose); 49 m_service->GetPose(index, &pose);
59 return pose; 50 return pose;
60 } 51 }
61 52
62 void VRController::resetPose(unsigned index) 53 void VRController::resetPose(unsigned index)
63 { 54 {
64 if (!m_service) 55 if (!m_service)
65 return; 56 return;
57
66 m_service->ResetPose(index); 58 m_service->ResetPose(index);
67 } 59 }
68 60
61 VRDisplay* VRController::createOrUpdateDisplay(const device::blink::VRDisplayPtr & display)
62 {
63 VRDisplay* vrDisplay = getDisplayForIndex(display->index);
64 if (!vrDisplay) {
65 vrDisplay = new VRDisplay(m_navigatorVR);
66 m_displays.append(vrDisplay);
67 }
68
69 vrDisplay->update(display);
70 return vrDisplay;
71 }
72
73 VRDisplayVector VRController::updateDisplays(mojo::WTFArray<device::blink::VRDis playPtr> displays)
74 {
75 VRDisplayVector vrDisplays;
76
77 for (const auto& display : displays.PassStorage()) {
78 VRDisplay* vrDisplay = createOrUpdateDisplay(display);
79 vrDisplays.append(vrDisplay);
80 }
81
82 return vrDisplays;
83 }
84
85 VRDisplay* VRController::getDisplayForIndex(unsigned index)
86 {
87 VRDisplay* display;
88 for (size_t i = 0; i < m_displays.size(); ++i) {
89 display = m_displays[i];
90 if (display->displayId() == index) {
91 return display;
92 }
93 }
94
95 return 0;
96 }
97
69 void VRController::onGetDisplays(mojo::WTFArray<device::blink::VRDisplayPtr> dis plays) 98 void VRController::onGetDisplays(mojo::WTFArray<device::blink::VRDisplayPtr> dis plays)
70 { 99 {
100 VRDisplayVector outDisplays = updateDisplays(std::move(displays));
101
71 std::unique_ptr<VRGetDevicesCallback> callback = m_pendingGetDevicesCallback s.takeFirst(); 102 std::unique_ptr<VRGetDevicesCallback> callback = m_pendingGetDevicesCallback s.takeFirst();
72 if (!callback) 103 if (!callback)
73 return; 104 return;
74 105
75 callback->onSuccess(std::move(displays)); 106 callback->onSuccess(outDisplays);
107 }
108
109 void VRController::OnDisplayChanged(device::blink::VRDisplayPtr display)
110 {
111 VRDisplay* vrDisplay = getDisplayForIndex(display->index);
112 if (!vrDisplay)
113 return;
114
115 vrDisplay->update(display);
116 }
117
118 void VRController::contextDestroyed()
119 {
120 // If the document context was destroyed, shut down the client connection
121 // and never call the mojo service again.
122 m_binding.Close();
123 m_service.reset();
124
125 // The context is not automatically cleared, so do it manually.
126 ContextLifecycleObserver::clearContext();
76 } 127 }
77 128
78 DEFINE_TRACE(VRController) 129 DEFINE_TRACE(VRController)
79 { 130 {
80 Supplement<LocalFrame>::trace(visitor); 131 visitor->trace(m_navigatorVR);
132 visitor->trace(m_displays);
133
134 ContextLifecycleObserver::trace(visitor);
81 } 135 }
82 136
83 } // namespace blink 137 } // namespace blink
OLDNEW
« 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