void DocumentMarkerController::addMarker(Range* range, DocumentMarker::MarkerType type, const String& description)
{
    // Use a TextIterator to visit the potentially multiple nodes the range covers.
    for (TextIterator markedText(range); !markedText.atEnd(); markedText.advance()) {
        RefPtr<Range> textPiece = markedText.range();
        int exception = 0;
        addMarker(textPiece->startContainer(exception),
                  DocumentMarker(type, textPiece->startOffset(exception), textPiece->endOffset(exception), description));
    }
}
TEST_F(DocumentMarkerControllerTest, CompositionMarkersNotMerged)
{
    IntRect invalidRect(RenderedDocumentMarker::create(DocumentMarker(0, 0, false))->renderedRect());

    setBodyInnerHTML("<div style='margin: 100px'>foo</div>");
    RefPtrWillBeRawPtr<Node> text = document().body()->firstChild()->firstChild();
    document().updateLayout();
    markerController().addCompositionMarker(Position(text, 0), Position(text, 1), Color::black, false, Color::black);
    markerController().addCompositionMarker(Position(text, 1), Position(text, 3), Color::black, true, Color::black);

    EXPECT_EQ(2u, markerController().markers().size());
}
TEST_F(DocumentMarkerControllerTest, UpdateRenderedRects)
{
    LayoutRect invalidRect = RenderedDocumentMarker::create(DocumentMarker(0, 0, false))->renderedRect();

    setBodyInnerHTML("<div style='margin: 100px'>foo</div>");
    RefPtrWillBeRawPtr<Element> div = toElement(document().body()->firstChild());
    markNodeContents(div);
    Vector<IntRect> renderedRects = markerController().renderedRectsForMarkers(DocumentMarker::Spelling);
    EXPECT_EQ(1u, renderedRects.size());
    EXPECT_NE(invalidRect, renderedRects[0]);

    div->setAttribute(HTMLNames::styleAttr, "margin: 200px");
    document().updateLayout();
    Vector<IntRect> newRenderedRects = markerController().renderedRectsForMarkers(DocumentMarker::Spelling);
    EXPECT_EQ(1u, newRenderedRects.size());
    EXPECT_NE(renderedRects[0], newRenderedRects[0]);
}
void DocumentMarkerController::addTextMatchMarker(const Range* range, bool activeMatch)
{
    // Use a TextIterator to visit the potentially multiple nodes the range covers.
    for (TextIterator markedText(range); !markedText.atEnd(); markedText.advance()) {
        RefPtr<Range> textPiece = markedText.range();
        unsigned startOffset = textPiece->startOffset();
        unsigned endOffset = textPiece->endOffset();
        addMarker(textPiece->startContainer(), DocumentMarker(startOffset, endOffset, activeMatch));
        if (endOffset > startOffset) {
            // Rendered rects for markers in WebKit are not populated until each time
            // the markers are painted. However, we need it to happen sooner, because
            // the whole purpose of tickmarks on the scrollbar is to show where
            // matches off-screen are (that haven't been painted yet).
            Node* node = textPiece->startContainer();
            Vector<RenderedDocumentMarker*> markers = markersFor(node);
            markers[markers.size() - 1]->setRenderedRect(range->boundingBox());
        }
    }
}
Example #5
0
bool DocumentMarkerController::addUserSpellingMarker(Node* node, unsigned start, unsigned length, RefPtr<DOMStringList> suggestions, unsigned options)
{
    if (!node || !length)
        return false;

    Node* spellingNode = userSpellingNode(node);
    if (!spellingNode)
        return false;

    // Serialize the suggestions into text until the DocumentMarker class supports multiple descriptions.
    String description;
    for (size_t i = 0; i < suggestions->length(); i++) {
        description += suggestions->item(i);
        description.append('\n');
    }
    addMarker(spellingNode, DocumentMarker(DocumentMarker::UserSpelling, start, start + length, description));

    UNUSED_PARAM(options);
    return true;
}
void DocumentMarkerController::addMarkerToNode(Node* node, unsigned startOffset, unsigned length, DocumentMarker::MarkerType type, PassRefPtr<DocumentMarkerDetails> details)
{
    addMarker(node, DocumentMarker(type, startOffset, startOffset + length, details));
}
void DocumentMarkerController::addMarkerToNode(Node* node, unsigned startOffset, unsigned length, DocumentMarker::MarkerType type)
{
    addMarker(node, DocumentMarker(type, startOffset, startOffset + length));
}