#include "config.h"
#include "EditingRange.h"
#include <WebCore/Frame.h>
#include <WebCore/FrameSelection.h>
#include <WebCore/TextIterator.h>
#include <WebCore/VisibleUnits.h>
namespace WebKit {
Optional<WebCore::SimpleRange> EditingRange::toRange(WebCore::Frame& frame, const EditingRange& editingRange, EditingRangeIsRelativeTo base)
{
ASSERT(editingRange.location != notFound);
WebCore::CharacterRange range { editingRange.location, editingRange.length };
if (base == EditingRangeIsRelativeTo::EditableRoot) {
auto* element = frame.selection().rootEditableElementOrDocumentElement();
if (!element)
return WTF::nullopt;
return resolveCharacterRange(makeRangeSelectingNodeContents(*element), range);
}
ASSERT(base == EditingRangeIsRelativeTo::Paragraph);
auto paragraphStart = makeBoundaryPoint(startOfParagraph(frame.selection().selection().visibleStart()));
if (!paragraphStart)
return WTF::nullopt;
auto scopeEnd = makeBoundaryPointAfterNodeContents(paragraphStart->container->treeScope().rootNode());
return WebCore::resolveCharacterRange({ WTFMove(*paragraphStart), WTFMove(scopeEnd) }, range);
}
EditingRange EditingRange::fromRange(WebCore::Frame& frame, const Optional<WebCore::SimpleRange>& range, EditingRangeIsRelativeTo editingRangeIsRelativeTo)
{
ASSERT(editingRangeIsRelativeTo == EditingRangeIsRelativeTo::EditableRoot);
if (!range)
return { };
auto* element = frame.selection().rootEditableElementOrDocumentElement();
if (!element)
return { };
auto relativeRange = characterRange(makeBoundaryPointBeforeNodeContents(*element), *range);
return EditingRange(relativeRange.location, relativeRange.length);
}
}
namespace IPC {
void ArgumentCoder<WebKit::EditingRange>::encode(Encoder& encoder, const WebKit::EditingRange& editingRange)
{
encoder << editingRange.location;
encoder << editingRange.length;
}
Optional<WebKit::EditingRange> ArgumentCoder<WebKit::EditingRange>::decode(Decoder& decoder)
{
WebKit::EditingRange editingRange;
if (!decoder.decode(editingRange.location))
return WTF::nullopt;
if (!decoder.decode(editingRange.length))
return WTF::nullopt;
return editingRange;
}
}