| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 #include "public/web/WebFindOptions.h" | 51 #include "public/web/WebFindOptions.h" |
| 52 #include "public/web/WebFrameClient.h" | 52 #include "public/web/WebFrameClient.h" |
| 53 #include "public/web/WebViewClient.h" | 53 #include "public/web/WebViewClient.h" |
| 54 #include "web/FindInPageCoordinates.h" | 54 #include "web/FindInPageCoordinates.h" |
| 55 #include "web/WebLocalFrameImpl.h" | 55 #include "web/WebLocalFrameImpl.h" |
| 56 #include "web/WebViewImpl.h" | 56 #include "web/WebViewImpl.h" |
| 57 #include "wtf/CurrentTime.h" | 57 #include "wtf/CurrentTime.h" |
| 58 | 58 |
| 59 namespace blink { | 59 namespace blink { |
| 60 | 60 |
| 61 TextFinder::FindMatch::FindMatch(RawPtr<Range> range, int ordinal) | 61 TextFinder::FindMatch::FindMatch(Range* range, int ordinal) |
| 62 : m_range(range) | 62 : m_range(range) |
| 63 , m_ordinal(ordinal) | 63 , m_ordinal(ordinal) |
| 64 { | 64 { |
| 65 } | 65 } |
| 66 | 66 |
| 67 DEFINE_TRACE(TextFinder::FindMatch) | 67 DEFINE_TRACE(TextFinder::FindMatch) |
| 68 { | 68 { |
| 69 visitor->trace(m_range); | 69 visitor->trace(m_range); |
| 70 } | 70 } |
| 71 | 71 |
| 72 class TextFinder::DeferredScopeStringMatches : public GarbageCollectedFinalized<
TextFinder::DeferredScopeStringMatches> { | 72 class TextFinder::DeferredScopeStringMatches : public GarbageCollectedFinalized<
TextFinder::DeferredScopeStringMatches> { |
| 73 public: | 73 public: |
| 74 static RawPtr<DeferredScopeStringMatches> create(TextFinder* textFinder, int
identifier, const WebString& searchText, const WebFindOptions& options, bool re
set) | 74 static DeferredScopeStringMatches* create(TextFinder* textFinder, int identi
fier, const WebString& searchText, const WebFindOptions& options, bool reset) |
| 75 { | 75 { |
| 76 return new DeferredScopeStringMatches(textFinder, identifier, searchText
, options, reset); | 76 return new DeferredScopeStringMatches(textFinder, identifier, searchText
, options, reset); |
| 77 } | 77 } |
| 78 | 78 |
| 79 DEFINE_INLINE_TRACE() | 79 DEFINE_INLINE_TRACE() |
| 80 { | 80 { |
| 81 visitor->trace(m_textFinder); | 81 visitor->trace(m_textFinder); |
| 82 } | 82 } |
| 83 | 83 |
| 84 void dispose() | 84 void dispose() |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 // Find next occurrence of the search string. | 307 // Find next occurrence of the search string. |
| 308 // FIXME: (http://crbug.com/6818) This WebKit operation may run for long
er | 308 // FIXME: (http://crbug.com/6818) This WebKit operation may run for long
er |
| 309 // than the timeout value, and is not interruptible as it is currently | 309 // than the timeout value, and is not interruptible as it is currently |
| 310 // written. We may need to rewrite it with interruptibility in mind, or | 310 // written. We may need to rewrite it with interruptibility in mind, or |
| 311 // find an alternative. | 311 // find an alternative. |
| 312 const EphemeralRangeInFlatTree result = findPlainText(EphemeralRangeInFl
atTree(searchStart, searchEnd), searchText, options.matchCase ? 0 : CaseInsensit
ive); | 312 const EphemeralRangeInFlatTree result = findPlainText(EphemeralRangeInFl
atTree(searchStart, searchEnd), searchText, options.matchCase ? 0 : CaseInsensit
ive); |
| 313 if (result.isCollapsed()) { | 313 if (result.isCollapsed()) { |
| 314 // Not found. | 314 // Not found. |
| 315 break; | 315 break; |
| 316 } | 316 } |
| 317 RawPtr<Range> resultRange = Range::create(result.document(), toPositionI
nDOMTree(result.startPosition()), toPositionInDOMTree(result.endPosition())); | 317 Range* resultRange = Range::create(result.document(), toPositionInDOMTre
e(result.startPosition()), toPositionInDOMTree(result.endPosition())); |
| 318 if (resultRange->collapsed()) { | 318 if (resultRange->collapsed()) { |
| 319 // resultRange will be collapsed if the matched text spans over mult
iple TreeScopes. | 319 // resultRange will be collapsed if the matched text spans over mult
iple TreeScopes. |
| 320 // FIXME: Show such matches to users. | 320 // FIXME: Show such matches to users. |
| 321 searchStart = result.endPosition(); | 321 searchStart = result.endPosition(); |
| 322 continue; | 322 continue; |
| 323 } | 323 } |
| 324 | 324 |
| 325 ++matchCount; | 325 ++matchCount; |
| 326 | 326 |
| 327 // Catch a special case where Find found something but doesn't know what | 327 // Catch a special case where Find found something but doesn't know what |
| (...skipping 20 matching lines...) Expand all Loading... |
| 348 // To stop looking for the active tickmark, we set this flag. | 348 // To stop looking for the active tickmark, we set this flag. |
| 349 m_locatingActiveRect = false; | 349 m_locatingActiveRect = false; |
| 350 | 350 |
| 351 // Notify browser of new location for the selected rectangle. | 351 // Notify browser of new location for the selected rectangle. |
| 352 reportFindInPageSelection( | 352 reportFindInPageSelection( |
| 353 ownerFrame().frameView()->contentsToRootFrame(resultBounds), | 353 ownerFrame().frameView()->contentsToRootFrame(resultBounds), |
| 354 m_activeMatchIndexInCurrentFrame + 1, | 354 m_activeMatchIndexInCurrentFrame + 1, |
| 355 identifier); | 355 identifier); |
| 356 } | 356 } |
| 357 | 357 |
| 358 addMarker(resultRange.get(), foundActiveMatch); | 358 addMarker(resultRange, foundActiveMatch); |
| 359 | 359 |
| 360 m_findMatchesCache.append(FindMatch(resultRange.get(), m_lastMatchCount
+ matchCount)); | 360 m_findMatchesCache.append(FindMatch(resultRange, m_lastMatchCount + matc
hCount)); |
| 361 | 361 |
| 362 // Set the new start for the search range to be the end of the previous | 362 // Set the new start for the search range to be the end of the previous |
| 363 // result range. There is no need to use a VisiblePosition here, | 363 // result range. There is no need to use a VisiblePosition here, |
| 364 // since findPlainText will use a TextIterator to go over the visible | 364 // since findPlainText will use a TextIterator to go over the visible |
| 365 // text nodes. | 365 // text nodes. |
| 366 searchStart = result.endPosition(); | 366 searchStart = result.endPosition(); |
| 367 | 367 |
| 368 m_resumeScopingFromRange = Range::create(result.document(), toPositionIn
DOMTree(result.endPosition()), toPositionInDOMTree(result.endPosition())); | 368 m_resumeScopingFromRange = Range::create(result.document(), toPositionIn
DOMTree(result.endPosition()), toPositionInDOMTree(result.endPosition())); |
| 369 timedOut = (currentTime() - startTime) >= maxScopingDuration; | 369 timedOut = (currentTime() - startTime) >= maxScopingDuration; |
| 370 } while (!timedOut); | 370 } while (!timedOut); |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 distanceSquared = currentDistanceSquared; | 597 distanceSquared = currentDistanceSquared; |
| 598 } | 598 } |
| 599 } | 599 } |
| 600 return nearest; | 600 return nearest; |
| 601 } | 601 } |
| 602 | 602 |
| 603 int TextFinder::selectFindMatch(unsigned index, WebRect* selectionRect) | 603 int TextFinder::selectFindMatch(unsigned index, WebRect* selectionRect) |
| 604 { | 604 { |
| 605 ASSERT_WITH_SECURITY_IMPLICATION(index < m_findMatchesCache.size()); | 605 ASSERT_WITH_SECURITY_IMPLICATION(index < m_findMatchesCache.size()); |
| 606 | 606 |
| 607 RawPtr<Range> range = m_findMatchesCache[index].m_range; | 607 Range* range = m_findMatchesCache[index].m_range; |
| 608 if (!range->boundaryPointsValid() || !range->startContainer()->inShadowInclu
dingDocument()) | 608 if (!range->boundaryPointsValid() || !range->startContainer()->inShadowInclu
dingDocument()) |
| 609 return -1; | 609 return -1; |
| 610 | 610 |
| 611 // Check if the match is already selected. | 611 // Check if the match is already selected. |
| 612 TextFinder& mainFrameTextFinder = ownerFrame().viewImpl()->mainFrameImpl()->
ensureTextFinder(); | 612 TextFinder& mainFrameTextFinder = ownerFrame().viewImpl()->mainFrameImpl()->
ensureTextFinder(); |
| 613 WebLocalFrameImpl* activeMatchFrame = mainFrameTextFinder.m_currentActiveMat
chFrame; | 613 WebLocalFrameImpl* activeMatchFrame = mainFrameTextFinder.m_currentActiveMat
chFrame; |
| 614 if (&ownerFrame() != activeMatchFrame || !m_activeMatch || !areRangesEqual(m
_activeMatch.get(), range.get())) { | 614 if (&ownerFrame() != activeMatchFrame || !m_activeMatch || !areRangesEqual(m
_activeMatch.get(), range)) { |
| 615 if (isActiveMatchFrameValid()) | 615 if (isActiveMatchFrameValid()) |
| 616 activeMatchFrame->ensureTextFinder().setMatchMarkerActive(false); | 616 activeMatchFrame->ensureTextFinder().setMatchMarkerActive(false); |
| 617 | 617 |
| 618 m_activeMatchIndexInCurrentFrame = m_findMatchesCache[index].m_ordinal -
1; | 618 m_activeMatchIndexInCurrentFrame = m_findMatchesCache[index].m_ordinal -
1; |
| 619 | 619 |
| 620 // Set this frame as the active frame (the one with the active highlight
). | 620 // Set this frame as the active frame (the one with the active highlight
). |
| 621 mainFrameTextFinder.m_currentActiveMatchFrame = &ownerFrame(); | 621 mainFrameTextFinder.m_currentActiveMatchFrame = &ownerFrame(); |
| 622 ownerFrame().viewImpl()->setFocusedFrame(&ownerFrame()); | 622 ownerFrame().viewImpl()->setFocusedFrame(&ownerFrame()); |
| 623 | 623 |
| 624 m_activeMatch = range.release(); | 624 m_activeMatch = range; |
| 625 setMarkerActive(m_activeMatch.get(), true); | 625 setMarkerActive(m_activeMatch.get(), true); |
| 626 | 626 |
| 627 // Clear any user selection, to make sure Find Next continues on from th
e match we just activated. | 627 // Clear any user selection, to make sure Find Next continues on from th
e match we just activated. |
| 628 ownerFrame().frame()->selection().clear(); | 628 ownerFrame().frame()->selection().clear(); |
| 629 | 629 |
| 630 // Make sure no node is focused. See http://crbug.com/38700. | 630 // Make sure no node is focused. See http://crbug.com/38700. |
| 631 ownerFrame().frame()->document()->clearFocusedElement(); | 631 ownerFrame().frame()->document()->clearFocusedElement(); |
| 632 } | 632 } |
| 633 | 633 |
| 634 IntRect activeMatchRect; | 634 IntRect activeMatchRect; |
| 635 IntRect activeMatchBoundingBox = enclosingIntRect(LayoutObject::absoluteBoun
dingBoxRectForRange(m_activeMatch.get())); | 635 IntRect activeMatchBoundingBox = enclosingIntRect(LayoutObject::absoluteBoun
dingBoxRectForRange(m_activeMatch.get())); |
| 636 | 636 |
| 637 if (!activeMatchBoundingBox.isEmpty()) { | 637 if (!activeMatchBoundingBox.isEmpty()) { |
| 638 if (m_activeMatch->firstNode() && m_activeMatch->firstNode()->layoutObje
ct()) { | 638 if (m_activeMatch->firstNode() && m_activeMatch->firstNode()->layoutObje
ct()) { |
| 639 m_activeMatch->firstNode()->layoutObject()->scrollRectToVisible( | 639 m_activeMatch->firstNode()->layoutObject()->scrollRectToVisible( |
| 640 LayoutRect(activeMatchBoundingBox), ScrollAlignment::alignCenter
IfNeeded, ScrollAlignment::alignCenterIfNeeded, UserScroll); | 640 LayoutRect(activeMatchBoundingBox), ScrollAlignment::alignCenter
IfNeeded, ScrollAlignment::alignCenterIfNeeded, UserScroll); |
| 641 } | 641 } |
| 642 | 642 |
| 643 // Zoom to the active match. | 643 // Zoom to the active match. |
| 644 activeMatchRect = ownerFrame().frameView()->contentsToRootFrame(activeMa
tchBoundingBox); | 644 activeMatchRect = ownerFrame().frameView()->contentsToRootFrame(activeMa
tchBoundingBox); |
| 645 ownerFrame().viewImpl()->zoomToFindInPageRect(activeMatchRect); | 645 ownerFrame().viewImpl()->zoomToFindInPageRect(activeMatchRect); |
| 646 } | 646 } |
| 647 | 647 |
| 648 if (selectionRect) | 648 if (selectionRect) |
| 649 *selectionRect = activeMatchRect; | 649 *selectionRect = activeMatchRect; |
| 650 | 650 |
| 651 return ordinalOfFirstMatch() + m_activeMatchIndexInCurrentFrame + 1; | 651 return ordinalOfFirstMatch() + m_activeMatchIndexInCurrentFrame + 1; |
| 652 } | 652 } |
| 653 | 653 |
| 654 RawPtr<TextFinder> TextFinder::create(WebLocalFrameImpl& ownerFrame) | 654 TextFinder* TextFinder::create(WebLocalFrameImpl& ownerFrame) |
| 655 { | 655 { |
| 656 return new TextFinder(ownerFrame); | 656 return new TextFinder(ownerFrame); |
| 657 } | 657 } |
| 658 | 658 |
| 659 TextFinder::TextFinder(WebLocalFrameImpl& ownerFrame) | 659 TextFinder::TextFinder(WebLocalFrameImpl& ownerFrame) |
| 660 : m_ownerFrame(&ownerFrame) | 660 : m_ownerFrame(&ownerFrame) |
| 661 , m_currentActiveMatchFrame(nullptr) | 661 , m_currentActiveMatchFrame(nullptr) |
| 662 , m_activeMatchIndexInCurrentFrame(-1) | 662 , m_activeMatchIndexInCurrentFrame(-1) |
| 663 , m_resumeScopingFromRange(nullptr) | 663 , m_resumeScopingFromRange(nullptr) |
| 664 , m_lastMatchCount(-1) | 664 , m_lastMatchCount(-1) |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 813 { | 813 { |
| 814 visitor->trace(m_ownerFrame); | 814 visitor->trace(m_ownerFrame); |
| 815 visitor->trace(m_currentActiveMatchFrame); | 815 visitor->trace(m_currentActiveMatchFrame); |
| 816 visitor->trace(m_activeMatch); | 816 visitor->trace(m_activeMatch); |
| 817 visitor->trace(m_resumeScopingFromRange); | 817 visitor->trace(m_resumeScopingFromRange); |
| 818 visitor->trace(m_deferredScopingWork); | 818 visitor->trace(m_deferredScopingWork); |
| 819 visitor->trace(m_findMatchesCache); | 819 visitor->trace(m_findMatchesCache); |
| 820 } | 820 } |
| 821 | 821 |
| 822 } // namespace blink | 822 } // namespace blink |
| OLD | NEW |