/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim:set ts=2 sw=2 sts=2 et cindent: */ /* 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/. */
already_AddRefed<Selection> Highlight::CreateHighlightSelection(
nsAtom* aHighlightName, nsFrameSelection* aFrameSelection) {
MOZ_ASSERT(aFrameSelection);
MOZ_ASSERT(aFrameSelection->GetPresShell());
RefPtr<Selection> selection =
MakeRefPtr<Selection>(SelectionType::eHighlight, aFrameSelection);
selection->SetHighlightSelectionData({aHighlightName, this});
AutoFrameSelectionBatcher selectionBatcher(__FUNCTION__); for (const RefPtr<AbstractRange>& range : mRanges) { if (range->GetComposedDocOfContainers() ==
aFrameSelection->GetPresShell()->GetDocument()) { // since this is run in a context guarded by a selection batcher, // no strong reference is needed to keep `range` alive.
selection->AddHighlightRangeAndSelectFramesAndNotifyListeners(
MOZ_KnownLive(*range));
}
} return selection.forget();
}
void Highlight::Add(AbstractRange& aRange, ErrorResult& aRv) { // Manually check if the range `aKey` is already present in this highlight, // because `SetlikeHelpers::Add()` doesn't indicate this. // To keep the setlike and the mirrored array in sync, the range must not // be added to `mRanges` if it was already present. // `SetlikeHelpers::Has()` is much faster in checking this than // `nsTArray<>::Contains()`. if (Highlight_Binding::SetlikeHelpers::Has(this, aRange, aRv) ||
aRv.Failed()) { return;
}
Highlight_Binding::SetlikeHelpers::Add(this, aRange, aRv); if (aRv.Failed()) { return;
}
MOZ_ASSERT(!mRanges.Contains(&aRange), "setlike and DOM mirror are not in sync");
mRanges.AppendElement(&aRange);
AutoFrameSelectionBatcher selectionBatcher(__FUNCTION__,
mHighlightRegistries.Count()); for (const RefPtr<HighlightRegistry>& registry :
mHighlightRegistries.Keys()) { auto frameSelection = registry->GetFrameSelection();
selectionBatcher.AddFrameSelection(frameSelection); // since this is run in a context guarded by a selection batcher, // no strong reference is needed to keep `registry` alive.
MOZ_KnownLive(registry)->MaybeAddRangeToHighlightSelection(aRange, *this); if (aRv.Failed()) { return;
}
}
}
for (const RefPtr<HighlightRegistry>& registry :
mHighlightRegistries.Keys()) { auto frameSelection = registry->GetFrameSelection();
selectionBatcher.AddFrameSelection(frameSelection); // since this is run in a context guarded by a selection batcher, // no strong reference is needed to keep `registry` alive.
MOZ_KnownLive(registry)->RemoveHighlightSelection(*this);
}
}
}
for (const RefPtr<HighlightRegistry>& registry :
mHighlightRegistries.Keys()) { auto frameSelection = registry->GetFrameSelection();
selectionBatcher.AddFrameSelection(frameSelection); // since this is run in a context guarded by a selection batcher, // no strong reference is needed to keep `registry` alive.
MOZ_KnownLive(registry)->MaybeRemoveRangeFromHighlightSelection(aRange,
*this);
} returntrue;
} returnfalse;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.