| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_H_ |
| #define THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_H_ |
| |
| #include "device/vr/public/mojom/vr_service.mojom-blink.h" |
| #include "mojo/public/cpp/bindings/binding.h" |
| #include "third_party/blink/public/platform/web_callbacks.h" |
| #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" |
| #include "third_party/blink/renderer/core/dom/events/event_target.h" |
| #include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h" |
| #include "third_party/blink/renderer/core/page/focus_changed_observer.h" |
| #include "third_party/blink/renderer/modules/xr/xr_session.h" |
| #include "third_party/blink/renderer/modules/xr/xr_session_creation_options.h" |
| #include "third_party/blink/renderer/platform/heap/handle.h" |
| #include "third_party/blink/renderer/platform/wtf/forward.h" |
| #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" |
| |
| namespace blink { |
| |
| class ScriptPromiseResolver; |
| class XRFrameProvider; |
| |
| class XR final : public EventTargetWithInlineData, |
| public ContextLifecycleObserver, |
| public device::mojom::blink::VRServiceClient, |
| public FocusChangedObserver { |
| DEFINE_WRAPPERTYPEINFO(); |
| USING_GARBAGE_COLLECTED_MIXIN(XR); |
| |
| public: |
| static XR* Create(LocalFrame& frame, int64_t source_id) { |
| return MakeGarbageCollected<XR>(frame, source_id); |
| } |
| |
| explicit XR(LocalFrame& frame, int64_t ukm_source_id_); |
| |
| DEFINE_ATTRIBUTE_EVENT_LISTENER(devicechange, kDevicechange); |
| |
| ScriptPromise supportsSessionMode(ScriptState*, const String&); |
| ScriptPromise requestSession(ScriptState*, const XRSessionCreationOptions*); |
| |
| XRFrameProvider* frameProvider(); |
| |
| const device::mojom::blink::XRDevicePtr& xrDevicePtr() const { |
| return device_; |
| } |
| const device::mojom::blink::XRFrameDataProviderPtr& xrMagicWindowProviderPtr() |
| const { |
| return magic_window_provider_; |
| } |
| const device::mojom::blink::XREnvironmentIntegrationProviderAssociatedPtr& |
| xrEnvironmentProviderPtr(); |
| |
| // VRServiceClient overrides. |
| void OnDeviceChanged() override; |
| |
| // EventTarget overrides. |
| ExecutionContext* GetExecutionContext() const override; |
| const AtomicString& InterfaceName() const override; |
| |
| // ContextLifecycleObserver overrides. |
| void ContextDestroyed(ExecutionContext*) override; |
| void Trace(blink::Visitor*) override; |
| |
| // FocusChangedObserver overrides. |
| void FocusedFrameChanged() override; |
| bool IsFrameFocused(); |
| |
| int64_t GetSourceId() const { return ukm_source_id_; } |
| |
| private: |
| class PendingSessionQuery final |
| : public GarbageCollected<PendingSessionQuery> { |
| WTF_MAKE_NONCOPYABLE(PendingSessionQuery); |
| |
| public: |
| PendingSessionQuery(ScriptPromiseResolver*, XRSession::SessionMode); |
| virtual ~PendingSessionQuery() = default; |
| |
| virtual void Trace(blink::Visitor*); |
| |
| Member<ScriptPromiseResolver> resolver; |
| const XRSession::SessionMode mode; |
| Member<XRPresentationContext> output_context; |
| bool has_user_activation = false; |
| }; |
| |
| const char* checkSessionSupport(const XRSessionCreationOptions*) const; |
| |
| void OnRequestDeviceReturned(device::mojom::blink::XRDevicePtr device); |
| void DispatchPendingSessionCalls(); |
| |
| void DispatchRequestSession(PendingSessionQuery*); |
| void OnRequestSessionReturned(PendingSessionQuery*, |
| device::mojom::blink::XRSessionPtr); |
| |
| void DispatchSupportsSessionMode(PendingSessionQuery*); |
| void OnSupportsSessionReturned(PendingSessionQuery*, bool supports_session); |
| |
| void EnsureDevice(); |
| void ReportImmersiveSupported(bool supported); |
| |
| void AddedEventListener(const AtomicString& event_type, |
| RegisteredEventListener&) override; |
| |
| void Dispose(); |
| |
| bool pending_device_ = false; |
| |
| // Indicates whether use of requestDevice has already been logged. |
| bool did_log_requestDevice_ = false; |
| bool did_log_returned_device_ = false; |
| bool did_log_supports_immersive_ = false; |
| |
| // Indicates whether we've already logged a request for an immersive session. |
| bool did_log_request_immersive_session_ = false; |
| |
| const int64_t ukm_source_id_; |
| |
| // Track calls that were made prior to the internal device successfully being |
| // queried. Can be removed once the service has been updated to allow the |
| // respective calls to be made directly. |
| HeapVector<Member<PendingSessionQuery>> pending_mode_queries_; |
| HeapVector<Member<PendingSessionQuery>> pending_session_requests_; |
| |
| Member<XRFrameProvider> frame_provider_; |
| HeapHashSet<WeakMember<XRSession>> sessions_; |
| device::mojom::blink::VRServicePtr service_; |
| device::mojom::blink::XRDevicePtr device_; |
| device::mojom::blink::XRFrameDataProviderPtr magic_window_provider_; |
| device::mojom::blink::XREnvironmentIntegrationProviderAssociatedPtr |
| environment_provider_; |
| mojo::Binding<device::mojom::blink::VRServiceClient> binding_; |
| }; |
| |
| } // namespace blink |
| |
| #endif // THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_H_ |