1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7 #include "nsDOMCaretPosition.h"
8
9 #include "mozilla/dom/CaretPositionBinding.h"
10 #include "mozilla/dom/DOMRect.h"
11 #include "nsRange.h"
12
13 using namespace mozilla::dom;
14
nsDOMCaretPosition(nsINode * aNode,uint32_t aOffset)15 nsDOMCaretPosition::nsDOMCaretPosition(nsINode* aNode, uint32_t aOffset)
16 : mOffset(aOffset), mOffsetNode(aNode), mAnonymousContentNode(nullptr) {}
17
~nsDOMCaretPosition()18 nsDOMCaretPosition::~nsDOMCaretPosition() {}
19
GetOffsetNode() const20 nsINode* nsDOMCaretPosition::GetOffsetNode() const { return mOffsetNode; }
21
GetClientRect() const22 already_AddRefed<DOMRect> nsDOMCaretPosition::GetClientRect() const {
23 if (!mOffsetNode) {
24 return nullptr;
25 }
26
27 RefPtr<DOMRect> rect;
28 RefPtr<nsRange> domRange;
29 nsCOMPtr<nsINode> node;
30
31 if (mAnonymousContentNode) {
32 node = mAnonymousContentNode;
33 } else {
34 node = mOffsetNode;
35 }
36
37 nsresult creationRv = nsRange::CreateRange(node, mOffset, node, mOffset,
38 getter_AddRefs<nsRange>(domRange));
39 if (!NS_SUCCEEDED(creationRv)) {
40 return nullptr;
41 }
42
43 NS_ASSERTION(domRange,
44 "unable to retrieve valid dom range from CaretPosition");
45
46 rect = domRange->GetBoundingClientRect(false);
47
48 return rect.forget();
49 }
50
WrapObject(JSContext * aCx,JS::Handle<JSObject * > aGivenProto)51 JSObject* nsDOMCaretPosition::WrapObject(JSContext* aCx,
52 JS::Handle<JSObject*> aGivenProto) {
53 return mozilla::dom::CaretPositionBinding::Wrap(aCx, this, aGivenProto);
54 }
55
56 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(nsDOMCaretPosition, mOffsetNode,
57 mAnonymousContentNode)
58
59 NS_IMPL_CYCLE_COLLECTING_ADDREF(nsDOMCaretPosition)
60 NS_IMPL_CYCLE_COLLECTING_RELEASE(nsDOMCaretPosition)
61
62 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsDOMCaretPosition)
63 NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
64 NS_INTERFACE_MAP_ENTRY(nsISupports)
65 NS_INTERFACE_MAP_END
66