WebCore:
[WebKit-https.git] / WebCore / page / Frame.cpp
index 1312f0b0460aa90bfa4d843d9e668e43781da6ec..1428e990a673f2c4dbe44a2c7793fe3ce79da362 100644 (file)
@@ -1103,6 +1103,16 @@ void Frame::setIsDisconnected(bool isDisconnected)
     d->m_isDisconnected = isDisconnected;
 }
 
+bool Frame::excludeFromTextSearch() const
+{
+    return d->m_excludeFromTextSearch;
+}
+
+void Frame::setExcludeFromTextSearch(bool exclude)
+{
+    d->m_excludeFromTextSearch = exclude;
+}
+
 // returns FloatRect because going through IntRect would truncate any floats
 FloatRect Frame::selectionRect(bool clipToVisibleContent) const
 {
@@ -1473,20 +1483,15 @@ UChar Frame::backslashAsCurrencySymbol() const
     return decoder->encoding().backslashAsCurrencySymbol();
 }
 
-static bool isInShadowTree(Node* node)
-{
-    for (Node* n = node; n; n = n->parentNode())
-        if (n->isShadowNode())
-            return true;
-    return false;
-}
-
 // Searches from the beginning of the document if nothing is selected.
 bool Frame::findString(const String& target, bool forward, bool caseFlag, bool wrapFlag, bool startInSelection)
 {
     if (target.isEmpty() || !document())
         return false;
     
+    if (excludeFromTextSearch())
+        return false;
+    
     // Start from an edge of the selection, if there's a selection that's not in shadow content. Which edge
     // is used depends on whether we're searching forward or backward, and whether startInSelection is set.
     RefPtr<Range> searchRange(rangeOfContents(document()));
@@ -1542,7 +1547,7 @@ bool Frame::findString(const String& target, bool forward, bool caseFlag, bool w
     }
     
     if (!editor()->insideVisibleArea(resultRange.get())) {
-        resultRange = editor()->nextVisibleRange(resultRange.get(), target, forward, caseFlag);
+        resultRange = editor()->nextVisibleRange(resultRange.get(), target, forward, caseFlag, wrapFlag);
         if (!resultRange)
             return false;
     }
@@ -1577,7 +1582,7 @@ unsigned Frame::markAllMatchesForText(const String& target, bool caseFlag, unsig
     do {
         RefPtr<Range> resultRange(findPlainText(searchRange.get(), target, true, caseFlag));
         if (resultRange->collapsed(exception)) {
-            if (!isInShadowTree(resultRange->startContainer()))
+            if (!resultRange->startContainer()->isInShadowTree())
                 break;
 
             searchRange = rangeOfContents(document());
@@ -1613,9 +1618,11 @@ unsigned Frame::markAllMatchesForText(const String& target, bool caseFlag, unsig
     if (doc && d->m_view && contentRenderer()) {
         doc->updateLayout(); // Ensure layout is up to date.
         IntRect visibleRect(enclosingIntRect(d->m_view->visibleContentRect()));
-        GraphicsContext context((PlatformGraphicsContext*)0);
-        context.setPaintingDisabled(true);
-        paint(&context, visibleRect);
+        if (!visibleRect.isEmpty()) {
+            GraphicsContext context((PlatformGraphicsContext*)0);
+            context.setPaintingDisabled(true);
+            paint(&context, visibleRect);
+        }
     }
     
     return matchCount;
@@ -1875,6 +1882,7 @@ FramePrivate::FramePrivate(Page* page, Frame* parent, Frame* thisFrame, HTMLFram
     , m_prohibitsScrolling(false)
     , m_needsReapplyStyles(false)
     , m_isDisconnected(false)
+    , m_excludeFromTextSearch(false)
 #if FRAME_LOADS_USER_STYLESHEET
     , m_userStyleSheetLoader(0)
 #endif