Bug 1314080 Part 3: Add a new ChromeOnly DOM method and wire it to CollectClientRectsAndText. r?smaug
MozReview-Commit-ID: GRM87Pi3g4G
--- a/dom/base/nsRange.cpp
+++ b/dom/base/nsRange.cpp
@@ -3058,16 +3058,34 @@ 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;
+ }
+
+ aResult.mRectList = new DOMRectList(static_cast<nsIDOMRange*>(this));
+ aResult.mTextList = new DOMStringList();
+
+ nsLayoutUtils::RectListBuilder builder(aResult.mRectList);
+
+ CollectClientRectsAndText(&builder, aResult.mTextList, 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,16 +20,17 @@
#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 Selection;
} // namespace dom
} // namespace mozilla
class nsRange final : public nsIDOMRange,
@@ -207,16 +208,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 {
+ required DOMRectList rectList;
+ required DOMStringList textList;
+};
+
+partial interface Range {
+ [ChromeOnly, Throws]
+ ClientRectsAndTexts getClientRectsAndTexts();
+};