Changeset 283880 in webkit
- Timestamp:
- Oct 10, 2021, 4:05:00 PM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 10 edited
-
ChangeLog (modified) (1 diff)
-
Modules/webxr/WebXRBoundedReferenceSpace.cpp (modified) (5 diffs)
-
Modules/webxr/WebXRBoundedReferenceSpace.h (modified) (1 diff)
-
Modules/webxr/WebXRFrame.cpp (modified) (2 diffs)
-
Modules/webxr/WebXRInputSpace.cpp (modified) (2 diffs)
-
Modules/webxr/WebXRInputSpace.h (modified) (1 diff)
-
Modules/webxr/WebXRReferenceSpace.cpp (modified) (5 diffs)
-
Modules/webxr/WebXRReferenceSpace.h (modified) (3 diffs)
-
Modules/webxr/WebXRSpace.cpp (modified) (3 diffs)
-
Modules/webxr/WebXRSpace.h (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r283879 r283880 1 2021-10-09 Dean Jackson <dino@apple.com> 2 3 [WebXR] Replace the session reference in WebXRSpace subclasses with weak pointers 4 https://bugs.webkit.org/show_bug.cgi?id=231482 5 6 Reviewed by Sam Weinig. 7 8 WebXRSpace had a pure virtual session() accessor that returned a 9 reference to a WebXRSession. This made subclasses hold strong 10 references to the WebXRSession, and is problematic for WebXRSpace 11 subclasses that are (indirectly) owned by the WebXRSession. 12 13 Change the accessor to return a pointer, and all the subclasses 14 to use weak pointers instead. 15 16 * Modules/webxr/WebXRBoundedReferenceSpace.h: Use a WeakPtr and change 17 the constructor parameter to take a reference instead of a Ref<>. 18 * Modules/webxr/WebXRBoundedReferenceSpace.cpp: 19 (WebCore::WebXRBoundedReferenceSpace::create): 20 (WebCore::WebXRBoundedReferenceSpace::WebXRBoundedReferenceSpace): 21 (WebCore::WebXRBoundedReferenceSpace::getOffsetReferenceSpace): 22 (WebCore::WebXRBoundedReferenceSpace::updateIfNeeded): Add early return. 23 24 * Modules/webxr/WebXRFrame.cpp: 25 (WebCore::WebXRFrame::populatePose): Compare pointers directly. 26 27 * Modules/webxr/WebXRInputSpace.h: Use WeakPtr. 28 * Modules/webxr/WebXRInputSpace.cpp: 29 (WebCore::WebXRInputSpace::WebXRInputSpace): 30 (WebCore::WebXRInputSpace::nativeOrigin const): Change this to return an 31 optional so we can detect errors and raise Exceptions. 32 33 * Modules/webxr/WebXRReferenceSpace.h: Use a WeakPtr and change 34 the constructor parameter to take a reference instead of a Ref<>. 35 * Modules/webxr/WebXRReferenceSpace.cpp: 36 (WebCore::WebXRReferenceSpace::create): 37 (WebCore::WebXRReferenceSpace::WebXRReferenceSpace): 38 (WebCore::WebXRReferenceSpace::nativeOrigin const): Return an optional. 39 (WebCore::WebXRReferenceSpace::getOffsetReferenceSpace): 40 (WebCore::WebXRReferenceSpace::floorOriginTransform const): Return an optional. 41 42 * Modules/webxr/WebXRSpace.cpp: Return a * instead of a &. 43 (WebCore::WebXRSpace::isPositionEmulated const): 44 (WebCore::WebXRViewerSpace::WebXRViewerSpace): 45 (WebCore::WebXRViewerSpace::nativeOrigin const): 46 * Modules/webxr/WebXRSpace.h: 47 1 48 2021-10-10 Alan Bujtas <zalan@apple.com> 2 49 -
trunk/Source/WebCore/Modules/webxr/WebXRBoundedReferenceSpace.cpp
r278562 r283880 45 45 WTF_MAKE_ISO_ALLOCATED_IMPL(WebXRBoundedReferenceSpace); 46 46 47 Ref<WebXRBoundedReferenceSpace> WebXRBoundedReferenceSpace::create(Document& document, Ref<WebXRSession>&& session, XRReferenceSpaceType type)47 Ref<WebXRBoundedReferenceSpace> WebXRBoundedReferenceSpace::create(Document& document, WebXRSession& session, XRReferenceSpaceType type) 48 48 { 49 return adoptRef(*new WebXRBoundedReferenceSpace(document, WTFMove(session), WebXRRigidTransform::create(), type));49 return adoptRef(*new WebXRBoundedReferenceSpace(document, session, WebXRRigidTransform::create(), type)); 50 50 } 51 51 52 Ref<WebXRBoundedReferenceSpace> WebXRBoundedReferenceSpace::create(Document& document, Ref<WebXRSession>&& session, Ref<WebXRRigidTransform>&& offset, XRReferenceSpaceType type)52 Ref<WebXRBoundedReferenceSpace> WebXRBoundedReferenceSpace::create(Document& document, WebXRSession& session, Ref<WebXRRigidTransform>&& offset, XRReferenceSpaceType type) 53 53 { 54 return adoptRef(*new WebXRBoundedReferenceSpace(document, WTFMove(session), WTFMove(offset), type));54 return adoptRef(*new WebXRBoundedReferenceSpace(document, session, WTFMove(offset), type)); 55 55 } 56 56 57 WebXRBoundedReferenceSpace::WebXRBoundedReferenceSpace(Document& document, Ref<WebXRSession>&& session, Ref<WebXRRigidTransform>&& offset, XRReferenceSpaceType type)58 : WebXRReferenceSpace(document, WTFMove(session), WTFMove(offset), type)57 WebXRBoundedReferenceSpace::WebXRBoundedReferenceSpace(Document& document, WebXRSession& session, Ref<WebXRRigidTransform>&& offset, XRReferenceSpaceType type) 58 : WebXRReferenceSpace(document, session, WTFMove(offset), type) 59 59 { 60 60 } … … 62 62 WebXRBoundedReferenceSpace::~WebXRBoundedReferenceSpace() = default; 63 63 64 TransformationMatrixWebXRBoundedReferenceSpace::nativeOrigin() const64 std::optional<TransformationMatrix> WebXRBoundedReferenceSpace::nativeOrigin() const 65 65 { 66 66 // https://immersive-web.github.io/webxr/#dom-xrreferencespacetype-bounded-floor. … … 77 77 ExceptionOr<Ref<WebXRReferenceSpace>> WebXRBoundedReferenceSpace::getOffsetReferenceSpace(const WebXRRigidTransform& offsetTransform) 78 78 { 79 if (!m_session) 80 return Exception { InvalidStateError }; 81 79 82 auto* document = downcast<Document>(scriptExecutionContext()); 80 83 if (!document) … … 85 88 auto offset = WebXRRigidTransform::create(originOffset().rawTransform() * offsetTransform.rawTransform()); 86 89 87 return { create(*document, m_session.copyRef(), WTFMove(offset), m_type) };90 return { create(*document, *m_session.get(), WTFMove(offset), m_type) }; 88 91 } 89 92 … … 91 94 void WebXRBoundedReferenceSpace::updateIfNeeded() 92 95 { 96 if (!m_session) 97 return; 98 93 99 auto& frameData = m_session->frameData(); 94 100 if (frameData.stageParameters.id == m_lastUpdateId) -
trunk/Source/WebCore/Modules/webxr/WebXRBoundedReferenceSpace.h
r277251 r283880 40 40 WTF_MAKE_ISO_ALLOCATED(WebXRBoundedReferenceSpace); 41 41 public: 42 static Ref<WebXRBoundedReferenceSpace> create(Document&, Ref<WebXRSession>&&, XRReferenceSpaceType);43 static Ref<WebXRBoundedReferenceSpace> create(Document&, Ref<WebXRSession>&&, Ref<WebXRRigidTransform>&&, XRReferenceSpaceType);42 static Ref<WebXRBoundedReferenceSpace> create(Document&, WebXRSession&, XRReferenceSpaceType); 43 static Ref<WebXRBoundedReferenceSpace> create(Document&, WebXRSession&, Ref<WebXRRigidTransform>&&, XRReferenceSpaceType); 44 44 45 45 virtual ~WebXRBoundedReferenceSpace(); 46 46 47 TransformationMatrixnativeOrigin() const final;47 std::optional<TransformationMatrix> nativeOrigin() const final; 48 48 const Vector<Ref<DOMPointReadOnly>>& boundsGeometry(); 49 49 ExceptionOr<Ref<WebXRReferenceSpace>> getOffsetReferenceSpace(const WebXRRigidTransform&) final; 50 50 51 51 private: 52 WebXRBoundedReferenceSpace(Document&, Ref<WebXRSession>&&, Ref<WebXRRigidTransform>&&, XRReferenceSpaceType);52 WebXRBoundedReferenceSpace(Document&, WebXRSession&, Ref<WebXRRigidTransform>&&, XRReferenceSpaceType); 53 53 54 54 bool isBoundedReferenceSpace() const final { return true; } -
trunk/Source/WebCore/Modules/webxr/WebXRFrame.cpp
r282755 r283880 105 105 // 2. Let session be frame’s session object. 106 106 // 3. If space’s session does not equal session, throw an InvalidStateError and abort these steps. 107 if ( &space.session() != m_session.ptr())107 if (space.session() != m_session.ptr()) 108 108 return Exception { InvalidStateError }; 109 109 110 110 // 4. If baseSpace’s session does not equal session, throw an InvalidStateError and abort these steps. 111 if ( &baseSpace.session() != m_session.ptr())111 if (baseSpace.session() != m_session.ptr()) 112 112 return Exception { InvalidStateError }; 113 113 … … 128 128 129 129 auto baseTransform = baseSpace.effectiveOrigin(); 130 if (!baseTransform.isInvertible()) 130 if (!baseTransform) 131 return Exception { InvalidStateError }; 132 133 if (!baseTransform.value().isInvertible()) 131 134 return { std::nullopt }; 132 135 133 auto transform = *baseTransform.inverse() * space.effectiveOrigin(); 134 bool emulatedPosition = space.isPositionEmulated() || baseSpace.isPositionEmulated(); 136 auto effectiveOrigin = space.effectiveOrigin(); 137 if (!effectiveOrigin) 138 return Exception { InvalidStateError }; 139 140 auto transform = *baseTransform.value().inverse() * effectiveOrigin.value(); 141 142 auto isPositionEmulated = space.isPositionEmulated(); 143 if (!isPositionEmulated) 144 return Exception { InvalidStateError }; 145 146 auto baseSpaceIsPositionEmulated = baseSpace.isPositionEmulated(); 147 if (!baseSpaceIsPositionEmulated) 148 return Exception { InvalidStateError }; 149 150 bool emulatedPosition = isPositionEmulated.value() || baseSpaceIsPositionEmulated.value(); 135 151 136 152 bool limit = mustPosesBeLimited(space, baseSpace); -
trunk/Source/WebCore/Modules/webxr/WebXRInputSpace.cpp
r277251 r283880 47 47 WebXRInputSpace::WebXRInputSpace(Document& document, WebXRSession& session, const PlatformXR::Device::FrameData::InputSourcePose& pose) 48 48 : WebXRSpace(document, WebXRRigidTransform::create()) 49 , m_session( session)49 , m_session(makeWeakPtr(&session)) 50 50 , m_pose(pose) 51 51 { … … 54 54 WebXRInputSpace::~WebXRInputSpace() = default; 55 55 56 TransformationMatrixWebXRInputSpace::nativeOrigin() const56 std::optional<TransformationMatrix> WebXRInputSpace::nativeOrigin() const 57 57 { 58 58 return WebXRFrame::matrixFromPose(m_pose.pose); -
trunk/Source/WebCore/Modules/webxr/WebXRInputSpace.h
r277251 r283880 45 45 using RefCounted<WebXRInputSpace>::deref; 46 46 47 boolisPositionEmulated() const final { return m_pose.isPositionEmulated; }47 std::optional<bool> isPositionEmulated() const final { return m_pose.isPositionEmulated; } 48 48 void setPose(const PlatformXR::Device::FrameData::InputSourcePose& pose) { m_pose = pose; } 49 49 50 50 private: 51 51 WebXRInputSpace(Document&, WebXRSession&, const PlatformXR::Device::FrameData::InputSourcePose&); 52 WebXRSession &session() const final { return m_session.get(); }53 TransformationMatrixnativeOrigin() const final;52 WebXRSession* session() const final { return m_session.get(); } 53 std::optional<TransformationMatrix> nativeOrigin() const final; 54 54 55 55 void refEventTarget() final { ref(); } 56 56 void derefEventTarget() final { deref(); } 57 57 58 Ref<WebXRSession> m_session;58 WeakPtr<WebXRSession> m_session; 59 59 PlatformXR::Device::FrameData::InputSourcePose m_pose; 60 60 }; -
trunk/Source/WebCore/Modules/webxr/WebXRReferenceSpace.cpp
r273957 r283880 41 41 WTF_MAKE_ISO_ALLOCATED_IMPL(WebXRReferenceSpace); 42 42 43 Ref<WebXRReferenceSpace> WebXRReferenceSpace::create(Document& document, Ref<WebXRSession>&& session, XRReferenceSpaceType type)43 Ref<WebXRReferenceSpace> WebXRReferenceSpace::create(Document& document, WebXRSession& session, XRReferenceSpaceType type) 44 44 { 45 45 // https://immersive-web.github.io/webxr/#xrspace-native-origin … … 47 47 // defined by an origin offset, which is an XRRigidTransform initially set 48 48 // to an identity transform. 49 return adoptRef(*new WebXRReferenceSpace(document, WTFMove(session), WebXRRigidTransform::create(), type));49 return adoptRef(*new WebXRReferenceSpace(document, session, WebXRRigidTransform::create(), type)); 50 50 } 51 51 52 Ref<WebXRReferenceSpace> WebXRReferenceSpace::create(Document& document, Ref<WebXRSession>&& session, Ref<WebXRRigidTransform>&& offset, XRReferenceSpaceType type)52 Ref<WebXRReferenceSpace> WebXRReferenceSpace::create(Document& document, WebXRSession& session, Ref<WebXRRigidTransform>&& offset, XRReferenceSpaceType type) 53 53 { 54 return adoptRef(*new WebXRReferenceSpace(document, WTFMove(session), WTFMove(offset), type));54 return adoptRef(*new WebXRReferenceSpace(document, session, WTFMove(offset), type)); 55 55 } 56 56 57 WebXRReferenceSpace::WebXRReferenceSpace(Document& document, Ref<WebXRSession>&& session, Ref<WebXRRigidTransform>&& offset, XRReferenceSpaceType type)57 WebXRReferenceSpace::WebXRReferenceSpace(Document& document, WebXRSession& session, Ref<WebXRRigidTransform>&& offset, XRReferenceSpaceType type) 58 58 : WebXRSpace(document, WTFMove(offset)) 59 , m_session( WTFMove(session))59 , m_session(makeWeakPtr(session)) 60 60 , m_type(type) 61 61 { … … 65 65 66 66 67 TransformationMatrixWebXRReferenceSpace::nativeOrigin() const67 std::optional<TransformationMatrix> WebXRReferenceSpace::nativeOrigin() const 68 68 { 69 if (!m_session) 70 return std::nullopt; 71 69 72 TransformationMatrix identity; 70 73 … … 91 94 // BoundedFloor is handled by WebXRBoundedReferenceSpace subclass 92 95 RELEASE_ASSERT_NOT_REACHED(); 96 return std::nullopt; 93 97 } 94 95 return identity;96 98 } 97 99 98 100 ExceptionOr<Ref<WebXRReferenceSpace>> WebXRReferenceSpace::getOffsetReferenceSpace(const WebXRRigidTransform& offsetTransform) 99 101 { 102 if (!m_session) 103 return Exception { InvalidStateError }; 104 100 105 auto* document = downcast<Document>(scriptExecutionContext()); 101 106 if (!document) … … 106 111 auto offset = WebXRRigidTransform::create(originOffset().rawTransform() * offsetTransform.rawTransform()); 107 112 108 return create(*document, m_session.copyRef(), WTFMove(offset), m_type);113 return create(*document, *m_session.get(), WTFMove(offset), m_type); 109 114 } 110 115 111 TransformationMatrixWebXRReferenceSpace::floorOriginTransform() const116 std::optional<TransformationMatrix> WebXRReferenceSpace::floorOriginTransform() const 112 117 { 118 if (!m_session) 119 return std::nullopt; 120 113 121 auto& data = m_session->frameData(); 114 122 if (!data.floorTransform) { -
trunk/Source/WebCore/Modules/webxr/WebXRReferenceSpace.h
r273957 r283880 32 32 #include <wtf/IsoMalloc.h> 33 33 #include <wtf/Ref.h> 34 #include <wtf/WeakPtr.h> 34 35 35 36 namespace WebCore { … … 41 42 WTF_MAKE_ISO_ALLOCATED(WebXRReferenceSpace); 42 43 public: 43 static Ref<WebXRReferenceSpace> create(Document&, Ref<WebXRSession>&&, XRReferenceSpaceType);44 static Ref<WebXRReferenceSpace> create(Document&, Ref<WebXRSession>&&, Ref<WebXRRigidTransform>&&, XRReferenceSpaceType);44 static Ref<WebXRReferenceSpace> create(Document&, WebXRSession&, XRReferenceSpaceType); 45 static Ref<WebXRReferenceSpace> create(Document&, WebXRSession&, Ref<WebXRRigidTransform>&&, XRReferenceSpaceType); 45 46 46 47 virtual ~WebXRReferenceSpace(); … … 49 50 using RefCounted<WebXRReferenceSpace>::deref; 50 51 51 WebXRSession &session() const final { return m_session.get(); }52 TransformationMatrixnativeOrigin() const override;52 WebXRSession* session() const final { return m_session.get(); } 53 std::optional<TransformationMatrix> nativeOrigin() const override; 53 54 virtual ExceptionOr<Ref<WebXRReferenceSpace>> getOffsetReferenceSpace(const WebXRRigidTransform&); 54 55 XRReferenceSpaceType type() const { return m_type; } 55 56 56 57 protected: 57 WebXRReferenceSpace(Document&, Ref<WebXRSession>&&, Ref<WebXRRigidTransform>&&, XRReferenceSpaceType);58 WebXRReferenceSpace(Document&, WebXRSession&, Ref<WebXRRigidTransform>&&, XRReferenceSpaceType); 58 59 59 60 bool isReferenceSpace() const final { return true; } 60 61 61 TransformationMatrixfloorOriginTransform() const;62 std::optional<TransformationMatrix> floorOriginTransform() const; 62 63 63 Ref<WebXRSession> m_session;64 WeakPtr<WebXRSession> m_session; 64 65 XRReferenceSpaceType m_type; 65 66 -
trunk/Source/WebCore/Modules/webxr/WebXRSpace.cpp
r278563 r283880 47 47 WebXRSpace::~WebXRSpace() = default; 48 48 49 TransformationMatrixWebXRSpace::effectiveOrigin() const49 std::optional<TransformationMatrix> WebXRSpace::effectiveOrigin() const 50 50 { 51 51 // https://immersive-web.github.io/webxr/#xrspace-effective-origin 52 52 // The effective origin can be obtained by multiplying origin offset and the native origin. 53 return nativeOrigin() * m_originOffset->rawTransform(); 53 auto origin = nativeOrigin(); 54 if (!origin) 55 return std::nullopt; 56 return origin.value() * m_originOffset->rawTransform(); 54 57 } 55 58 56 59 57 boolWebXRSpace::isPositionEmulated() const60 std::optional<bool> WebXRSpace::isPositionEmulated() const 58 61 { 59 return session().isPositionEmulated(); 62 WebXRSession* xrSession = session(); 63 if (!xrSession) 64 return std::nullopt; 65 66 return xrSession->isPositionEmulated(); 60 67 } 61 68 … … 64 71 WebXRViewerSpace::WebXRViewerSpace(Document& document, WebXRSession& session) 65 72 : WebXRSpace(document, WebXRRigidTransform::create()) 66 , m_session( session)73 , m_session(makeWeakPtr(&session)) 67 74 { 68 75 } … … 70 77 WebXRViewerSpace::~WebXRViewerSpace() = default; 71 78 72 TransformationMatrixWebXRViewerSpace::nativeOrigin() const79 std::optional<TransformationMatrix> WebXRViewerSpace::nativeOrigin() const 73 80 { 74 return WebXRFrame::matrixFromPose(m_session.frameData().origin); 81 if (!m_session) 82 return std::nullopt; 83 return WebXRFrame::matrixFromPose(m_session->frameData().origin); 75 84 } 76 85 -
trunk/Source/WebCore/Modules/webxr/WebXRSpace.h
r276433 r283880 31 31 #include "EventTarget.h" 32 32 #include "TransformationMatrix.h" 33 #include "WebXRSession.h" 33 34 #include <wtf/RefCounted.h> 34 35 … … 38 39 class ScriptExecutionContext; 39 40 class WebXRRigidTransform; 40 class WebXRSession;41 41 42 42 class WebXRSpace : public EventTargetWithInlineData, public ContextDestructionObserver { … … 45 45 virtual ~WebXRSpace(); 46 46 47 virtual WebXRSession &session() const = 0;48 virtual TransformationMatrixnativeOrigin() const = 0;49 TransformationMatrixeffectiveOrigin() const;50 virtual boolisPositionEmulated() const;47 virtual WebXRSession* session() const = 0; 48 virtual std::optional<TransformationMatrix> nativeOrigin() const = 0; 49 std::optional<TransformationMatrix> effectiveOrigin() const; 50 virtual std::optional<bool> isPositionEmulated() const; 51 51 52 52 virtual bool isReferenceSpace() const { return false; } … … 78 78 79 79 private: 80 WebXRSession & session() const final { return m_session; }81 TransformationMatrixnativeOrigin() const final;80 WebXRSession* session() const final { return m_session.get(); } 81 std::optional<TransformationMatrix> nativeOrigin() const final; 82 82 83 83 void refEventTarget() final { RELEASE_ASSERT_NOT_REACHED(); } 84 84 void derefEventTarget() final { RELEASE_ASSERT_NOT_REACHED(); } 85 85 86 We bXRSession&m_session;86 WeakPtr<WebXRSession> m_session; 87 87 }; 88 88
Note:
See TracChangeset
for help on using the changeset viewer.