Backed out 4 changesets (bug 1746750) as per request. CLOSED TREE

Backed out changeset bf79a6b72d87 (bug 1746750)
Backed out changeset 87dde3962558 (bug 1746750)
Backed out changeset 08e0ff1804f6 (bug 1746750)
Backed out changeset 4a3da2db3bc0 (bug 1746750)
This commit is contained in:
Iulian Moraru 2022-02-03 03:24:42 +02:00
Родитель aeccf72433
Коммит 39e3ddd037
1398 изменённых файлов: 6235 добавлений и 428 удалений

Просмотреть файл

@ -609,12 +609,6 @@ DOMInterfaces = {
'nativeType': 'nsDOMOfflineResourceList',
},
'OffscreenCanvasRenderingContext2D': {
'implicitJSContext': [
'createImageData', 'getImageData', 'isPointInPath', 'isPointInStroke'
],
},
'PaintRequestList': {
'headerFile': 'mozilla/dom/PaintRequest.h',
},

Просмотреть файл

@ -817,7 +817,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(CanvasRenderingContext2D)
// Make sure we remove ourselves from the list of demotable contexts (raw
// pointers), since we're logically destructed at this point.
NS_IMPL_CYCLE_COLLECTION_UNLINK(mCanvasElement)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mOffscreenCanvas)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mDocShell)
for (uint32_t i = 0; i < tmp->mStyleStack.Length(); i++) {
ImplCycleCollectionUnlink(tmp->mStyleStack[i].patternStyles[Style::STROKE]);
@ -846,7 +845,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(CanvasRenderingContext2D)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCanvasElement)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mOffscreenCanvas)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDocShell)
for (uint32_t i = 0; i < tmp->mStyleStack.Length(); i++) {
ImplCycleCollectionTraverse(
@ -962,7 +960,7 @@ void CanvasRenderingContext2D::ContextState::SetGradientStyle(
**/
// Initialize our static variables.
Atomic<uintptr_t> CanvasRenderingContext2D::sNumLivingContexts(0);
uintptr_t CanvasRenderingContext2D::sNumLivingContexts = 0;
DrawTarget* CanvasRenderingContext2D::sErrorTarget = nullptr;
CanvasRenderingContext2D::CanvasRenderingContext2D(
@ -985,6 +983,9 @@ CanvasRenderingContext2D::CanvasRenderingContext2D(
mInvalidateCount(0),
mWriteOnly(false) {
sNumLivingContexts++;
mShutdownObserver = new CanvasShutdownObserver(this);
nsContentUtils::RegisterShutdownObserver(mShutdownObserver);
}
CanvasRenderingContext2D::~CanvasRenderingContext2D() {
@ -998,8 +999,6 @@ CanvasRenderingContext2D::~CanvasRenderingContext2D() {
}
}
void CanvasRenderingContext2D::Initialize() { AddShutdownObserver(); }
JSObject* CanvasRenderingContext2D::WrapObject(
JSContext* aCx, JS::Handle<JSObject*> aGivenProto) {
return CanvasRenderingContext2D_Binding::Wrap(aCx, this, aGivenProto);
@ -1073,14 +1072,6 @@ void CanvasRenderingContext2D::OnShutdown() {
}
}
void CanvasRenderingContext2D::AddShutdownObserver() {
MOZ_ASSERT(!mShutdownObserver);
MOZ_ASSERT(NS_IsMainThread());
mShutdownObserver = new CanvasShutdownObserver(this);
nsContentUtils::RegisterShutdownObserver(mShutdownObserver);
}
void CanvasRenderingContext2D::RemoveShutdownObserver() {
if (mShutdownObserver) {
mShutdownObserver->OnShutdown();
@ -1140,15 +1131,15 @@ nsresult CanvasRenderingContext2D::Redraw() {
mIsEntireFrameInvalid = true;
if (mCanvasElement) {
SVGObserverUtils::InvalidateDirectRenderingObservers(mCanvasElement);
mCanvasElement->InvalidateCanvasContent(nullptr);
} else if (mOffscreenCanvas) {
mOffscreenCanvas->QueueCommitToCompositor();
} else {
if (!mCanvasElement) {
NS_ASSERTION(mDocShell, "Redraw with no canvas element or docshell!");
return NS_OK;
}
SVGObserverUtils::InvalidateDirectRenderingObservers(mCanvasElement);
mCanvasElement->InvalidateCanvasContent(nullptr);
return NS_OK;
}
@ -1166,14 +1157,14 @@ void CanvasRenderingContext2D::Redraw(const gfx::Rect& aR) {
return;
}
if (mCanvasElement) {
SVGObserverUtils::InvalidateDirectRenderingObservers(mCanvasElement);
mCanvasElement->InvalidateCanvasContent(&aR);
} else if (mOffscreenCanvas) {
mOffscreenCanvas->QueueCommitToCompositor();
} else {
if (!mCanvasElement) {
NS_ASSERTION(mDocShell, "Redraw with no canvas element or docshell!");
return;
}
SVGObserverUtils::InvalidateDirectRenderingObservers(mCanvasElement);
mCanvasElement->InvalidateCanvasContent(&aR);
}
void CanvasRenderingContext2D::DidRefresh() {}
@ -1563,14 +1554,6 @@ void CanvasRenderingContext2D::ClearTarget(int32_t aWidth, int32_t aHeight) {
}
}
if (mOffscreenCanvas) {
OffscreenCanvasDisplayData data;
data.mSize = {mWidth, mHeight};
data.mIsOpaque = mOpaque;
data.mIsAlphaPremult = true;
mOffscreenCanvas->UpdateDisplayData(data);
}
if (!mCanvasElement || !mCanvasElement->IsInComposedDoc()) {
return;
}
@ -4279,12 +4262,6 @@ bool CanvasRenderingContext2D::IsPointInPath(JSContext* aCx, double aX,
double aY,
const CanvasWindingRule& aWinding,
nsIPrincipal& aSubjectPrincipal) {
return IsPointInPath(aCx, aX, aY, aWinding, Some(&aSubjectPrincipal));
}
bool CanvasRenderingContext2D::IsPointInPath(
JSContext* aCx, double aX, double aY, const CanvasWindingRule& aWinding,
Maybe<nsIPrincipal*> aSubjectPrincipal) {
if (!FloatValidate(aX, aY)) {
return false;
}
@ -4296,9 +4273,6 @@ bool CanvasRenderingContext2D::IsPointInPath(
aSubjectPrincipal)) {
return false;
}
} else if (mOffscreenCanvas &&
mOffscreenCanvas->ShouldResistFingerprinting()) {
return false;
}
EnsureUserSpacePath(aWinding);
@ -4317,15 +4291,7 @@ bool CanvasRenderingContext2D::IsPointInPath(JSContext* aCx,
const CanvasPath& aPath, double aX,
double aY,
const CanvasWindingRule& aWinding,
nsIPrincipal& aSubjectPrincipal) {
return IsPointInPath(aCx, aPath, aX, aY, aWinding, Some(&aSubjectPrincipal));
}
bool CanvasRenderingContext2D::IsPointInPath(JSContext* aCx,
const CanvasPath& aPath, double aX,
double aY,
const CanvasWindingRule& aWinding,
Maybe<nsIPrincipal*>) {
nsIPrincipal&) {
if (!FloatValidate(aX, aY)) {
return false;
}
@ -4342,12 +4308,6 @@ bool CanvasRenderingContext2D::IsPointInPath(JSContext* aCx,
bool CanvasRenderingContext2D::IsPointInStroke(
JSContext* aCx, double aX, double aY, nsIPrincipal& aSubjectPrincipal) {
return IsPointInStroke(aCx, aX, aY, Some(&aSubjectPrincipal));
}
bool CanvasRenderingContext2D::IsPointInStroke(
JSContext* aCx, double aX, double aY,
Maybe<nsIPrincipal*> aSubjectPrincipal) {
if (!FloatValidate(aX, aY)) {
return false;
}
@ -4359,9 +4319,6 @@ bool CanvasRenderingContext2D::IsPointInStroke(
aSubjectPrincipal)) {
return false;
}
} else if (mOffscreenCanvas &&
mOffscreenCanvas->ShouldResistFingerprinting()) {
return false;
}
EnsureUserSpacePath();
@ -4382,16 +4339,10 @@ bool CanvasRenderingContext2D::IsPointInStroke(
mTarget->GetTransform());
}
bool CanvasRenderingContext2D::IsPointInStroke(
JSContext* aCx, const CanvasPath& aPath, double aX, double aY,
nsIPrincipal& aSubjectPrincipal) {
return IsPointInStroke(aCx, aPath, aX, aY, Some(&aSubjectPrincipal));
}
bool CanvasRenderingContext2D::IsPointInStroke(JSContext* aCx,
const CanvasPath& aPath,
double aX, double aY,
Maybe<nsIPrincipal*>) {
nsIPrincipal&) {
if (!FloatValidate(aX, aY)) {
return false;
}
@ -5090,14 +5041,7 @@ void CanvasRenderingContext2D::DrawWindow(nsGlobalWindowInner& aWindow,
already_AddRefed<ImageData> CanvasRenderingContext2D::GetImageData(
JSContext* aCx, int32_t aSx, int32_t aSy, int32_t aSw, int32_t aSh,
nsIPrincipal& aSubjectPrincipal, ErrorResult& aError) {
return GetImageData(aCx, aSx, aSy, aSw, aSh, Some(&aSubjectPrincipal),
aError);
}
already_AddRefed<ImageData> CanvasRenderingContext2D::GetImageData(
JSContext* aCx, int32_t aSx, int32_t aSy, int32_t aSw, int32_t aSh,
Maybe<nsIPrincipal*> aSubjectPrincipal, ErrorResult& aError) {
if (!mCanvasElement && !mDocShell && !mOffscreenCanvas) {
if (!mCanvasElement && !mDocShell) {
NS_ERROR("No canvas element and no docshell in GetImageData!!!");
aError.Throw(NS_ERROR_DOM_SECURITY_ERR);
return nullptr;
@ -5105,7 +5049,6 @@ already_AddRefed<ImageData> CanvasRenderingContext2D::GetImageData(
// Check only if we have a canvas element; if we were created with a docshell,
// then it's special internal use.
// FIXME(aosmond): OffscreenCanvas security check??!
if (IsWriteOnly() ||
(mCanvasElement && !mCanvasElement->CallerCanRead(aCx))) {
// XXX ERRMSG we need to report an error to developers here! (bug 329026)
@ -5153,7 +5096,7 @@ already_AddRefed<ImageData> CanvasRenderingContext2D::GetImageData(
nsresult CanvasRenderingContext2D::GetImageDataArray(
JSContext* aCx, int32_t aX, int32_t aY, uint32_t aWidth, uint32_t aHeight,
Maybe<nsIPrincipal*> aSubjectPrincipal, JSObject** aRetval) {
nsIPrincipal& aSubjectPrincipal, JSObject** aRetval) {
MOZ_ASSERT(aWidth && aHeight);
// Restrict the typed array length to INT32_MAX because that's all we support
@ -5218,8 +5161,6 @@ nsresult CanvasRenderingContext2D::GetImageDataArray(
nsCOMPtr<Document> ownerDoc = mCanvasElement->OwnerDoc();
usePlaceholder = !CanvasUtils::IsImageExtractionAllowed(ownerDoc, aCx,
aSubjectPrincipal);
} else if (mOffscreenCanvas) {
usePlaceholder = mOffscreenCanvas->ShouldResistFingerprinting();
}
do {

Просмотреть файл

@ -12,10 +12,8 @@
#include "mozilla/intl/Bidi.h"
#include "mozilla/gfx/Rect.h"
#include "mozilla/gfx/2D.h"
#include "mozilla/Atomics.h"
#include "mozilla/Attributes.h"
#include "mozilla/EnumeratedArray.h"
#include "mozilla/Maybe.h"
#include "mozilla/RefPtr.h"
#include "mozilla/SurfaceFromElementResult.h"
#include "mozilla/UniquePtr.h"
@ -72,10 +70,9 @@ struct DOMMatrix2DInit;
/**
** CanvasRenderingContext2D
**/
class CanvasRenderingContext2D : public nsICanvasRenderingContextInternal,
public nsWrapperCache,
public BasicRenderingContext2D {
protected:
class CanvasRenderingContext2D final : public nsICanvasRenderingContextInternal,
public nsWrapperCache,
public BasicRenderingContext2D {
virtual ~CanvasRenderingContext2D();
public:
@ -209,23 +206,13 @@ class CanvasRenderingContext2D : public nsICanvasRenderingContextInternal,
bool IsPointInPath(JSContext* aCx, double aX, double aY,
const CanvasWindingRule& aWinding,
nsIPrincipal& aSubjectPrincipal);
bool IsPointInPath(JSContext* aCx, double aX, double aY,
const CanvasWindingRule& aWinding,
Maybe<nsIPrincipal*> aSubjectPrincipal);
bool IsPointInPath(JSContext* aCx, const CanvasPath& aPath, double aX,
double aY, const CanvasWindingRule& aWinding,
nsIPrincipal&);
bool IsPointInPath(JSContext* aCx, const CanvasPath& aPath, double aX,
double aY, const CanvasWindingRule& aWinding,
Maybe<nsIPrincipal*>);
bool IsPointInStroke(JSContext* aCx, double aX, double aY,
nsIPrincipal& aSubjectPrincipal);
bool IsPointInStroke(JSContext* aCx, double aX, double aY,
Maybe<nsIPrincipal*> aSubjectPrincipal);
bool IsPointInStroke(JSContext* aCx, const CanvasPath& aPath, double aX,
double aY, nsIPrincipal&);
bool IsPointInStroke(JSContext* aCx, const CanvasPath& aPath, double aX,
double aY, Maybe<nsIPrincipal*>);
void FillText(const nsAString& aText, double aX, double aY,
const Optional<double>& aMaxWidth,
mozilla::ErrorResult& aError);
@ -265,9 +252,6 @@ class CanvasRenderingContext2D : public nsICanvasRenderingContextInternal,
int32_t aSw, int32_t aSh,
nsIPrincipal& aSubjectPrincipal,
ErrorResult&);
already_AddRefed<ImageData> GetImageData(
JSContext*, int32_t aSx, int32_t aSy, int32_t aSw, int32_t aSh,
Maybe<nsIPrincipal*> aSubjectPrincipal, ErrorResult&);
void PutImageData(ImageData&, int32_t aDx, int32_t aDy, ErrorResult&);
void PutImageData(ImageData&, int32_t aDx, int32_t aDy, int32_t aDirtyX,
int32_t aDirtyY, int32_t aDirtyWidth, int32_t aDirtyHeight,
@ -425,7 +409,6 @@ class CanvasRenderingContext2D : public nsICanvasRenderingContextInternal,
* Gets the pres shell from either the canvas element or the doc shell
*/
PresShell* GetPresShell() final;
void Initialize() override;
NS_IMETHOD SetDimensions(int32_t aWidth, int32_t aHeight) override;
NS_IMETHOD InitializeWithDrawTarget(
nsIDocShell* aShell, NotNull<gfx::DrawTarget*> aTarget) override;
@ -518,7 +501,7 @@ class CanvasRenderingContext2D : public nsICanvasRenderingContextInternal,
// return true and fills in the bound rect if element has a hit region.
bool GetHitRegionRect(Element* aElement, nsRect& aRect) override;
virtual void OnShutdown();
void OnShutdown();
/**
* Update CurrentState().filter with the filter description for
@ -530,7 +513,7 @@ class CanvasRenderingContext2D : public nsICanvasRenderingContextInternal,
protected:
nsresult GetImageDataArray(JSContext* aCx, int32_t aX, int32_t aY,
uint32_t aWidth, uint32_t aHeight,
Maybe<nsIPrincipal*> aSubjectPrincipal,
nsIPrincipal& aSubjectPrincipal,
JSObject** aRetval);
void PutImageData_explicit(int32_t aX, int32_t aY, ImageData&,
@ -554,7 +537,7 @@ class CanvasRenderingContext2D : public nsICanvasRenderingContextInternal,
* The number of living nsCanvasRenderingContexts. When this goes down to
* 0, we free the premultiply and unpremultiply tables, if they exist.
*/
static mozilla::Atomic<uintptr_t> sNumLivingContexts;
static uintptr_t sNumLivingContexts;
static mozilla::gfx::DrawTarget* sErrorTarget;
@ -751,9 +734,8 @@ class CanvasRenderingContext2D : public nsICanvasRenderingContextInternal,
RefPtr<mozilla::layers::PersistentBufferProvider> mBufferProvider;
RefPtr<CanvasShutdownObserver> mShutdownObserver;
virtual void AddShutdownObserver();
virtual void RemoveShutdownObserver();
virtual bool AlreadyShutDown() const { return !mShutdownObserver; }
void RemoveShutdownObserver();
bool AlreadyShutDown() const { return !mShutdownObserver; }
/**
* Flag to avoid duplicate calls to InvalidateFrame. Set to true whenever

Просмотреть файл

@ -9,7 +9,6 @@
#include "ImageEncoder.h"
#include "mozilla/dom/BlobImpl.h"
#include "mozilla/dom/CanvasRenderingContext2D.h"
#include "mozilla/dom/OffscreenCanvasRenderingContext2D.h"
#include "mozilla/GfxMessageUtils.h"
#include "mozilla/Telemetry.h"
#include "mozilla/UniquePtr.h"
@ -138,11 +137,6 @@ CanvasRenderingContextHelper::CreateContextHelper(
ret = new CanvasRenderingContext2D(aCompositorBackend);
break;
case CanvasContextType::OffscreenCanvas2D:
Telemetry::Accumulate(Telemetry::CANVAS_2D_USED, 1);
ret = new OffscreenCanvasRenderingContext2D(aCompositorBackend);
break;
case CanvasContextType::WebGL1:
Telemetry::Accumulate(Telemetry::CANVAS_WEBGL_USED, 1);
@ -172,7 +166,6 @@ CanvasRenderingContextHelper::CreateContextHelper(
}
MOZ_ASSERT(ret);
ret->Initialize();
return ret.forget();
}

Просмотреть файл

@ -25,7 +25,6 @@ class EncodeCompleteCallback;
enum class CanvasContextType : uint8_t {
NoContext,
Canvas2D,
OffscreenCanvas2D,
WebGL1,
WebGL2,
WebGPU,

Просмотреть файл

@ -51,26 +51,24 @@ using namespace mozilla::gfx;
namespace mozilla::CanvasUtils {
bool IsImageExtractionAllowed(dom::Document* aDocument, JSContext* aCx,
Maybe<nsIPrincipal*> aPrincipal) {
nsIPrincipal& aPrincipal) {
// Do the rest of the checks only if privacy.resistFingerprinting is on.
if (!nsContentUtils::ShouldResistFingerprinting(aDocument)) {
return true;
}
// Don't proceed if we don't have a document or JavaScript context.
if (!aDocument || !aCx || !aPrincipal) {
if (!aDocument || !aCx) {
return false;
}
nsIPrincipal& subjectPrincipal = *aPrincipal.ref();
// The system principal can always extract canvas data.
if (subjectPrincipal.IsSystemPrincipal()) {
if (aPrincipal.IsSystemPrincipal()) {
return true;
}
// Allow extension principals.
auto* principal = BasePrincipal::Cast(&subjectPrincipal);
auto principal = BasePrincipal::Cast(&aPrincipal);
if (principal->AddonPolicy() || principal->ContentScriptAddonPolicy()) {
return true;
}

Просмотреть файл

@ -56,7 +56,7 @@ bool IsOffscreenCanvasEnabled(JSContext* aCx, JSObject* aObj);
// Check site-specific permission and display prompt if appropriate.
bool IsImageExtractionAllowed(dom::Document* aDocument, JSContext* aCx,
Maybe<nsIPrincipal*> aPrincipal);
nsIPrincipal& aPrincipal);
// Make a double out of |v|, treating undefined values as 0.0 (for
// the sake of sparse arrays). Return true iff coercion

Просмотреть файл

@ -9,7 +9,6 @@
#include "mozilla/dom/BlobImpl.h"
#include "mozilla/dom/OffscreenCanvasBinding.h"
#include "mozilla/dom/OffscreenCanvasDisplayHelper.h"
#include "mozilla/dom/OffscreenCanvasRenderingContext2D.h"
#include "mozilla/dom/Promise.h"
#include "mozilla/dom/WorkerPrivate.h"
#include "mozilla/dom/WorkerScope.h"
@ -119,9 +118,6 @@ void OffscreenCanvas::GetContext(
CanvasContextType contextType;
switch (aContextId) {
case OffscreenRenderingContextId::_2d:
contextType = CanvasContextType::OffscreenCanvas2D;
break;
case OffscreenRenderingContextId::Bitmaprenderer:
contextType = CanvasContextType::ImageBitmap;
break;
@ -152,11 +148,6 @@ void OffscreenCanvas::GetContext(
MOZ_ASSERT(mCurrentContext);
switch (mCurrentContextType) {
case CanvasContextType::OffscreenCanvas2D:
aResult.SetValue().SetAsOffscreenCanvasRenderingContext2D() =
*static_cast<OffscreenCanvasRenderingContext2D*>(
mCurrentContext.get());
break;
case CanvasContextType::ImageBitmap:
aResult.SetValue().SetAsImageBitmapRenderingContext() =
*static_cast<ImageBitmapRenderingContext*>(mCurrentContext.get());
@ -314,12 +305,6 @@ already_AddRefed<Promise> OffscreenCanvas::ConvertToBlob(
return nullptr;
}
if (mNeutered) {
aRv.ThrowInvalidStateError(
"Cannot get blob from placeholder canvas transferred to worker.");
return nullptr;
}
nsCOMPtr<nsIGlobalObject> global = GetOwnerGlobal();
RefPtr<Promise> promise = Promise::Create(global, aRv);
@ -342,9 +327,6 @@ already_AddRefed<Promise> OffscreenCanvas::ConvertToBlob(
CanvasRenderingContextHelper::ToBlob(callback, type, encodeOptions,
/* aUsingCustomOptions */ false,
usePlaceholder, aRv);
if (aRv.Failed()) {
promise->MaybeReject(std::move(aRv));
}
return promise.forget();
}
@ -359,12 +341,6 @@ already_AddRefed<Promise> OffscreenCanvas::ToBlob(JSContext* aCx,
return nullptr;
}
if (mNeutered) {
aRv.ThrowInvalidStateError(
"Cannot get blob from placeholder canvas transferred to worker.");
return nullptr;
}
nsCOMPtr<nsIGlobalObject> global = GetOwnerGlobal();
RefPtr<Promise> promise = Promise::Create(global, aRv);

Просмотреть файл

@ -36,7 +36,7 @@ class ImageBitmap;
struct ImageEncodeOptions;
using OwningOffscreenRenderingContext = class
OwningOffscreenCanvasRenderingContext2DOrImageBitmapRenderingContextOrWebGLRenderingContextOrWebGL2RenderingContextOrGPUCanvasContext;
OwningImageBitmapRenderingContextOrWebGLRenderingContextOrWebGL2RenderingContextOrGPUCanvasContext;
// This is helper class for transferring OffscreenCanvas to worker thread.
// Because OffscreenCanvas is not thread-safe. So we cannot pass Offscreen-
@ -151,8 +151,6 @@ class OffscreenCanvas final : public DOMEventTargetHelper,
bool ShouldResistFingerprinting() const;
bool IsTransferredFromElement() const { return !!mDisplay; }
private:
~OffscreenCanvas();

Просмотреть файл

@ -1,117 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "OffscreenCanvasRenderingContext2D.h"
#include "mozilla/dom/OffscreenCanvasRenderingContext2DBinding.h"
#include "mozilla/dom/OffscreenCanvas.h"
#include "mozilla/dom/WorkerCommon.h"
#include "mozilla/dom/WorkerRef.h"
namespace mozilla::dom {
class OffscreenCanvasShutdownObserver final {
NS_INLINE_DECL_REFCOUNTING(OffscreenCanvasShutdownObserver)
public:
explicit OffscreenCanvasShutdownObserver(
OffscreenCanvasRenderingContext2D* aOwner)
: mOwner(aOwner) {}
void OnShutdown() {
if (mOwner) {
mOwner->OnShutdown();
mOwner = nullptr;
}
}
void ClearOwner() { mOwner = nullptr; }
private:
~OffscreenCanvasShutdownObserver() = default;
OffscreenCanvasRenderingContext2D* mOwner;
};
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_INHERITED(
OffscreenCanvasRenderingContext2D, CanvasRenderingContext2D)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(OffscreenCanvasRenderingContext2D)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_END_INHERITING(CanvasRenderingContext2D)
NS_IMPL_ADDREF_INHERITED(OffscreenCanvasRenderingContext2D,
CanvasRenderingContext2D)
NS_IMPL_RELEASE_INHERITED(OffscreenCanvasRenderingContext2D,
CanvasRenderingContext2D)
OffscreenCanvasRenderingContext2D::OffscreenCanvasRenderingContext2D(
layers::LayersBackend aCompositorBackend)
: CanvasRenderingContext2D(aCompositorBackend) {}
OffscreenCanvasRenderingContext2D::~OffscreenCanvasRenderingContext2D() =
default;
JSObject* OffscreenCanvasRenderingContext2D::WrapObject(
JSContext* aCx, JS::Handle<JSObject*> aGivenProto) {
return OffscreenCanvasRenderingContext2D_Binding::Wrap(aCx, this,
aGivenProto);
}
nsIGlobalObject* OffscreenCanvasRenderingContext2D::GetParentObject() const {
return mOffscreenCanvas->GetOwnerGlobal();
}
void OffscreenCanvasRenderingContext2D::AddShutdownObserver() {
WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate();
if (!workerPrivate) {
// We may be using OffscreenCanvas on the main thread.
CanvasRenderingContext2D::AddShutdownObserver();
return;
}
mOffscreenShutdownObserver =
MakeAndAddRef<OffscreenCanvasShutdownObserver>(this);
mWorkerRef = WeakWorkerRef::Create(
workerPrivate,
[observer = mOffscreenShutdownObserver] { observer->OnShutdown(); });
}
void OffscreenCanvasRenderingContext2D::RemoveShutdownObserver() {
WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate();
if (!workerPrivate) {
// We may be using OffscreenCanvas on the main thread.
CanvasRenderingContext2D::RemoveShutdownObserver();
return;
}
if (mOffscreenShutdownObserver) {
mOffscreenShutdownObserver->ClearOwner();
}
mOffscreenShutdownObserver = nullptr;
mWorkerRef = nullptr;
}
void OffscreenCanvasRenderingContext2D::OnShutdown() {
if (mOffscreenShutdownObserver) {
mOffscreenShutdownObserver->ClearOwner();
mOffscreenShutdownObserver = nullptr;
}
CanvasRenderingContext2D::OnShutdown();
}
void OffscreenCanvasRenderingContext2D::Commit(ErrorResult& aRv) {
if (!mOffscreenCanvas->IsTransferredFromElement()) {
aRv.ThrowInvalidStateError(
"Cannot commit on an OffscreenCanvas that is not transferred from an "
"HTMLCanvasElement.");
return;
}
mOffscreenCanvas->CommitFrameToCompositor();
}
} // namespace mozilla::dom

Просмотреть файл

@ -1,60 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef MOZILLA_DOM_OFFSCREENCANVASRENDERINGCONTEXT2D_H_
#define MOZILLA_DOM_OFFSCREENCANVASRENDERINGCONTEXT2D_H_
#include "mozilla/RefPtr.h"
#include "mozilla/dom/CanvasRenderingContext2D.h"
struct JSContext;
class nsIGlobalObject;
namespace mozilla::dom {
class OffscreenCanvas;
class OffscreenCanvasShutdownObserver;
class WeakWorkerRef;
class OffscreenCanvasRenderingContext2D final
: public CanvasRenderingContext2D {
public:
// nsISupports interface + CC
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(
OffscreenCanvasRenderingContext2D, CanvasRenderingContext2D)
explicit OffscreenCanvasRenderingContext2D(
layers::LayersBackend aCompositorBackend);
nsIGlobalObject* GetParentObject() const;
JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
OffscreenCanvas* Canvas() { return mOffscreenCanvas; }
const OffscreenCanvas* Canvas() const { return mOffscreenCanvas; }
void Commit(ErrorResult& aRv);
void OnShutdown() override;
private:
void AddShutdownObserver() override;
void RemoveShutdownObserver() override;
bool AlreadyShutDown() const override {
return !mOffscreenShutdownObserver &&
CanvasRenderingContext2D::AlreadyShutDown();
}
~OffscreenCanvasRenderingContext2D() override;
RefPtr<OffscreenCanvasShutdownObserver> mOffscreenShutdownObserver;
RefPtr<WeakWorkerRef> mWorkerRef;
};
} // namespace mozilla::dom
#endif // MOZILLA_DOM_OFFSCREENCANVASRENDERINGCONTEXT2D_H_

Просмотреть файл

@ -61,7 +61,6 @@ EXPORTS.mozilla.dom += [
"ImageUtils.h",
"OffscreenCanvas.h",
"OffscreenCanvasDisplayHelper.h",
"OffscreenCanvasRenderingContext2D.h",
"QueueParamTraits.h",
"TextMetrics.h",
"WebGLChild.h",
@ -102,7 +101,6 @@ SOURCES += [
"DrawTargetWebgl.cpp", # Isolate Skia
"ImageUtils.cpp",
"OffscreenCanvasDisplayHelper.cpp", # See bug 1745384
"OffscreenCanvasRenderingContext2D.cpp", # See bug 1745384
]
# WebGL Sources

Просмотреть файл

@ -96,9 +96,6 @@ class nsICanvasRenderingContextInternal : public nsISupports,
// whenever the size of the element changes.
NS_IMETHOD SetDimensions(int32_t width, int32_t height) = 0;
// Initializes the canvas after the object is constructed.
virtual void Initialize() {}
// Initializes with an nsIDocShell and DrawTarget. The size is taken from the
// DrawTarget.
NS_IMETHOD InitializeWithDrawTarget(

Просмотреть файл

@ -5343,7 +5343,6 @@ subsuite = webgl2-core
subsuite = webgl2-core
[generated/test_2_conformance2__offscreencanvas__offscreencanvas-sync.html]
subsuite = webgl2-core
fail-if = (os == 'mac' && !debug)
[generated/test_2_conformance2__offscreencanvas__offscreencanvas-timer-query.html]
subsuite = webgl2-core
[generated/test_2_conformance2__offscreencanvas__offscreencanvas-transfer-image-bitmap.html]

Просмотреть файл

@ -68,8 +68,6 @@ function runTest() {
}
SpecialPowers.pushPrefEnv({"set": [
['dom.workers.requestAnimationFrame', true],
['gfx.offscreencanvas.enabled', true],
['webgl.force-enabled', true],
['webgl.enable-draft-extensions', true],
]}, runTest);

Просмотреть файл

@ -926,9 +926,6 @@ skip-if = (os == 'mac')
[generated/test_2_conformance2__textures__misc__tex-unpack-params-imagedata.html]
# areArraysEqual(actual, expected) should be true. Was false.
fail-if = (os == 'mac' && !apple_silicon)
[generated/test_2_conformance2__offscreencanvas__offscreencanvas-sync.html]
# Timeout
fail-if = (os == 'mac' && !debug)
[generated/test_2_conformance2__renderbuffers__multisampled-depth-renderbuffer-initialization.html]
####################

Просмотреть файл

@ -848,8 +848,7 @@ already_AddRefed<CanvasCaptureMediaStream> HTMLCanvasElement::CaptureStream(
// If no permission, arrange for the frame capture listener to return
// all-white, opaque image data.
bool usePlaceholder = !CanvasUtils::IsImageExtractionAllowed(
OwnerDoc(), nsContentUtils::GetCurrentJSContext(),
Some(&aSubjectPrincipal));
OwnerDoc(), nsContentUtils::GetCurrentJSContext(), aSubjectPrincipal);
rv = RegisterFrameCaptureListener(stream->FrameCaptureListener(),
usePlaceholder);
@ -869,7 +868,7 @@ nsresult HTMLCanvasElement::ExtractData(JSContext* aCx,
// Check site-specific permission and display prompt if appropriate.
// If no permission, return all-white, opaque image data.
bool usePlaceholder = !CanvasUtils::IsImageExtractionAllowed(
OwnerDoc(), aCx, Some(&aSubjectPrincipal));
OwnerDoc(), aCx, aSubjectPrincipal);
return ImageEncoder::ExtractData(aType, aOptions, GetSize(), usePlaceholder,
mCurrentContext, mCanvasRenderer, aStream);
}
@ -953,7 +952,7 @@ void HTMLCanvasElement::ToBlob(JSContext* aCx, BlobCallback& aCallback,
// Check site-specific permission and display prompt if appropriate.
// If no permission, return all-white, opaque image data.
bool usePlaceholder = !CanvasUtils::IsImageExtractionAllowed(
OwnerDoc(), aCx, Some(&aSubjectPrincipal));
OwnerDoc(), aCx, aSubjectPrincipal);
CanvasRenderingContextHelper::ToBlob(aCx, global, aCallback, aType, aParams,
usePlaceholder, aRv);
}

Просмотреть файл

@ -338,8 +338,7 @@ interface mixin CanvasHitRegions {
[Pref="canvas.hitregions.enabled"] void clearHitRegions();
};
[Exposed=(Window,Worker),
Func="mozilla::dom::OffscreenCanvas::PrefEnabledOnWorkerThread"]
[Exposed=Window]
interface CanvasGradient {
// opaque object
[Throws]
@ -347,8 +346,7 @@ interface CanvasGradient {
void addColorStop(float offset, UTF8String color);
};
[Exposed=(Window,Worker),
Func="mozilla::dom::OffscreenCanvas::PrefEnabledOnWorkerThread"]
[Exposed=Window]
interface CanvasPattern {
// opaque object
// [Throws, LenientFloat] - could not do this overload because of bug 1020975
@ -399,8 +397,7 @@ interface TextMetrics {
};
[Pref="canvas.path.enabled",
Func="mozilla::dom::OffscreenCanvas::PrefEnabledOnWorkerThread",
Exposed=(Window,Worker)]
Exposed=Window]
interface Path2D
{
constructor();

Просмотреть файл

@ -7,14 +7,14 @@
* https://html.spec.whatwg.org/#the-offscreencanvas-interface
*/
typedef (OffscreenCanvasRenderingContext2D or ImageBitmapRenderingContext or WebGLRenderingContext or WebGL2RenderingContext or GPUCanvasContext) OffscreenRenderingContext;
typedef (ImageBitmapRenderingContext or WebGLRenderingContext or WebGL2RenderingContext or GPUCanvasContext) OffscreenRenderingContext;
dictionary ImageEncodeOptions {
DOMString type = "image/png";
unrestricted double quality;
};
enum OffscreenRenderingContextId { "2d", "bitmaprenderer", "webgl", "webgl2", "webgpu" };
enum OffscreenRenderingContextId { /* "2d", */ "bitmaprenderer", "webgl", "webgl2", "webgpu" };
[Exposed=(Window,Worker),
Func="CanvasUtils::IsOffscreenCanvasEnabled"]

Просмотреть файл

@ -1,30 +0,0 @@
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* For more information on this interface, please see
* https://html.spec.whatwg.org/#the-offscreen-2d-rendering-context
*/
[Exposed=(Window,Worker),
Func="CanvasUtils::IsOffscreenCanvasEnabled"]
interface OffscreenCanvasRenderingContext2D {
[Throws]
void commit();
readonly attribute OffscreenCanvas canvas;
};
OffscreenCanvasRenderingContext2D includes CanvasState;
OffscreenCanvasRenderingContext2D includes CanvasTransform;
OffscreenCanvasRenderingContext2D includes CanvasCompositing;
OffscreenCanvasRenderingContext2D includes CanvasImageSmoothing;
OffscreenCanvasRenderingContext2D includes CanvasFillStrokeStyles;
OffscreenCanvasRenderingContext2D includes CanvasShadowStyles;
OffscreenCanvasRenderingContext2D includes CanvasRect;
OffscreenCanvasRenderingContext2D includes CanvasDrawPath;
OffscreenCanvasRenderingContext2D includes CanvasDrawImage;
OffscreenCanvasRenderingContext2D includes CanvasImageData;
OffscreenCanvasRenderingContext2D includes CanvasPathDrawingStyles;
OffscreenCanvasRenderingContext2D includes CanvasPathMethods;

Просмотреть файл

@ -241,9 +241,6 @@ with Files("OfflineAudio*"):
with Files("OffscreenCanvas.webidl"):
BUG_COMPONENT = ("Core", "Canvas: 2D")
with Files("OffscreenCanvasRenderingContext2D.webidl"):
BUG_COMPONENT = ("Core", "Canvas: 2D")
with Files("OscillatorNode.webidl"):
BUG_COMPONENT = ("Core", "Web Audio")
@ -755,7 +752,6 @@ WEBIDL_FILES = [
"OfflineAudioContext.webidl",
"OfflineResourceList.webidl",
"OffscreenCanvas.webidl",
"OffscreenCanvasRenderingContext2D.webidl",
"OscillatorNode.webidl",
"PaintRequest.webidl",
"PaintRequestList.webidl",

Просмотреть файл

@ -1525,7 +1525,7 @@
# Add support for canvas path objects
- name: canvas.path.enabled
type: RelaxedAtomicBool
type: bool
value: true
mirror: always

Просмотреть файл

@ -100,6 +100,3 @@ user_pref("toolkit.telemetry.initDelay", 99999999);
user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true);
// Use a light color-scheme unless explicitly overriden.
user_pref("layout.css.prefers-color-scheme.content-override", 1);
// Force OffscreenCanvas support
user_pref("gfx.offscreencanvas.enabled", true);
user_pref("dom.workers.requestAnimationFrame", true);

Просмотреть файл

@ -73,6 +73,3 @@ user_pref("browser.cache.offline.enable", true);
user_pref("network.cookie.cookieBehavior", 4);
// Force a light color scheme unless explicitly overriden by pref.
user_pref("layout.css.prefers-color-scheme.content-override", 1);
// Force OffscreenCanvas support
user_pref("gfx.offscreencanvas.enabled", true);
user_pref("dom.workers.requestAnimationFrame", true);

Просмотреть файл

@ -0,0 +1 @@
prefs: [gfx.offscreencanvas.enabled:true]

Просмотреть файл

@ -1,7 +1,16 @@
[createImageBitmap-drawImage.html]
[createImageBitmap from an OffscreenCanvas resized, and drawImage on the created ImageBitmap]
expected: FAIL
[createImageBitmap from an OffscreenCanvas, and drawImage on the created ImageBitmap]
expected: FAIL
[createImageBitmap from an HTMLVideoElement from a data URL scaled down, and drawImage on the created ImageBitmap]
expected: FAIL
[createImageBitmap from an OffscreenCanvas scaled down, and drawImage on the created ImageBitmap]
expected: FAIL
[createImageBitmap from an HTMLVideoElement scaled down, and drawImage on the created ImageBitmap]
expected: FAIL
@ -14,9 +23,15 @@
[createImageBitmap from an HTMLVideoElement from a data URL scaled up, and drawImage on the created ImageBitmap]
expected: FAIL
[createImageBitmap from an OffscreenCanvas scaled up, and drawImage on the created ImageBitmap]
expected: FAIL
[createImageBitmap from an HTMLVideoElement from a data URL resized, and drawImage on the created ImageBitmap]
expected: FAIL
[createImageBitmap from an OffscreenCanvas with negative sw/sh, and drawImage on the created ImageBitmap]
expected: FAIL
[createImageBitmap from an HTMLVideoElement, and drawImage on the created ImageBitmap]
expected: FAIL

Просмотреть файл

@ -1,4 +1,10 @@
[createImageBitmap-flipY.html]
[createImageBitmap from an OffscreenCanvas imageOrientation: "flipY", and drawImage on the created ImageBitmap]
expected: FAIL
[createImageBitmap from an OffscreenCanvas imageOrientation: "none", and drawImage on the created ImageBitmap]
expected: FAIL
[createImageBitmap from an HTMLVideoElement imageOrientation: "none", and drawImage on the created ImageBitmap]
expected: FAIL

Просмотреть файл

@ -1,3 +1,24 @@
[createImageBitmap-invalid-args.html]
[createImageBitmap with an OffscreenCanvas source and sh set to 0]
expected: FAIL
[createImageBitmap with an OffscreenCanvas source and sw set to 0]
expected: FAIL
[createImageBitmap with an OffscreenCanvas source and oversized (unallocatable) crop region]
expected: FAIL
[createImageBitmap with CanvasRenderingContext2D image source.]
expected: FAIL
[createImageBitmap with an OffscreenCanvas source and a value of 0 int resizeWidth]
expected: FAIL
[createImageBitmap with an OffscreenCanvas source and a value of 0 in resizeHeight]
expected: FAIL
[createImageBitmap with an OffscreenCanvas source and a value between 0 and 1 in resizeWidth]
expected: FAIL
[createImageBitmap with an OffscreenCanvas source and a value between 0 and 1 in resizeHeight]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[createImageBitmap-serializable.html]
[Serialize ImageBitmap created from an OffscreenCanvas]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[createImageBitmap-transfer.html]
[Transfer ImageBitmap created from an OffscreenCanvas]
expected: FAIL

Просмотреть файл

@ -0,0 +1,13 @@
[canvas-drawImage-offscreenCanvas.html]
[Test drawing color managed OffscreenCanvas: Canvas color params: srgb, uint8; OffscreenCanvas color params: srgb, float16]
expected: FAIL
[Test drawing color managed OffscreenCanvas: Canvas color params: srgb, float16; OffscreenCanvas color params: srgb, float16]
expected: FAIL
[Test drawing color managed OffscreenCanvas: Canvas color params: srgb, float16; OffscreenCanvas color params: srgb, uint8]
expected: FAIL
[Test drawing color managed OffscreenCanvas: Canvas color params: srgb, uint8; OffscreenCanvas color params: srgb, uint8]
expected: FAIL

Просмотреть файл

@ -0,0 +1,3 @@
[2d.conformance.requirements.basics.html]
[void methods return undefined]
expected: FAIL

Просмотреть файл

@ -0,0 +1,3 @@
[2d.conformance.requirements.basics.worker.html]
[void methods return undefined]
expected: FAIL

Просмотреть файл

@ -0,0 +1,3 @@
[2d.conformance.requirements.missingargs.html]
[Missing arguments cause TypeError]
expected: FAIL

Просмотреть файл

@ -0,0 +1,3 @@
[2d.conformance.requirements.missingargs.worker.html]
[Missing arguments cause TypeError]
expected: FAIL

Просмотреть файл

@ -0,0 +1 @@
prefs: [dom.workers.requestAnimationFrame:true, gfx.offscreencanvas.enabled:true]

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.copy.html]
[OffscreenCanvas test: 2d.composite.canvas.copy]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.copy.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.destination-atop.html]
[OffscreenCanvas test: 2d.composite.canvas.destination-atop]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.destination-atop.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.destination-in.html]
[OffscreenCanvas test: 2d.composite.canvas.destination-in]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.destination-in.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.destination-out.html]
[OffscreenCanvas test: 2d.composite.canvas.destination-out]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.destination-out.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.destination-over.html]
[OffscreenCanvas test: 2d.composite.canvas.destination-over]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.destination-over.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.lighter.html]
[OffscreenCanvas test: 2d.composite.canvas.lighter]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.lighter.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.source-atop.html]
[OffscreenCanvas test: 2d.composite.canvas.source-atop]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.source-atop.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.source-in.html]
[OffscreenCanvas test: 2d.composite.canvas.source-in]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.source-in.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.source-out.html]
[OffscreenCanvas test: 2d.composite.canvas.source-out]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.source-out.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.source-over.html]
[OffscreenCanvas test: 2d.composite.canvas.source-over]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.source-over.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.xor.html]
[OffscreenCanvas test: 2d.composite.canvas.xor]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.canvas.xor.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.copy.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.copy.worker.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.destination-atop.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.destination-atop.worker.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.destination-in.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.destination-in.worker.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.destination-out.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.destination-out.worker.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.destination-over.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.destination-over.worker.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.lighter.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.lighter.worker.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.source-atop.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.source-atop.worker.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.source-in.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.source-in.worker.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.source-out.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.source-out.worker.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.source-over.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.source-over.worker.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.xor.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.clip.xor.worker.html]
[fill() does not affect pixels outside the clip region.]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.canvas.html]
[OffscreenCanvas test: 2d.composite.globalAlpha.canvas]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.canvas.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.canvascopy.html]
[OffscreenCanvas test: 2d.composite.globalAlpha.canvascopy]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.canvascopy.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.canvaspattern.html]
[OffscreenCanvas test: 2d.composite.globalAlpha.canvaspattern]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.canvaspattern.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.default.html]
[OffscreenCanvas test: 2d.composite.globalAlpha.default]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.default.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.fill.html]
[OffscreenCanvas test: 2d.composite.globalAlpha.fill]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.fill.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.image.html]
[OffscreenCanvas test: 2d.composite.globalAlpha.image]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.image.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.imagepattern.html]
[OffscreenCanvas test: 2d.composite.globalAlpha.imagepattern]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.imagepattern.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.invalid.html]
[OffscreenCanvas test: 2d.composite.globalAlpha.invalid]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.invalid.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.range.html]
[OffscreenCanvas test: 2d.composite.globalAlpha.range]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.globalAlpha.range.worker.html]
[2d]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.image.copy.html]
[OffscreenCanvas test: 2d.composite.image.copy]
expected: FAIL

Просмотреть файл

@ -0,0 +1,4 @@
[2d.composite.image.copy.worker.html]
[2d]
expected: FAIL

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше