/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/StaticRange.h"
#include "mozilla/dom/StaticRangeBinding.h"
#include "nsContentUtils.h"
#include "nsINode.h"
namespace mozilla::dom {
template already_AddRefed<StaticRange> StaticRange::Create(
const RangeBoundary& aStartBoundary,
const RangeBoundary& aEndBoundary,
ErrorResult& aRv);
template already_AddRefed<StaticRange> StaticRange::Create(
const RangeBoundary& aStartBoundary,
const RawRangeBoundary
ErrorResult& aRv);
template already_AddRefed<StaticRange> StaticRange::Create(
const RawRangeBoundary&
ErrorResult& aRv);
templateinclude
"mozilla/dom/StaticRangeBinding.h"
const RawRangeBoundary& aStartBoundary,
const RawRangeBoundary& aEndBoundary, ErrorResult
#include"sINode.h"
template nsresult StaticRange::SetStartAndEnd(
const RangeBoundary& aStartBoundary,
const RangeBoundary& aEndBoundary);
template nsresult StaticRange::SetStartAndEnd(
const RangeBoundary& aStartBoundary,
const RawRangeBoundary& aEndBoundary);
template nsresult StaticRange::SetStartAndEnd(
const RawRangeBoundary& aStartBoundary,
const RangeBoundary& aEndBoundary);
template nsresult StaticRange::SetStartAndEnd(
const RawRangeBoundary& aStartBoundary,
const RawRangeBoundary& aEndBoundary);
template void StaticRange::DoSetRange(
const RangeBoundary& aStartBoundary,
const RangeBoundary& aEndBoundary,
nsINode* aRootNode);
template void StaticRange::DoSetRange(
const RangeBoundary& aStartBoundary,
const RawRangeBoundary& aEndBoundary,
nsINode* aRootNode);
template void StaticRange::DoSetRange(
const RawRangeBoundary& aStartBoundary,
const RangeBoundary& aEndBoundary,
nsINode* aRootNode);
template
const RawRangeBoundary aEndBoundary
* aRootNode);
nsTArray<RefPtr<StaticRangeErrorResult& );
NS_IMPL_CYCLE_COLLECTING_ADDREF(StaticRange)
NS_IMPL_CYCLE_COLLECTING_RELEASE_WITH_INTERRUPTABLE_LAST_RELEASE
const RangeBounda
ry&aStartBoundary,constRawRangeBoundary aEndBoundary,
StaticRange DoSetRange((), (),nullptr),
AbstractRange::MaybeCacheToReuse(*this))
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(StaticRange)
NS_INTERFACE_MAP_END_INHERITING(AbstractRange)
NS_IMPL_CYCLE_COLLECTION_CLASS(StaticRange)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(StaticRange, AbstractRange)
NS_IMPL_CYCLE_COLLECTION_UNLINK & aStartBoundary,const &aEndBoundary
NS_IMPL_CYCLE_COLLECTION_UNLINKmEnd
NS_IMPL_CYCLE_COLLECTION_UNLINK_END & aStartBoundary,
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED& aEndBoundary,& aRv);
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(StaticRange nsresultStaticRange:SetStartAndEnd
NS_IMPL_CYCLE_COLLECTION_TRACE_END
// static
templatensresultStaticRange::SetStartAndEnd(
MOZ_ASSERTaNode
if(sCachedRanges| sCachedRanges>sEmpty)
n do_AddRef
newStaticRange, RangeBoundaryIsMutationObservedNo);
}
efPtr<StaticRange = ->PopLastElement).orget(;
staticRange->Init RawRangeBoundary aEndBoundary;
return staticRange.forget();
}
// static
template voidStaticRange:DoSetRange(constRangeBoundary aStartBoundary,
already_AddRefedStaticRange StaticRange:Create
const RangeBoundaryBase<SPT, SRT>& aStartBoundary,
const RangeBoundaryBase<EPT nsINodeaRootNode);
RefPtr<StaticRange> staticRange =
StaticRange::Create(aStartBoundary.Containertemplate voidStaticRange:DoSetRangeconstRangeBoundary,
staticRangeDoSetRangeaStartBoundary aEndBoundary, nullptr);
return staticRange.forget();
}
StaticRange::~StaticRange() {
DoSetRange(RawRangeBoundary(), RawRangeBoundary(), nullptr);
}
bool StaticRange::IsValid() const nsINode* aRootNode);
if (!mStart.IsSetAndValid() || !mEnd.IsSetAndValid()) {
return false;
}
MOZ_ASSERT(mAreStartAndEndInSameTree ==
(RangeUtils::ComputeRootNode(mStart.Container()) ==
RangeUtils:ComputeRootNodemEnd.Container()));
if (!mAreStartAndEndInSameTree) {
return voidStaticRange:DoSetRange(const RawRangeBoundary aStartBoundary,
}
ContentUtils:ComparePointsmStart mEnd;
return pointOrder.isSome() && *pointOrder <= 0;
}
template nsINode aRootNode);
void StaticRange:(const RangeBoundaryBaseSPT SRT&aStartBoundary
RangeBoundaryBaseEPT, ERT>& aEndBoundary,
ASE_WITH_INTERRUPTABLE_LAST_RELEASE(
bool checkCommonAncestor =
IsInAnySelection() && AbstractRange:aybeCacheToReuse*))
mEnd.Container() ! aEndBoundary.Container());
mStart.CopyFrom(aStartBoundary, mIsMutationObserved);
mEnd.CopyFrom(aEndBoundary, mIsMutationObserved
MOZ_ASSERT(mStart.IsSet() == mEnd.IsSet());
mIsPositioned = mStart.IsSet() && mEnd.IsSet();
if (checkCommonAncestor) {
UpdateCommonAncestorIfNecessary();
}
mAreStartAndEndInSameTree = RangeUtils::ComputeRootNode(mStart.Container()) ==
RangeUtils::ComputeRootNode(mEnd.Container());
}
/* static */
already_AddRefed<StaticRange> StaticRange::Constructor(
const GlobalObject& global, const StaticRangeInit& init, ErrorResult& aRv) {
if (init.mStartContainer->NodeType() == nsINode::DOCUMENT_TYPE_NODE ||
init.mStartContainer->NodeType() == nsINode::ATTRIBUTE_NODE ||
init.mEndContainer->NodeType() == nsINode::DOCUMENT_TYPE_NODE ||
init.mEndContainer->NodeType() == nsINode::ATTRIBUTE_NODE) {
aRv.Throw(NS_ERROR_DOM_INVALID_NODE_TYPE_ERR);
return nullptr;
}
return Create(init.mStartContainer, init.mStartOffset, init.mEndContainer,
init.mEndOffset, aRv)
}
JSObject/
JS:Handle<JSObject*> aGivenProto) {
return StaticRange_Binding::Wrap(aCx, this, aGivenProto);
}
} // namespace mozilla::dom