# HG changeset patch # User Robert O'Callahan # Date 1379672464 -43200 # Node ID 64bcb2140c5acf184e888342965ba878df1b6092 # Parent 447914ee5598b87b49b06d09baeadaaee9d28e35 Bug 917755. Part 4: Add DOMQuad implementation. r=matspal diff --git a/content/base/src/DOMQuad.cpp b/content/base/src/DOMQuad.cpp new file mode 100644 --- /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 "gfxPoint.h" +#include + +using namespace mozilla; +using namespace mozilla::dom; + +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, gfxPoint 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) +{ + gfxPoint points[4]; + double x = aRect.X(), y = aRect.Y(), w = aRect.Width(), h = aRect.Height(); + points[0] = gfxPoint(x, y); + points[1] = gfxPoint(x + w, y); + points[2] = gfxPoint(x + w, y + h); + points[3] = gfxPoint(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 --- /dev/null +++ b/content/base/src/DOMQuad.h @@ -0,0 +1,69 @@ +/* -*- 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" + +class gfxPoint; + +namespace mozilla { +namespace dom { + +class DOMRectReadOnly; +class DOMPoint; +class DOMPointInit; + +class DOMQuad MOZ_FINAL : public nsWrapperCache +{ +public: + DOMQuad(nsISupports* aParent, gfxPoint 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 --- a/content/base/src/moz.build +++ b/content/base/src/moz.build @@ -55,16 +55,17 @@ if CONFIG['INTEL_ARCHITECTURE']: EXPORTS.mozilla.dom += [ 'Attr.h', 'Comment.h', 'DocumentFragment.h', 'DocumentType.h', 'DOMImplementation.h', 'DOMParser.h', 'DOMPoint.h', + 'DOMQuad.h', 'DOMRect.h', 'EventSource.h', 'Link.h', 'NodeIterator.h', 'ShadowRoot.h', 'Text.h', 'TreeWalker.h', ] @@ -74,16 +75,17 @@ UNIFIED_SOURCES += [ 'ChildIterator.cpp', 'Comment.cpp', 'DirectionalityUtils.cpp', 'DocumentFragment.cpp', 'DocumentType.cpp', 'DOMImplementation.cpp', 'DOMParser.cpp', 'DOMPoint.cpp', + 'DOMQuad.cpp', 'DOMRect.cpp', 'Element.cpp', 'EventSource.cpp', 'FileIOObject.cpp', 'FragmentOrElement.cpp', 'Link.cpp', 'NodeIterator.cpp', 'nsAtomListUtils.cpp', diff --git a/dom/bindings/Bindings.conf b/dom/bindings/Bindings.conf --- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -344,16 +344,20 @@ DOMInterfaces = { 'headerFile': 'mozilla/dom/DOMRect.h', 'resultNotAddRefed': [ 'item' ] }, 'DOMRectReadOnly': { 'headerFile': 'mozilla/dom/DOMRect.h', }, +'DOMQuad': { + 'resultNotAddRefed': [ 'bounds', 'p0', 'p1', 'p2', 'p3' ] +}, + 'DOMSettableTokenList': { 'nativeType': 'nsDOMSettableTokenList', }, 'DOMStringMap': { 'nativeType': 'nsDOMStringMap' }, diff --git a/dom/tests/mochitest/general/test_interfaces.html b/dom/tests/mochitest/general/test_interfaces.html --- a/dom/tests/mochitest/general/test_interfaces.html +++ b/dom/tests/mochitest/general/test_interfaces.html @@ -208,16 +208,17 @@ var interfaceNamesInGlobalScope = {name: "DOMConstructor", xbl: true}, "DOMCursor", "DOMError", "DOMException", "DOMImplementation", "DOMMMIError", "DOMParser", "DOMPoint", + "DOMQuad", "DOMRect", "DOMRectList", "DOMRequest", "DOMSettableTokenList", "DOMStringList", "DOMStringMap", "DOMTokenList", "DOMTransactionEvent", diff --git a/dom/webidl/DOMQuad.webidl b/dom/webidl/DOMQuad.webidl new file mode 100644 --- /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 --- a/dom/webidl/moz.build +++ b/dom/webidl/moz.build @@ -75,16 +75,17 @@ WEBIDL_FILES = [ 'DocumentType.webidl', 'DOMCursor.webidl', 'DOMError.webidl', 'DOMException.webidl', 'DOMImplementation.webidl', 'DOMMMIError.webidl', 'DOMParser.webidl', 'DOMPoint.webidl', + 'DOMQuad.webidl', 'DOMRect.webidl', 'DOMRectList.webidl', 'DOMRequest.webidl', 'DOMSettableTokenList.webidl', 'DOMStringMap.webidl', 'DOMTokenList.webidl', 'DOMTransaction.webidl', 'Downloads.webidl', diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js --- a/modules/libpref/src/init/all.js +++ b/modules/libpref/src/init/all.js @@ -1757,21 +1757,20 @@ pref("layout.css.filters.enabled", false // Is support for CSS sticky positioning enabled? #ifdef RELEASE_BUILD pref("layout.css.sticky.enabled", false); #else pref("layout.css.sticky.enabled", true); #endif // Is support for DOMPoint enabled? -#ifdef RELEASE_BUILD -pref("layout.css.DOMPoint.enabled", false); -#else pref("layout.css.DOMPoint.enabled", true); -#endif + +// 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); // Is support for the CSS4 image-orientation property enabled? pref("layout.css.image-orientation.enabled", true); // Is support for CSS3 Fonts features enabled?