mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-18 15:55:36 +00:00
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:
parent
a408716f68
commit
0fa1029320
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user