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()); } } }
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)); }