Bug 917755. Part 4: Add DOMQuad implementation. r=jst
☠☠ backed out by 9e640765c3f4 ☠ ☠
authorRobert O'Callahan <robert@ocallahan.org>
Fri, 20 Sep 2013 22:21:04 +1200
changeset 174945 ada41f2f74b81a70b4bc41e6c38f2a2d90598445
parent 174944 5272cfbd63f3537442c39bf1976442c8651abea1
child 174946 5117e3f594e7ddcc10138074d8fd713126d8caf4
push id271
push userpvanderbeken@mozilla.com
push dateMon, 24 Mar 2014 22:43:42 +0000
reviewersjst
bugs917755
milestone31.0a1
Bug 917755. Part 4: Add DOMQuad implementation. r=jst
content/base/src/DOMQuad.cpp
content/base/src/DOMQuad.h
content/base/src/moz.build
dom/bindings/Bindings.conf
dom/tests/mochitest/general/test_interfaces.html
dom/webidl/DOMQuad.webidl
dom/webidl/moz.build
modules/libpref/src/init/all.js
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 <algorithm>
+
+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<JSObject*> aScope)
+{
+  return DOMQuadBinding::Wrap(aCx, aScope, this);
+}
+
+already_AddRefed<DOMQuad>
+DOMQuad::Constructor(const GlobalObject& aGlobal,
+                     const DOMPointInit& aP1,
+                     const DOMPointInit& aP2,
+                     const DOMPointInit& aP3,
+                     const DOMPointInit& aP4,
+                     ErrorResult& aRV)
+{
+  nsRefPtr<DOMQuad> 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>
+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<DOMQuad> 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<DOMQuad> 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<DOMQuad*>(this));
+  }
+  return mBounds;
+}
new file mode 100644
--- /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<JSObject*> aScope) MOZ_OVERRIDE;
+
+  static already_AddRefed<DOMQuad>
+  Constructor(const GlobalObject& aGlobal,
+              const DOMPointInit& aP1,
+              const DOMPointInit& aP2,
+              const DOMPointInit& aP3,
+              const DOMPointInit& aP4,
+              ErrorResult& aRV);
+  static already_AddRefed<DOMQuad>
+  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<nsISupports> mParent;
+  nsRefPtr<DOMPoint> mPoints[4];
+  mutable nsRefPtr<QuadBounds> mBounds; // allocated lazily
+};
+
+}
+}
+
+#endif /*MOZILLA_DOMRECT_H_*/
--- a/content/base/src/moz.build
+++ b/content/base/src/moz.build
@@ -56,16 +56,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',
     'DOMStringList.h',
     'EventSource.h',
     'Link.h',
     'NodeIterator.h',
     'ShadowRoot.h',
     'Text.h',
     'TreeWalker.h',
@@ -76,16 +77,17 @@ UNIFIED_SOURCES += [
     'ChildIterator.cpp',
     'Comment.cpp',
     'DirectionalityUtils.cpp',
     'DocumentFragment.cpp',
     'DocumentType.cpp',
     'DOMImplementation.cpp',
     'DOMParser.cpp',
     'DOMPoint.cpp',
+    'DOMQuad.cpp',
     'DOMRect.cpp',
     'DOMStringList.cpp',
     'Element.cpp',
     'EventSource.cpp',
     'FileIOObject.cpp',
     'FragmentOrElement.cpp',
     'Link.cpp',
     'NodeIterator.cpp',
--- a/dom/bindings/Bindings.conf
+++ b/dom/bindings/Bindings.conf
@@ -337,16 +337,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'
 },
 
--- a/dom/tests/mochitest/general/test_interfaces.html
+++ b/dom/tests/mochitest/general/test_interfaces.html
@@ -305,16 +305,18 @@ var interfaceNamesInGlobalScope =
     "DOMMMIError",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "DOMParser",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "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!
     "DOMRectList",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "DOMRectReadOnly",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "DOMRequest",
 // IMPORTANT: Do not change this list without review from a DOM peer!
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
--- a/dom/webidl/moz.build
+++ b/dom/webidl/moz.build
@@ -79,16 +79,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',
     'DOMStringList.webidl',
     'DOMStringMap.webidl',
     'DOMTokenList.webidl',
     'DOMTransaction.webidl',
--- a/modules/libpref/src/init/all.js
+++ b/modules/libpref/src/init/all.js
@@ -1808,16 +1808,19 @@ pref("layout.css.sticky.enabled", true);
 #endif
 
 // Is support for CSS "will-change" enabled?
 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);
 
 // Is support for the CSS4 image-orientation property enabled?
 pref("layout.css.image-orientation.enabled", true);
 
 // Is support for CSS3 Fonts features enabled?
 // (includes font-variant-*, font-kerning, font-synthesis