Bug 1350254 part 2. Switch ImageData to [Serializable]. r=baku

Differential Revision: https://phabricator.services.mozilla.com/D35716

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Boris Zbarsky 2019-06-25 06:44:38 +00:00
Родитель 68a52b3c30
Коммит 75224691ef
7 изменённых файлов: 61 добавлений и 107 удалений

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

@ -8,6 +8,7 @@
#include "ImageContainer.h"
#include "mozilla/AutoRestore.h"
#include "mozilla/dom/BindingUtils.h"
#include "mozilla/dom/BlobBinding.h"
#include "mozilla/dom/CryptoKey.h"
#include "mozilla/dom/StructuredCloneBlob.h"
@ -27,9 +28,6 @@
#include "mozilla/dom/FormData.h"
#include "mozilla/dom/ImageBitmap.h"
#include "mozilla/dom/ImageBitmapBinding.h"
#include "mozilla/dom/ImageData.h"
#include "mozilla/dom/ImageDataBinding.h"
#include "mozilla/dom/StructuredClone.h"
#include "mozilla/dom/MessagePort.h"
#include "mozilla/dom/MessagePortBinding.h"
#include "mozilla/dom/OffscreenCanvas.h"
@ -43,6 +41,7 @@
#include "mozilla/dom/URLSearchParams.h"
#include "mozilla/dom/URLSearchParamsBinding.h"
#include "mozilla/dom/WebCryptoCommon.h"
#include "mozilla/dom/WebIDLSerializable.h"
#include "mozilla/gfx/2D.h"
#include "mozilla/ipc/BackgroundChild.h"
#include "mozilla/ipc/BackgroundUtils.h"
@ -349,8 +348,15 @@ JSObject* StructuredCloneHolder::ReadFullySerializableObjects(
JSContext* aCx, JSStructuredCloneReader* aReader, uint32_t aTag) {
AssertTagValues();
if (aTag == SCTAG_DOM_IMAGEDATA) {
return ReadStructuredCloneImageData(aCx, aReader);
nsIGlobalObject* global = xpc::CurrentNativeGlobal(aCx);
if (!global) {
return nullptr;
}
WebIDLDeserializer deserializer =
LookupDeserializer(StructuredCloneTags(aTag));
if (deserializer) {
return deserializer(aCx, global, aReader);
}
if (aTag == SCTAG_DOM_WEBCRYPTO_KEY || aTag == SCTAG_DOM_URLSEARCHPARAMS ||
@ -358,11 +364,6 @@ JSObject* StructuredCloneHolder::ReadFullySerializableObjects(
aTag == SCTAG_DOM_DOMRECT || aTag == SCTAG_DOM_DOMRECT_READONLY ||
aTag == SCTAG_DOM_DOMQUAD || aTag == SCTAG_DOM_DOMMATRIX ||
aTag == SCTAG_DOM_DOMMATRIX_READONLY) {
nsIGlobalObject* global = xpc::CurrentNativeGlobal(aCx);
if (!global) {
return nullptr;
}
// Prevent the return value from being trashed by a GC during ~nsRefPtr.
JS::Rooted<JSObject*> result(aCx);
{
@ -500,14 +501,16 @@ bool StructuredCloneHolder::WriteFullySerializableObjects(
JS::Handle<JSObject*> aObj) {
AssertTagValues();
JS::Rooted<JSObject*> obj(aCx, aObj);
// See if this is a ImageData object.
{
ImageData* imageData = nullptr;
if (NS_SUCCEEDED(UNWRAP_OBJECT(ImageData, &obj, imageData))) {
return WriteStructuredCloneImageData(aCx, aWriter, imageData);
// Window and Location are not serializable, so it's OK to just do a static
// unwrap here.
JS::Rooted<JSObject*> obj(aCx, js::CheckedUnwrapStatic(aObj));
if (!obj) {
return xpc::Throw(aCx, NS_ERROR_DOM_DATA_CLONE_ERR);
}
const DOMJSClass* domClass = GetDOMClass(obj);
if (domClass && domClass->mSerializer) {
return domClass->mSerializer(aCx, aWriter, obj);
}
// Handle URLSearchParams cloning

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

@ -1,59 +0,0 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 "mozilla/dom/StructuredClone.h"
#include "js/StructuredClone.h"
#include "mozilla/dom/ImageData.h"
#include "mozilla/dom/StructuredCloneTags.h"
namespace mozilla {
namespace dom {
JSObject* ReadStructuredCloneImageData(JSContext* aCx,
JSStructuredCloneReader* aReader) {
// Read the information out of the stream.
uint32_t width, height;
JS::Rooted<JS::Value> dataArray(aCx);
if (!JS_ReadUint32Pair(aReader, &width, &height) ||
!JS_ReadTypedArray(aReader, &dataArray)) {
return nullptr;
}
MOZ_ASSERT(dataArray.isObject());
// Protect the result from a moving GC in ~nsRefPtr.
JS::Rooted<JSObject*> result(aCx);
{
// Construct the ImageData.
RefPtr<ImageData> imageData =
new ImageData(width, height, dataArray.toObject());
// Wrap it in a JS::Value.
if (!imageData->WrapObject(aCx, nullptr, &result)) {
return nullptr;
}
}
return result;
}
bool WriteStructuredCloneImageData(JSContext* aCx,
JSStructuredCloneWriter* aWriter,
ImageData* aImageData) {
uint32_t width = aImageData->Width();
uint32_t height = aImageData->Height();
JS::Rooted<JSObject*> dataArray(aCx, aImageData->GetDataObject());
if (!JS_WrapObject(aCx, &dataArray)) {
return false;
}
JS::Rooted<JS::Value> arrayValue(aCx, JS::ObjectValue(*dataArray));
return JS_WriteUint32Pair(aWriter, SCTAG_DOM_IMAGEDATA, 0) &&
JS_WriteUint32Pair(aWriter, width, height) &&
JS_WriteTypedArray(aWriter, arrayValue);
}
} // namespace dom
} // namespace mozilla

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

@ -1,25 +0,0 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */
class JSObject;
struct JSContext;
struct JSStructuredCloneReader;
struct JSStructuredCloneWriter;
namespace mozilla {
namespace dom {
class ImageData;
JSObject* ReadStructuredCloneImageData(JSContext* aCx,
JSStructuredCloneReader* aReader);
bool WriteStructuredCloneImageData(JSContext* aCx,
JSStructuredCloneWriter* aWriter,
ImageData* aImageData);
} // namespace dom
} // namespace mozilla

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

@ -50,7 +50,6 @@ EXPORTS.mozilla.dom += [
'RootedDictionary.h',
'SimpleGlobalObject.h',
'SpiderMonkeyInterface.h',
'StructuredClone.h',
'ToJSValue.h',
'TypedArray.h',
'UnionMember.h',
@ -116,10 +115,6 @@ UNIFIED_SOURCES += [
'WebIDLGlobalNameHash.cpp',
]
SOURCES += [
'StructuredClone.cpp',
]
# Some tests, including those for for maplike and setlike, require bindings
# to be built, which means they must be included in libxul. This breaks the
# "no test classes are exported" rule stated in the test/ directory, but it's

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

@ -106,5 +106,34 @@ bool ImageData::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto,
return ImageData_Binding::Wrap(aCx, this, aGivenProto, aReflector);
}
// static
already_AddRefed<ImageData> ImageData::ReadStructuredClone(
JSContext* aCx, nsIGlobalObject* aGlobal,
JSStructuredCloneReader* aReader) {
// Read the information out of the stream.
uint32_t width, height;
JS::Rooted<JS::Value> dataArray(aCx);
if (!JS_ReadUint32Pair(aReader, &width, &height) ||
!JS_ReadTypedArray(aReader, &dataArray)) {
return nullptr;
}
MOZ_ASSERT(dataArray.isObject());
RefPtr<ImageData> imageData =
new ImageData(width, height, dataArray.toObject());
return imageData.forget();
}
bool ImageData::WriteStructuredClone(JSContext* aCx,
JSStructuredCloneWriter* aWriter) const {
JS::Rooted<JS::Value> arrayValue(aCx, JS::ObjectValue(*GetDataObject()));
if (!JS_WrapValue(aCx, &arrayValue)) {
return false;
}
return JS_WriteUint32Pair(aWriter, Width(), Height()) &&
JS_WriteTypedArray(aWriter, arrayValue);
}
} // namespace dom
} // namespace mozilla

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

@ -15,6 +15,9 @@
#include "nsCycleCollectionParticipant.h"
#include "nsISupportsImpl.h"
#include "js/RootingAPI.h"
#include "js/StructuredClone.h"
class nsIGlobalObject;
namespace mozilla {
namespace dom {
@ -51,6 +54,13 @@ class ImageData final : public nsISupports {
bool WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto,
JS::MutableHandle<JSObject*> aReflector);
//[Serializable] implementation
static already_AddRefed<ImageData> ReadStructuredClone(
JSContext* aCx, nsIGlobalObject* aGlobal,
JSStructuredCloneReader* aReader);
bool WriteStructuredClone(JSContext* aCx,
JSStructuredCloneWriter* aWriter) const;
private:
void HoldData();
void DropData();

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

@ -12,7 +12,8 @@
[Constructor(unsigned long sw, unsigned long sh),
Constructor(Uint8ClampedArray data, unsigned long sw, optional unsigned long sh),
Exposed=(Window,Worker)]
Exposed=(Window,Worker),
Serializable]
interface ImageData {
[Constant]
readonly attribute unsigned long width;