Bug 1282752 Part 3: Add a new DOM method and wire it to CollectClientRectsAndText. draft
authorBrad Werth <bwerth@mozilla.com>
Thu, 27 Oct 2016 14:38:49 -0700
changeset 431067 8daf08a22e1afda93820f080aa7bead43606c68f
parent 431066 c8a48d2da66639c2f7d04567b7e1dcd7037f4ea4
child 431068 9daa30943bb0cb98cbf915b3def9e6fae4d33a95
push id34000
push userbwerth@mozilla.com
push dateFri, 28 Oct 2016 19:38:20 +0000
bugs1282752
milestone52.0a1
Bug 1282752 Part 3: Add a new DOM method and wire it to CollectClientRectsAndText. MozReview-Commit-ID: GRM87Pi3g4G
dom/base/nsRange.cpp
dom/base/nsRange.h
dom/webidl/Range.webidl
--- a/dom/base/nsRange.cpp
+++ b/dom/base/nsRange.cpp
@@ -3059,16 +3059,31 @@ nsRange::GetClientRects(bool aClampToEdg
 
   nsLayoutUtils::RectListBuilder builder(rectList);
 
   CollectClientRectsAndText(&builder, nullptr, this, mStartParent,
     mStartOffset, mEndParent, mEndOffset, aClampToEdge, aFlushLayout);
   return rectList.forget();
 }
 
+void
+nsRange::GetClientRectsAndTexts(
+  mozilla::dom::ClientRectsAndTexts& aResult,
+  ErrorResult& aErr)
+{
+  if (!mStartParent) {
+    return;
+  }
+
+  nsLayoutUtils::RectListBuilder builder(aResult.mRectList.Value());
+
+  CollectClientRectsAndText(&builder, aResult.mTextList.Value(), this,
+    mStartParent, mStartOffset, mEndParent, mEndOffset, true, true);
+}
+
 NS_IMETHODIMP
 nsRange::GetUsedFontFaces(nsIDOMFontFaceList** aResult)
 {
   *aResult = nullptr;
 
   NS_ENSURE_TRUE(mStartParent, NS_ERROR_UNEXPECTED);
 
   nsCOMPtr<nsINode> startContainer = do_QueryInterface(mStartParent);
--- a/dom/base/nsRange.h
+++ b/dom/base/nsRange.h
@@ -20,19 +20,21 @@
 #include "prmon.h"
 #include "nsStubMutationObserver.h"
 #include "nsWrapperCache.h"
 #include "mozilla/Attributes.h"
 
 namespace mozilla {
 class ErrorResult;
 namespace dom {
+struct ClientRectsAndTexts;
 class DocumentFragment;
 class DOMRect;
 class DOMRectList;
+class DOMStringList;
 class Selection;
 } // namespace dom
 } // namespace mozilla
 
 class nsRange final : public nsIDOMRange,
                       public nsStubMutationObserver,
                       public nsWrapperCache
 {
@@ -207,16 +209,19 @@ public:
   void SetStart(nsINode& aNode, uint32_t aOffset, ErrorResult& aErr);
   void SetStartAfter(nsINode& aNode, ErrorResult& aErr);
   void SetStartBefore(nsINode& aNode, ErrorResult& aErr);
   void SurroundContents(nsINode& aNode, ErrorResult& aErr);
   already_AddRefed<DOMRect> GetBoundingClientRect(bool aClampToEdge = true,
                                                   bool aFlushLayout = true);
   already_AddRefed<DOMRectList> GetClientRects(bool aClampToEdge = true,
                                                bool aFlushLayout = true);
+  void GetClientRectsAndTexts(
+    mozilla::dom::ClientRectsAndTexts& aResult,
+    ErrorResult& aErr);
   static void GetInnerTextNoFlush(mozilla::dom::DOMString& aValue,
                                   mozilla::ErrorResult& aError,
                                   nsIContent* aStartParent,
                                   uint32_t aStartOffset,
                                   nsIContent* aEndParent,
                                   uint32_t aEndOffset);
 
   nsINode* GetParentObject() const { return mOwner; }
--- a/dom/webidl/Range.webidl
+++ b/dom/webidl/Range.webidl
@@ -81,8 +81,18 @@ partial interface Range {
   DocumentFragment createContextualFragment(DOMString fragment);
 };
 
 // http://dvcs.w3.org/hg/csswg/raw-file/tip/cssom-view/Overview.html#extensions-to-the-range-interface
 partial interface Range {
   DOMRectList? getClientRects();
   DOMRect getBoundingClientRect();
 };
+
+dictionary ClientRectsAndTexts {
+  DOMRectList rectList;
+  DOMStringList textList;
+};
+
+partial interface Range {
+  [Throws]
+  ClientRectsAndTexts getClientRectsAndTexts();
+};