int TextFinder::selectFindMatch(unsigned index, WebRect* selectionRect) { ASSERT_WITH_SECURITY_IMPLICATION(index < m_findMatchesCache.size()); RefPtrWillBeRawPtr<Range> range = m_findMatchesCache[index].m_range; if (!range->boundaryPointsValid() || !range->startContainer()->inDocument()) return -1; // Check if the match is already selected. TextFinder& mainFrameTextFinder = m_ownerFrame.viewImpl()->mainFrameImpl()->ensureTextFinder(); WebLocalFrameImpl* activeMatchFrame = mainFrameTextFinder.m_currentActiveMatchFrame; if (&m_ownerFrame != activeMatchFrame || !m_activeMatch || !areRangesEqual(m_activeMatch.get(), range.get())) { if (isActiveMatchFrameValid()) activeMatchFrame->ensureTextFinder().setMatchMarkerActive(false); m_activeMatchIndexInCurrentFrame = m_findMatchesCache[index].m_ordinal - 1; // Set this frame as the active frame (the one with the active highlight). mainFrameTextFinder.m_currentActiveMatchFrame = &m_ownerFrame; m_ownerFrame.viewImpl()->setFocusedFrame(&m_ownerFrame); m_activeMatch = range.release(); setMarkerActive(m_activeMatch.get(), true); // Clear any user selection, to make sure Find Next continues on from the match we just activated. m_ownerFrame.frame()->selection().clear(); // Make sure no node is focused. See http://crbug.com/38700. m_ownerFrame.frame()->document()->setFocusedElement(nullptr); } IntRect activeMatchRect; IntRect activeMatchBoundingBox = enclosingIntRect(RenderObject::absoluteBoundingBoxRectForRange(m_activeMatch.get())); if (!activeMatchBoundingBox.isEmpty()) { if (m_activeMatch->firstNode() && m_activeMatch->firstNode()->renderer()) { m_activeMatch->firstNode()->renderer()->scrollRectToVisible( activeMatchBoundingBox, ScrollAlignment::alignCenterIfNeeded, ScrollAlignment::alignCenterIfNeeded); } // Zoom to the active match. activeMatchRect = m_ownerFrame.frameView()->contentsToWindow(activeMatchBoundingBox); m_ownerFrame.viewImpl()->zoomToFindInPageRect(activeMatchRect); } if (selectionRect) *selectionRect = activeMatchRect; return ordinalOfFirstMatch() + m_activeMatchIndexInCurrentFrame + 1; }
TEST_F(RangeTest, SplitTextNodeRangeOutsideText) { document().body()->setInnerHTML("<span id=\"outer\">0<span id=\"inner-left\">1</span>SPLITME<span id=\"inner-right\">2</span>3</span>", ASSERT_NO_EXCEPTION); Element* outer = document().getElementById(AtomicString::fromUTF8("outer")); Element* innerLeft = document().getElementById(AtomicString::fromUTF8("inner-left")); Element* innerRight = document().getElementById(AtomicString::fromUTF8("inner-right")); Text* oldText = toText(outer->childNodes()->item(2)); RefPtrWillBeRawPtr<Range> rangeOuterOutside = Range::create(document(), outer, 0, outer, 5); RefPtrWillBeRawPtr<Range> rangeOuterInside = Range::create(document(), outer, 1, outer, 4); RefPtrWillBeRawPtr<Range> rangeOuterSurroundingText = Range::create(document(), outer, 2, outer, 3); RefPtrWillBeRawPtr<Range> rangeInnerLeft = Range::create(document(), innerLeft, 0, innerLeft, 1); RefPtrWillBeRawPtr<Range> rangeInnerRight = Range::create(document(), innerRight, 0, innerRight, 1); RefPtrWillBeRawPtr<Range> rangeFromTextToMiddleOfElement = Range::create(document(), oldText, 6, outer, 3); oldText->splitText(3, ASSERT_NO_EXCEPTION); Text* newText = toText(oldText->nextSibling()); EXPECT_TRUE(rangeOuterOutside->boundaryPointsValid()); EXPECT_EQ(outer, rangeOuterOutside->startContainer()); EXPECT_EQ(0, rangeOuterOutside->startOffset()); EXPECT_EQ(outer, rangeOuterOutside->endContainer()); EXPECT_EQ(6, rangeOuterOutside->endOffset()); // Increased by 1 since a new node is inserted. EXPECT_TRUE(rangeOuterInside->boundaryPointsValid()); EXPECT_EQ(outer, rangeOuterInside->startContainer()); EXPECT_EQ(1, rangeOuterInside->startOffset()); EXPECT_EQ(outer, rangeOuterInside->endContainer()); EXPECT_EQ(5, rangeOuterInside->endOffset()); EXPECT_TRUE(rangeOuterSurroundingText->boundaryPointsValid()); EXPECT_EQ(outer, rangeOuterSurroundingText->startContainer()); EXPECT_EQ(2, rangeOuterSurroundingText->startOffset()); EXPECT_EQ(outer, rangeOuterSurroundingText->endContainer()); EXPECT_EQ(4, rangeOuterSurroundingText->endOffset()); EXPECT_TRUE(rangeInnerLeft->boundaryPointsValid()); EXPECT_EQ(innerLeft, rangeInnerLeft->startContainer()); EXPECT_EQ(0, rangeInnerLeft->startOffset()); EXPECT_EQ(innerLeft, rangeInnerLeft->endContainer()); EXPECT_EQ(1, rangeInnerLeft->endOffset()); EXPECT_TRUE(rangeInnerRight->boundaryPointsValid()); EXPECT_EQ(innerRight, rangeInnerRight->startContainer()); EXPECT_EQ(0, rangeInnerRight->startOffset()); EXPECT_EQ(innerRight, rangeInnerRight->endContainer()); EXPECT_EQ(1, rangeInnerRight->endOffset()); EXPECT_TRUE(rangeFromTextToMiddleOfElement->boundaryPointsValid()); EXPECT_EQ(newText, rangeFromTextToMiddleOfElement->startContainer()); EXPECT_EQ(3, rangeFromTextToMiddleOfElement->startOffset()); EXPECT_EQ(outer, rangeFromTextToMiddleOfElement->endContainer()); EXPECT_EQ(4, rangeFromTextToMiddleOfElement->endOffset()); }