Show
Ignore:
Timestamp:
08/15/08 13:25:16 (5 months ago)
Author:
mbensi
Message:

merge with webkit revision 35774

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/WebCore/editing/Editor.cpp

    r434 r437  
    4343#include "FocusController.h" 
    4444#include "Frame.h" 
     45#include "FrameTree.h" 
    4546#include "FrameView.h" 
    4647#include "HTMLInputElement.h" 
     
    19331934#endif 
    19341935 
    1935 Editor::Visibility Editor::rangeVisibility(Range* range) const 
    1936 
     1936bool Editor::insideVisibleArea(Range* range) const 
     1937
     1938    if (!range) 
     1939        return true; 
     1940     
    19371941    // Right now, we only check the visibility of a range for disconnected frames. For all other 
    19381942    // frames, we assume visibility. 
    1939     if (!m_frame->isDisconnected() || !range) 
    1940         return InsideVisibleArea; 
    1941      
    1942     RenderPart* renderer = m_frame->ownerRenderer(); 
     1943    Frame* frame = m_frame->isDisconnected() ? m_frame : m_frame->tree()->top(true); 
     1944    if (!frame->isDisconnected()) 
     1945        return true; 
     1946     
     1947    RenderPart* renderer = frame->ownerRenderer(); 
    19431948    RenderBlock* container = renderer->containingBlock(); 
    19441949    if (!(container->style()->overflowX() == OHIDDEN || container->style()->overflowY() == OHIDDEN)) 
    1945         return InsideVisibleArea
     1950        return true
    19461951 
    19471952    IntRect rectInPageCoords = container->getOverflowClipRect(0, 0); 
     
    19511956     
    19521957    if (rectInFrameCoords.contains(resultRect)) 
    1953         return InsideVisibleArea; 
    1954     if (resultRect.y() < rectInFrameCoords.y()) 
    1955         return BeforeVisibleArea; 
    1956     if (resultRect.y() > rectInFrameCoords.y()) 
    1957         return AfterVisibleArea; 
    1958  
    1959     ASSERT(resultRect.y() == rectInFrameCoords.y()); 
    1960     if (resultRect.x() < rectInFrameCoords.x()) 
    1961         return BeforeVisibleArea; 
    1962     return AfterVisibleArea; 
    1963 
    1964  
    1965 PassRefPtr<Range> Editor::firstVisibleRange(Range* startRange, const String& target, bool forward, bool caseFlag) 
    1966 
    1967     if (!forward) 
    1968         return startRange; 
    1969  
    1970     RefPtr<Range> resultRange = startRange; 
     1958        return true; 
     1959    return false; 
     1960
     1961 
     1962PassRefPtr<Range> Editor::firstVisibleRange(const String& target, bool caseFlag) 
     1963
     1964    RefPtr<Range> searchRange(rangeOfContents(m_frame->document())); 
     1965    RefPtr<Range> resultRange = findPlainText(searchRange.get(), target, true, caseFlag); 
     1966    ExceptionCode ec = 0; 
     1967 
     1968    while (!insideVisibleArea(resultRange.get())) { 
     1969        searchRange->setStartAfter(resultRange->endContainer(), ec); 
     1970        if (searchRange->startContainer() == searchRange->endContainer()) 
     1971            return 0; 
     1972        resultRange = findPlainText(searchRange.get(), target, true, caseFlag); 
     1973    } 
     1974     
     1975    return resultRange; 
     1976
     1977 
     1978PassRefPtr<Range> Editor::lastVisibleRange(const String& target, bool caseFlag) 
     1979
     1980    RefPtr<Range> searchRange(rangeOfContents(m_frame->document())); 
     1981    RefPtr<Range> resultRange = findPlainText(searchRange.get(), target, false, caseFlag); 
     1982    ExceptionCode ec = 0; 
     1983 
     1984    while (!insideVisibleArea(resultRange.get())) { 
     1985        searchRange->setEndBefore(resultRange->startContainer(), ec); 
     1986        if (searchRange->startContainer() == searchRange->endContainer()) 
     1987            return 0; 
     1988        resultRange = findPlainText(searchRange.get(), target, false, caseFlag); 
     1989    } 
     1990     
     1991    return resultRange; 
     1992
     1993 
     1994PassRefPtr<Range> Editor::nextVisibleRange(Range* currentRange, const String& target, bool forward, bool caseFlag) 
     1995
     1996    RefPtr<Range> resultRange = currentRange; 
    19711997    RefPtr<Range> searchRange(rangeOfContents(m_frame->document())); 
    19721998    ExceptionCode ec = 0; 
    1973  
    1974     while (rangeVisibility(resultRange.get()) == BeforeVisibleArea) { 
    1975         searchRange->setStartAfter(resultRange->endContainer(), ec); 
    1976         if (searchRange->startContainer() == searchRange->endContainer()) 
    1977             return startRange; 
     1999     
     2000    while (!insideVisibleArea(resultRange.get())) { 
     2001        if (forward) 
     2002            searchRange->setStartAfter(resultRange->endContainer(), ec); 
     2003        else 
     2004            searchRange->setEndBefore(resultRange->startContainer(), ec); 
     2005 
     2006        // If we have made it to the beginning or the end of the document, then either there is no search result 
     2007        // or we have to wrap around to find it. 
     2008        if (resultRange->startContainer()->isDocumentNode()) { 
     2009            if (forward) 
     2010                return firstVisibleRange(target, caseFlag); 
     2011            else 
     2012                return lastVisibleRange(target, caseFlag); 
     2013        } 
     2014         
    19782015        resultRange = findPlainText(searchRange.get(), target, forward, caseFlag); 
    19792016    } 
     
    19822019} 
    19832020 
    1984 PassRefPtr<Range> Editor::lastVisibleRange(Range* startRange, const String& target, bool forward, bool caseFlag) 
    1985 { 
    1986     if (forward) 
    1987         return startRange; 
    1988  
    1989     RefPtr<Range> resultRange = startRange; 
    1990     RefPtr<Range> searchRange(rangeOfContents(m_frame->document())); 
    1991     ExceptionCode ec = 0; 
    1992  
    1993     while (rangeVisibility(resultRange.get()) == AfterVisibleArea) { 
    1994         searchRange->setEndBefore(resultRange->startContainer(), ec); 
    1995         if (searchRange->startContainer() == searchRange->endContainer()) 
    1996             return startRange; 
    1997         resultRange = findPlainText(searchRange.get(), target, forward, caseFlag); 
    1998     } 
    1999      
    2000     return resultRange; 
    2001 } 
    2002  
    20032021} // namespace WebCore