1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef MOZILLA_DOM_OFFSCREENCANVAS_H_
8 #define MOZILLA_DOM_OFFSCREENCANVAS_H_
11 #include "mozilla/dom/CanvasRenderingContextHelper.h"
12 #include "mozilla/dom/ImageEncoder.h"
13 #include "mozilla/dom/OffscreenCanvasDisplayHelper.h"
14 #include "mozilla/DOMEventTargetHelper.h"
15 #include "mozilla/layers/LayersTypes.h"
16 #include "mozilla/Maybe.h"
17 #include "mozilla/RefPtr.h"
18 #include "mozilla/UniquePtr.h"
19 #include "nsCycleCollectionParticipant.h"
24 class CancelableRunnable
;
26 enum class RFPTarget
: uint64_t;
33 enum class OffscreenRenderingContextId
: uint8_t;
35 class EncodeCompleteCallback
;
36 class OffscreenCanvasDisplayHelper
;
38 struct ImageEncodeOptions
;
40 using OwningOffscreenRenderingContext
= class
41 OwningOffscreenCanvasRenderingContext2DOrImageBitmapRenderingContextOrWebGLRenderingContextOrWebGL2RenderingContextOrGPUCanvasContext
;
43 // This is helper class for transferring OffscreenCanvas to worker thread.
44 // Because OffscreenCanvas is not thread-safe. So we cannot pass Offscreen-
45 // Canvas to worker thread directly. Thus, we create this helper class and
46 // store necessary data in it then pass it to worker thread.
47 struct OffscreenCanvasCloneData final
{
48 OffscreenCanvasCloneData(OffscreenCanvasDisplayHelper
* aDisplay
,
49 uint32_t aWidth
, uint32_t aHeight
,
50 layers::LayersBackend aCompositorBackend
,
51 layers::TextureType aTextureType
, bool aNeutered
,
52 bool aIsWriteOnly
, nsIPrincipal
* aExpandedReader
);
53 ~OffscreenCanvasCloneData();
55 RefPtr
<OffscreenCanvasDisplayHelper
> mDisplay
;
58 layers::LayersBackend mCompositorBackendType
;
59 layers::TextureType mTextureType
;
62 RefPtr
<nsIPrincipal
> mExpandedReader
;
65 class OffscreenCanvas final
: public DOMEventTargetHelper
,
66 public CanvasRenderingContextHelper
{
68 NS_DECL_ISUPPORTS_INHERITED
69 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(OffscreenCanvas
,
72 IMPL_EVENT_HANDLER(contextlost
);
73 IMPL_EVENT_HANDLER(contextrestored
);
75 OffscreenCanvas(nsIGlobalObject
* aGlobal
, uint32_t aWidth
, uint32_t aHeight
);
77 OffscreenCanvas(nsIGlobalObject
* aGlobal
, uint32_t aWidth
, uint32_t aHeight
,
78 layers::LayersBackend aCompositorBackend
,
79 layers::TextureType aTextureType
,
80 already_AddRefed
<OffscreenCanvasDisplayHelper
> aDisplay
);
84 nsIGlobalObject
* GetParentObject() const { return GetOwnerGlobal(); }
86 virtual JSObject
* WrapObject(JSContext
* aCx
,
87 JS::Handle
<JSObject
*> aGivenProto
) override
;
89 static already_AddRefed
<OffscreenCanvas
> Constructor(
90 const GlobalObject
& aGlobal
, uint32_t aWidth
, uint32_t aHeight
,
93 void ClearResources();
95 uint32_t Width() const { return mWidth
; }
96 uint32_t Height() const { return mHeight
; }
97 void SetWidth(uint32_t aWidth
, ErrorResult
& aRv
);
98 void SetHeight(uint32_t aHeight
, ErrorResult
& aRv
);
100 void GetContext(JSContext
* aCx
, const OffscreenRenderingContextId
& aContextId
,
101 JS::Handle
<JS::Value
> aContextOptions
,
102 Nullable
<OwningOffscreenRenderingContext
>& aResult
,
105 already_AddRefed
<ImageBitmap
> TransferToImageBitmap(ErrorResult
& aRv
);
107 already_AddRefed
<Promise
> ConvertToBlob(const ImageEncodeOptions
& aOptions
,
110 already_AddRefed
<Promise
> ToBlob(JSContext
* aCx
, const nsAString
& aType
,
111 JS::Handle
<JS::Value
> aParams
,
114 Maybe
<uint64_t> GetWindowID();
116 nsICanvasRenderingContextInternal
* GetContext() const {
117 return mCurrentContext
;
120 CanvasContextType
GetContextType() const { return mCurrentContextType
; }
122 already_AddRefed
<gfx::SourceSurface
> GetSurfaceSnapshot(
123 gfxAlphaType
* aOutAlphaType
= nullptr);
125 static already_AddRefed
<OffscreenCanvas
> CreateFromCloneData(
126 nsIGlobalObject
* aGlobal
, OffscreenCanvasCloneData
* aData
);
128 // Return true on main-thread, and return gfx.offscreencanvas.enabled
130 static bool PrefEnabledOnWorkerThread(JSContext
* aCx
, JSObject
* aObj
);
132 UniquePtr
<OffscreenCanvasCloneData
> ToCloneData(JSContext
* aCx
);
134 void UpdateDisplayData(const OffscreenCanvasDisplayData
& aData
);
136 void CommitFrameToCompositor();
137 void DequeueCommitToCompositor();
138 void QueueCommitToCompositor();
140 virtual bool GetOpaqueAttr() override
{ return false; }
142 virtual nsIntSize
GetWidthHeight() override
{
143 return nsIntSize(mWidth
, mHeight
);
146 virtual already_AddRefed
<nsICanvasRenderingContextInternal
> CreateContext(
147 CanvasContextType aContextType
) override
;
155 bool MayNeuter() const { return !mNeutered
&& !mCurrentContext
; }
157 void SetSize(const nsIntSize
& aSize
, ErrorResult
& aRv
);
159 nsIPrincipal
* GetExpandedReader() const { return mExpandedReader
; }
161 void SetWriteOnly(RefPtr
<nsIPrincipal
>&& aExpandedReader
);
163 void SetWriteOnly(nsIPrincipal
* aExpandedReader
= nullptr) {
164 RefPtr
<nsIPrincipal
> expandedReader(aExpandedReader
);
165 SetWriteOnly(std::move(expandedReader
));
168 bool IsWriteOnly() const { return mIsWriteOnly
; }
170 // Determines if the caller should be able to read the content.
171 bool CallerCanRead(nsIPrincipal
& aPrincipal
) const;
173 layers::LayersBackend
GetCompositorBackendType() const {
174 return mCompositorBackendType
;
177 bool ShouldResistFingerprinting(mozilla::RFPTarget aTarget
) const;
179 bool IsTransferredFromElement() const { return !!mDisplay
; }
184 already_AddRefed
<EncodeCompleteCallback
> CreateEncodeCompleteCallback(
187 void CanvasAttrChanged() {
189 UpdateContext(nullptr, JS::NullHandleValue
, dummy
);
192 bool mNeutered
= false;
193 bool mIsWriteOnly
= false;
196 uint32_t mHeight
= 0;
198 layers::LayersBackend mCompositorBackendType
=
199 layers::LayersBackend::LAYERS_NONE
;
200 layers::TextureType mTextureType
= layers::TextureType::Unknown
;
202 RefPtr
<OffscreenCanvasDisplayHelper
> mDisplay
;
203 RefPtr
<CancelableRunnable
> mPendingCommit
;
204 RefPtr
<nsIPrincipal
> mExpandedReader
;
205 Maybe
<OffscreenCanvasDisplayData
> mPendingUpdate
;
209 } // namespace mozilla
211 #endif // MOZILLA_DOM_OFFSCREENCANVAS_H_