Bug 917755. Part 4: Add DOMQuad implementation. r=jst
☠☠ backed out by 5bad1b22001c ☠ ☠
authorRobert O'Callahan <robert@ocallahan.org>
Fri, 20 Sep 2013 22:21:04 +1200
changeset 174243 8ad57cf09e758617455a8aebdc33867bb10093ba
parent 174242 3b41ab878fcdbc08cbcaddc60bf93f7caa3ebcd3
child 174244 4771c2b309ad3389e96de6960e5eb315fb4e0a06
push id41230
push userrocallahan@mozilla.com
push dateWed, 19 Mar 2014 06:26:26 +0000
treeherdermozilla-inbound@2f3187619c9e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjst
bugs917755
milestone31.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
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
@@ -61,16 +61,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',
@@ -81,16 +82,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
@@ -307,16 +307,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
@@ -1800,16 +1800,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