mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-22 02:09:28 +00:00
Bug 1777411 - Improve error messages when cloning ImageBitmap. r=gfx-reviewers,lsalzman
Differential Revision: https://phabricator.services.mozilla.com/D150697
This commit is contained in:
parent
eea090b829
commit
2b5b6c5a20
@ -1059,15 +1059,13 @@ bool StructuredCloneHolder::CustomWriteHandler(
|
||||
{
|
||||
ImageBitmap* imageBitmap = nullptr;
|
||||
if (NS_SUCCEEDED(UNWRAP_OBJECT(ImageBitmap, &obj, imageBitmap))) {
|
||||
if (imageBitmap->IsWriteOnly()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
SameProcessScopeRequired(aSameProcessScopeRequired);
|
||||
|
||||
if (CloneScope() == StructuredCloneScope::SameProcess) {
|
||||
return ImageBitmap::WriteStructuredClone(aWriter, GetSurfaces(),
|
||||
imageBitmap);
|
||||
ErrorResult rv;
|
||||
ImageBitmap::WriteStructuredClone(aWriter, GetSurfaces(), imageBitmap,
|
||||
rv);
|
||||
return !rv.MaybeSetPendingException(aCx);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -1734,16 +1734,20 @@ JSObject* ImageBitmap::ReadStructuredClone(
|
||||
}
|
||||
|
||||
/*static*/
|
||||
bool ImageBitmap::WriteStructuredClone(
|
||||
void ImageBitmap::WriteStructuredClone(
|
||||
JSStructuredCloneWriter* aWriter,
|
||||
nsTArray<RefPtr<DataSourceSurface>>& aClonedSurfaces,
|
||||
ImageBitmap* aImageBitmap) {
|
||||
ImageBitmap* aImageBitmap, ErrorResult& aRv) {
|
||||
MOZ_ASSERT(aWriter);
|
||||
MOZ_ASSERT(aImageBitmap);
|
||||
|
||||
if (aImageBitmap->IsWriteOnly()) {
|
||||
return aRv.ThrowDataCloneError("Cannot clone ImageBitmap, is write-only");
|
||||
}
|
||||
|
||||
if (!aImageBitmap->mData) {
|
||||
// A closed image cannot be cloned.
|
||||
return false;
|
||||
return aRv.ThrowDataCloneError("Cannot clone ImageBitmap, is closed");
|
||||
}
|
||||
|
||||
const uint32_t picRectX = BitwiseCast<uint32_t>(aImageBitmap->mPictureRect.x);
|
||||
@ -1762,17 +1766,18 @@ bool ImageBitmap::WriteStructuredClone(
|
||||
NS_WARN_IF(!JS_WriteUint32Pair(aWriter, picRectWidth, picRectHeight)) ||
|
||||
NS_WARN_IF(
|
||||
!JS_WriteUint32Pair(aWriter, alphaType, aImageBitmap->mWriteOnly))) {
|
||||
return false;
|
||||
return aRv.ThrowDataCloneError(
|
||||
"Cannot clone ImageBitmap, failed to write params");
|
||||
}
|
||||
|
||||
RefPtr<SourceSurface> surface = aImageBitmap->mData->GetAsSourceSurface();
|
||||
if (NS_WARN_IF(!surface)) {
|
||||
return false;
|
||||
return aRv.ThrowDataCloneError("Cannot clone ImageBitmap, no surface");
|
||||
}
|
||||
|
||||
RefPtr<DataSourceSurface> snapshot = surface->GetDataSurface();
|
||||
if (NS_WARN_IF(!snapshot)) {
|
||||
return false;
|
||||
return aRv.ThrowDataCloneError("Cannot clone ImageBitmap, no data surface");
|
||||
}
|
||||
|
||||
RefPtr<DataSourceSurface> dstDataSurface;
|
||||
@ -1782,18 +1787,18 @@ bool ImageBitmap::WriteStructuredClone(
|
||||
// directly, using ScopedMap to get stride.
|
||||
DataSourceSurface::ScopedMap map(snapshot, DataSourceSurface::READ);
|
||||
if (NS_WARN_IF(!map.IsMapped())) {
|
||||
return false;
|
||||
return aRv.ThrowDataCloneError(
|
||||
"Cannot clone ImageBitmap, cannot map surface");
|
||||
}
|
||||
|
||||
dstDataSurface = Factory::CreateDataSourceSurfaceWithStride(
|
||||
snapshot->GetSize(), snapshot->GetFormat(), map.GetStride(), true);
|
||||
}
|
||||
if (NS_WARN_IF(!dstDataSurface)) {
|
||||
return false;
|
||||
return aRv.ThrowDataCloneError("Cannot clone ImageBitmap, out of memory");
|
||||
}
|
||||
Factory::CopyDataSourceSurface(snapshot, dstDataSurface);
|
||||
aClonedSurfaces.AppendElement(dstDataSurface);
|
||||
return true;
|
||||
}
|
||||
|
||||
size_t ImageBitmap::GetAllocatedSize() const {
|
||||
|
@ -130,10 +130,10 @@ class ImageBitmap final : public nsISupports, public nsWrapperCache {
|
||||
const nsTArray<RefPtr<gfx::DataSourceSurface>>& aClonedSurfaces,
|
||||
uint32_t aIndex);
|
||||
|
||||
static bool WriteStructuredClone(
|
||||
static void WriteStructuredClone(
|
||||
JSStructuredCloneWriter* aWriter,
|
||||
nsTArray<RefPtr<gfx::DataSourceSurface>>& aClonedSurfaces,
|
||||
ImageBitmap* aImageBitmap);
|
||||
ImageBitmap* aImageBitmap, ErrorResult& aRv);
|
||||
|
||||
friend CreateImageBitmapFromBlob;
|
||||
friend CreateImageBitmapFromBlobTask;
|
||||
|
Loading…
x
Reference in New Issue
Block a user