diff --git a/content/base/src/DOMQuad.cpp b/content/base/src/DOMQuad.cpp new file mode 100644 index 00000000000..1445a531f06 --- /dev/null +++ b/content/base/src/DOMQuad.cpp @@ -0,0 +1,159 @@ +/* -*- Mode: C++; 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/. */ + +#include "mozilla/dom/DOMQuad.h" + +#include "mozilla/dom/DOMQuadBinding.h" +#include "mozilla/dom/DOMPoint.h" +#include "mozilla/dom/DOMRect.h" +#include + +using namespace mozilla; +using namespace mozilla::dom; +using namespace mozilla::gfx; + +NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_6(DOMQuad, mParent, mBounds, mPoints[0], + mPoints[1], mPoints[2], mPoints[3]) + +NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(DOMQuad, AddRef) +NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(DOMQuad, Release) + +DOMQuad::DOMQuad(nsISupports* aParent, CSSPoint aPoints[4]) + : mParent(aParent) +{ + SetIsDOMBinding(); + for (uint32_t i = 0; i < 4; ++i) { + mPoints[i] = new DOMPoint(aParent, aPoints[i].x, aPoints[i].y); + } +} + +DOMQuad::DOMQuad(nsISupports* aParent) + : mParent(aParent) +{ + SetIsDOMBinding(); +} + +DOMQuad::~DOMQuad() +{ +} + +JSObject* +DOMQuad::WrapObject(JSContext* aCx, JS::Handle aScope) +{ + return DOMQuadBinding::Wrap(aCx, aScope, this); +} + +already_AddRefed +DOMQuad::Constructor(const GlobalObject& aGlobal, + const DOMPointInit& aP1, + const DOMPointInit& aP2, + const DOMPointInit& aP3, + const DOMPointInit& aP4, + ErrorResult& aRV) +{ + nsRefPtr obj = new DOMQuad(aGlobal.GetAsSupports()); + obj->mPoints[0] = DOMPoint::Constructor(aGlobal, aP1, aRV); + obj->mPoints[1] = DOMPoint::Constructor(aGlobal, aP2, aRV); + obj->mPoints[2] = DOMPoint::Constructor(aGlobal, aP3, aRV); + obj->mPoints[3] = DOMPoint::Constructor(aGlobal, aP4, aRV); + return obj.forget(); +} + +already_AddRefed +DOMQuad::Constructor(const GlobalObject& aGlobal, const DOMRectReadOnly& aRect, + ErrorResult& aRV) +{ + CSSPoint points[4]; + Float x = aRect.X(), y = aRect.Y(), w = aRect.Width(), h = aRect.Height(); + points[0] = CSSPoint(x, y); + points[1] = CSSPoint(x + w, y); + points[2] = CSSPoint(x + w, y + h); + points[3] = CSSPoint(x, y + h); + nsRefPtr obj = new DOMQuad(aGlobal.GetAsSupports(), points); + return obj.forget(); +} + +class DOMQuad::QuadBounds MOZ_FINAL : public DOMRectReadOnly +{ +public: + QuadBounds(DOMQuad* aQuad) + : DOMRectReadOnly(aQuad->GetParentObject()) + , mQuad(aQuad) + {} + + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(QuadBounds, DOMRectReadOnly) + NS_DECL_ISUPPORTS_INHERITED + + virtual double X() const + { + double x1, x2; + GetHorizontalMinMax(&x1, &x2); + return x1; + } + virtual double Y() const + { + double y1, y2; + GetVerticalMinMax(&y1, &y2); + return y1; + } + virtual double Width() const + { + double x1, x2; + GetHorizontalMinMax(&x1, &x2); + return x2 - x1; + } + virtual double Height() const + { + double y1, y2; + GetVerticalMinMax(&y1, &y2); + return y2 - y1; + } + + void GetHorizontalMinMax(double* aX1, double* aX2) const + { + double x1, x2; + x1 = x2 = mQuad->Point(0)->X(); + for (uint32_t i = 1; i < 4; ++i) { + double x = mQuad->Point(i)->X(); + x1 = std::min(x1, x); + x2 = std::max(x2, x); + } + *aX1 = x1; + *aX2 = x2; + } + + void GetVerticalMinMax(double* aY1, double* aY2) const + { + double y1, y2; + y1 = y2 = mQuad->Point(0)->Y(); + for (uint32_t i = 1; i < 4; ++i) { + double y = mQuad->Point(i)->Y(); + y1 = std::min(y1, y); + y2 = std::max(y2, y); + } + *aY1 = y1; + *aY2 = y2; + } + +protected: + nsRefPtr mQuad; +}; + +NS_IMPL_CYCLE_COLLECTION_INHERITED_1(DOMQuad::QuadBounds, DOMRectReadOnly, mQuad) + +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(DOMQuad::QuadBounds) +NS_INTERFACE_MAP_END_INHERITING(DOMRectReadOnly) + +NS_IMPL_ADDREF_INHERITED(DOMQuad::QuadBounds, DOMRectReadOnly) +NS_IMPL_RELEASE_INHERITED(DOMQuad::QuadBounds, DOMRectReadOnly) + +DOMRectReadOnly* +DOMQuad::Bounds() const +{ + if (!mBounds) { + mBounds = new QuadBounds(const_cast(this)); + } + return mBounds; +} diff --git a/content/base/src/DOMQuad.h b/content/base/src/DOMQuad.h new file mode 100644 index 00000000000..0806b246f3d --- /dev/null +++ b/content/base/src/DOMQuad.h @@ -0,0 +1,70 @@ +/* -*- Mode: C++; 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/. */ + +#ifndef MOZILLA_DOMQUAD_H_ +#define MOZILLA_DOMQUAD_H_ + +#include "nsWrapperCache.h" +#include "nsISupports.h" +#include "nsCycleCollectionParticipant.h" +#include "mozilla/Attributes.h" +#include "nsCOMPtr.h" +#include "nsAutoPtr.h" +#include "mozilla/dom/BindingDeclarations.h" +#include "mozilla/ErrorResult.h" +#include "Units.h" + +namespace mozilla { +namespace dom { + +class DOMRectReadOnly; +class DOMPoint; +struct DOMPointInit; + +class DOMQuad MOZ_FINAL : public nsWrapperCache +{ +public: + DOMQuad(nsISupports* aParent, CSSPoint aPoints[4]); + DOMQuad(nsISupports* aParent); + ~DOMQuad(); + + NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(DOMQuad) + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(DOMQuad) + + nsISupports* GetParentObject() const { return mParent; } + virtual JSObject* WrapObject(JSContext* aCx, + JS::Handle aScope) MOZ_OVERRIDE; + + static already_AddRefed + Constructor(const GlobalObject& aGlobal, + const DOMPointInit& aP1, + const DOMPointInit& aP2, + const DOMPointInit& aP3, + const DOMPointInit& aP4, + ErrorResult& aRV); + static already_AddRefed + Constructor(const GlobalObject& aGlobal, const DOMRectReadOnly& aRect, + ErrorResult& aRV); + + DOMRectReadOnly* Bounds() const; + DOMPoint* P1() const { return mPoints[0]; } + DOMPoint* P2() const { return mPoints[1]; } + DOMPoint* P3() const { return mPoints[2]; } + DOMPoint* P4() const { return mPoints[3]; } + + DOMPoint* Point(uint32_t aIndex) { return mPoints[aIndex]; } + +protected: + class QuadBounds; + + nsCOMPtr mParent; + nsRefPtr mPoints[4]; + mutable nsRefPtr mBounds; // allocated lazily +}; + +} +} + +#endif /*MOZILLA_DOMRECT_H_*/ diff --git a/content/base/src/moz.build b/content/base/src/moz.build index bda6ff921fc..82304b5f8ed 100644 --- a/content/base/src/moz.build +++ b/content/base/src/moz.build @@ -61,6 +61,7 @@ EXPORTS.mozilla.dom += [ 'DOMImplementation.h', 'DOMParser.h', 'DOMPoint.h', + 'DOMQuad.h', 'DOMRect.h', 'DOMStringList.h', 'EventSource.h', @@ -81,6 +82,7 @@ UNIFIED_SOURCES += [ 'DOMImplementation.cpp', 'DOMParser.cpp', 'DOMPoint.cpp', + 'DOMQuad.cpp', 'DOMRect.cpp', 'DOMStringList.cpp', 'Element.cpp', diff --git a/dom/bindings/Bindings.conf b/dom/bindings/Bindings.conf index 63bd7b9ec2d..e3afdcb20e1 100644 --- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -342,6 +342,10 @@ DOMInterfaces = { 'headerFile': 'mozilla/dom/DOMRect.h', }, +'DOMQuad': { + 'resultNotAddRefed': [ 'bounds', 'p0', 'p1', 'p2', 'p3' ] +}, + 'DOMSettableTokenList': { 'nativeType': 'nsDOMSettableTokenList', }, diff --git a/dom/tests/mochitest/general/test_interfaces.html b/dom/tests/mochitest/general/test_interfaces.html index 0cf08f3cfeb..c5ce599114c 100644 --- a/dom/tests/mochitest/general/test_interfaces.html +++ b/dom/tests/mochitest/general/test_interfaces.html @@ -309,6 +309,8 @@ var interfaceNamesInGlobalScope = "DOMPoint", // IMPORTANT: Do not change this list without review from a DOM peer! "DOMPointReadOnly", +// IMPORTANT: Do not change this list without review from a DOM peer! + "DOMQuad", // IMPORTANT: Do not change this list without review from a DOM peer! "DOMRect", // IMPORTANT: Do not change this list without review from a DOM peer! diff --git a/dom/webidl/DOMQuad.webidl b/dom/webidl/DOMQuad.webidl new file mode 100644 index 00000000000..b933987d597 --- /dev/null +++ b/dom/webidl/DOMQuad.webidl @@ -0,0 +1,23 @@ +/* -*- 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/. + * + * The origin of this IDL file is + * http://dev.w3.org/fxtf/geometry/ + * + * Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C + * liability, trademark and document use rules apply. + */ + +[Pref="layout.css.DOMQuad.enabled", + Constructor(optional DOMPointInit p1, optional DOMPointInit p2, + optional DOMPointInit p3, optional DOMPointInit p4), + Constructor(DOMRectReadOnly rect)] +interface DOMQuad { + [SameObject] readonly attribute DOMPoint p1; + [SameObject] readonly attribute DOMPoint p2; + [SameObject] readonly attribute DOMPoint p3; + [SameObject] readonly attribute DOMPoint p4; + [SameObject] readonly attribute DOMRectReadOnly bounds; +}; \ No newline at end of file diff --git a/dom/webidl/moz.build b/dom/webidl/moz.build index 03f9418eee8..a4dfc1a0d29 100644 --- a/dom/webidl/moz.build +++ b/dom/webidl/moz.build @@ -84,6 +84,7 @@ WEBIDL_FILES = [ 'DOMMMIError.webidl', 'DOMParser.webidl', 'DOMPoint.webidl', + 'DOMQuad.webidl', 'DOMRect.webidl', 'DOMRectList.webidl', 'DOMRequest.webidl', diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js index 587b6c3eb60..3de8428def6 100644 --- a/modules/libpref/src/init/all.js +++ b/modules/libpref/src/init/all.js @@ -1813,6 +1813,9 @@ pref("layout.css.will-change.enabled", false); // Is support for DOMPoint enabled? pref("layout.css.DOMPoint.enabled", true); +// Is support for DOMQuad enabled? +pref("layout.css.DOMQuad.enabled", true); + // Is support for CSS "text-align: true X" enabled? pref("layout.css.text-align-true-value.enabled", false);