Bug 1350254 part 5. Switch DOMRect and DOMRectReadOnly to [Serializable]. r=baku

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

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Boris Zbarsky 2019-06-25 06:46:47 +00:00
parent a408716f68
commit 0fa1029320
5 changed files with 44 additions and 44 deletions

View File

@ -37,7 +37,7 @@ already_AddRefed<DOMRectReadOnly> DOMRectReadOnly::Constructor(
// https://drafts.fxtf.org/geometry/#structured-serialization
bool DOMRectReadOnly::WriteStructuredClone(
JSStructuredCloneWriter* aWriter) const {
JSContext* aCx, JSStructuredCloneWriter* aWriter) const {
#define WriteDouble(d) \
JS_WriteUint32Pair(aWriter, (BitwiseCast<uint64_t>(d) >> 32) & 0xffffffff, \
BitwiseCast<uint64_t>(d) & 0xffffffff)
@ -48,6 +48,17 @@ bool DOMRectReadOnly::WriteStructuredClone(
#undef WriteDouble
}
// static
already_AddRefed<DOMRectReadOnly> DOMRectReadOnly::ReadStructuredClone(
JSContext* aCx, nsIGlobalObject* aGlobal,
JSStructuredCloneReader* aReader) {
RefPtr<DOMRectReadOnly> retval = new DOMRectReadOnly(aGlobal);
if (!retval->ReadStructuredClone(aReader)) {
return nullptr;
}
return retval.forget();
}
bool DOMRectReadOnly::ReadStructuredClone(JSStructuredCloneReader* aReader) {
uint32_t high;
uint32_t low;
@ -85,6 +96,17 @@ already_AddRefed<DOMRect> DOMRect::Constructor(const GlobalObject& aGlobal,
return obj.forget();
}
// static
already_AddRefed<DOMRect> DOMRect::ReadStructuredClone(
JSContext* aCx, nsIGlobalObject* aGlobal,
JSStructuredCloneReader* aReader) {
RefPtr<DOMRect> retval = new DOMRect(aGlobal);
if (!retval->ReadStructuredClone(aReader)) {
return nullptr;
}
return retval.forget();
}
// -----------------------------------------------------------------------------
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(DOMRectList, mParent, mArray)

View File

@ -18,6 +18,7 @@
#include <algorithm>
struct nsRect;
class nsIGlobalObject;
namespace mozilla {
namespace dom {
@ -68,11 +69,18 @@ class DOMRectReadOnly : public nsISupports, public nsWrapperCache {
return std::max(y, y + h);
}
bool WriteStructuredClone(JSStructuredCloneWriter* aWriter) const;
bool WriteStructuredClone(JSContext* aCx,
JSStructuredCloneWriter* aWriter) const;
bool ReadStructuredClone(JSStructuredCloneReader* aReader);
static already_AddRefed<DOMRectReadOnly> ReadStructuredClone(
JSContext* aCx, nsIGlobalObject* aGlobal,
JSStructuredCloneReader* aReader);
protected:
// Shared implementation of ReadStructuredClone for DOMRect and
// DOMRectReadOnly.
bool ReadStructuredClone(JSStructuredCloneReader* aReader);
nsCOMPtr<nsISupports> mParent;
double mX, mY, mWidth, mHeight;
};
@ -93,6 +101,11 @@ class DOMRect final : public DOMRectReadOnly {
virtual JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
static already_AddRefed<DOMRect> ReadStructuredClone(
JSContext* aCx, nsIGlobalObject* aGlobal,
JSStructuredCloneReader* aReader);
using DOMRectReadOnly::ReadStructuredClone;
void SetRect(float aX, float aY, float aWidth, float aHeight) {
mX = aX;
mY = aY;

View File

@ -16,8 +16,6 @@
#include "mozilla/dom/DirectoryBinding.h"
#include "mozilla/dom/DOMMatrix.h"
#include "mozilla/dom/DOMMatrixBinding.h"
#include "mozilla/dom/DOMRect.h"
#include "mozilla/dom/DOMRectBinding.h"
#include "mozilla/dom/File.h"
#include "mozilla/dom/FileList.h"
#include "mozilla/dom/FileListBinding.h"
@ -134,7 +132,7 @@ void AssertTagValues() {
SCTAG_DOM_DOMQUAD == 0xffff800e &&
SCTAG_DOM_RTC_CERTIFICATE == 0xffff800f &&
SCTAG_DOM_DOMRECT == 0xffff8010 &&
SCTAG_DOM_DOMRECT_READONLY == 0xffff8011 &&
SCTAG_DOM_DOMRECTREADONLY == 0xffff8011 &&
SCTAG_DOM_EXPANDED_PRINCIPAL == 0xffff8012 &&
SCTAG_DOM_DOMMATRIX == 0xffff8013 &&
SCTAG_DOM_URLSEARCHPARAMS == 0xffff8014 &&
@ -356,7 +354,6 @@ JSObject* StructuredCloneHolder::ReadFullySerializableObjects(
}
if (aTag == SCTAG_DOM_WEBCRYPTO_KEY || aTag == SCTAG_DOM_URLSEARCHPARAMS ||
aTag == SCTAG_DOM_DOMRECT || aTag == SCTAG_DOM_DOMRECT_READONLY ||
aTag == SCTAG_DOM_DOMMATRIX || aTag == SCTAG_DOM_DOMMATRIX_READONLY) {
// Prevent the return value from being trashed by a GC during ~nsRefPtr.
JS::Rooted<JSObject*> result(aCx);
@ -375,20 +372,6 @@ JSObject* StructuredCloneHolder::ReadFullySerializableObjects(
} else {
result = usp->WrapObject(aCx, nullptr);
}
} else if (aTag == SCTAG_DOM_DOMRECT) {
RefPtr<DOMRect> domRect = new DOMRect(global);
if (!domRect->ReadStructuredClone(aReader)) {
result = nullptr;
} else {
result = domRect->WrapObject(aCx, nullptr);
}
} else if (aTag == SCTAG_DOM_DOMRECT_READONLY) {
RefPtr<DOMRectReadOnly> domRect = new DOMRectReadOnly(global);
if (!domRect->ReadStructuredClone(aReader)) {
result = nullptr;
} else {
result = domRect->WrapObject(aCx, nullptr);
}
} else if (aTag == SCTAG_DOM_DOMMATRIX) {
RefPtr<DOMMatrix> domMatrix =
DOMMatrix::ReadStructuredClone(global, aReader);
@ -516,26 +499,6 @@ bool StructuredCloneHolder::WriteFullySerializableObjects(
}
#endif
// Handle DOMRect cloning
// Should be done before DOMRecteReadOnly check
// because every DOMRect is also a DOMRectReadOnly
{
DOMRect* domRect = nullptr;
if (NS_SUCCEEDED(UNWRAP_OBJECT(DOMRect, &obj, domRect))) {
return JS_WriteUint32Pair(aWriter, SCTAG_DOM_DOMRECT, 0) &&
domRect->WriteStructuredClone(aWriter);
}
}
// Handle DOMRectReadOnly cloning
{
DOMRectReadOnly* domRect = nullptr;
if (NS_SUCCEEDED(UNWRAP_OBJECT(DOMRectReadOnly, &obj, domRect))) {
return JS_WriteUint32Pair(aWriter, SCTAG_DOM_DOMRECT_READONLY, 0) &&
domRect->WriteStructuredClone(aWriter);
}
}
// Handle DOMMatrix cloning
// Should be done before DOMMatrixeReadOnly check
// because every DOMMatrix is also a DOMMatrixReadOnly

View File

@ -76,7 +76,7 @@ enum StructuredCloneTags {
SCTAG_DOM_DOMRECT,
// IMPORTANT: Don't change the order of these enum values. You could break
// IDB.
SCTAG_DOM_DOMRECT_READONLY,
SCTAG_DOM_DOMRECTREADONLY,
// IMPORTANT: Don't change the order of these enum values. You could break
// IDB.

View File

@ -12,7 +12,8 @@
[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
optional unrestricted double width = 0, optional unrestricted double height = 0),
Exposed=(Window,Worker)]
Exposed=(Window,Worker),
Serializable]
interface DOMRect : DOMRectReadOnly {
inherit attribute unrestricted double x;
inherit attribute unrestricted double y;
@ -23,7 +24,8 @@ interface DOMRect : DOMRectReadOnly {
[ProbablyShortLivingWrapper,
Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
optional unrestricted double width = 0, optional unrestricted double height = 0),
Exposed=(Window,Worker)]
Exposed=(Window,Worker),
Serializable]
interface DOMRectReadOnly {
readonly attribute unrestricted double x;
readonly attribute unrestricted double y;