WebCore:
authorsullivan <sullivan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 30 Jun 2007 16:29:54 +0000 (16:29 +0000)
committersullivan <sullivan@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 30 Jun 2007 16:29:54 +0000 (16:29 +0000)
        Reviewed by Oliver Hunt.

        - WebCore support for accessing the set of rectangles that encompass the selected text

        * page/Frame.h:
        * page/Frame.cpp:
        (WebCore::Frame::selectionTextRects):
        new function, fills in a passed Vector with the line box rects that represent the selected range

        * rendering/RenderText.cpp:
        (WebCore::RenderText::addLineBoxRects):
        fixed off-by-one bug involving use of the confusing function InlineTextBox::end()

        * WebCore.exp:
        exported symbol for this new function

WebKit:

        Reviewed by Oliver Hunt.

        - WebKit support for accessing the set of rectangles that encompass the selected text

        * WebView/WebDocumentPrivate.h:
        added -selectionTextRects to WebDocumentSelection protocol; tweaked comments

        * WebView/WebHTMLView.mm:
        (-[WebHTMLView _selectionDraggingRect]):
        use selectionRect instead of selectionImageRect since they're the same and maybe we can get
        rid of selectionImageRect someday
        (-[WebHTMLView selectionTextRects]):
        added implementation of new protocol method, which calls through to WebCore

        * WebView/WebPDFView.mm:
        (-[WebPDFView selectionTextRects]):
        added simple implementation of new protocol method, which just returns the single selection rect.
        PDFKit doesn't support obtaining multiple rects to describe a multi-line selection.
        (-[WebPDFView selectionImageForcingWhiteText:]):
        use selectionRect instead of selectionImageRect since they're the same and maybe we can get
        rid of selectionImageRect someday

        * Misc/WebSearchableTextView.m:
        (-[WebSearchableTextView selectionTextRects]):
        added no-op implementation of new protocol method to this obsolete class

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@23897 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/WebCore.exp
WebCore/page/Frame.cpp
WebCore/page/Frame.h
WebCore/rendering/RenderText.cpp
WebKit/ChangeLog
WebKit/Misc/WebSearchableTextView.m
WebKit/WebView/WebDocumentPrivate.h
WebKit/WebView/WebHTMLView.mm
WebKit/WebView/WebPDFView.mm

index a67e760..2914e68 100644 (file)
@@ -1,3 +1,21 @@
+2007-06-29  John Sullivan  <sullivan@apple.com>
+
+        Reviewed by Oliver Hunt.
+        
+        - WebCore support for accessing the set of rectangles that encompass the selected text
+        
+        * page/Frame.h:
+        * page/Frame.cpp:
+        (WebCore::Frame::selectionTextRects):
+        new function, fills in a passed Vector with the line box rects that represent the selected range
+
+        * rendering/RenderText.cpp:
+        (WebCore::RenderText::addLineBoxRects):
+        fixed off-by-one bug involving use of the confusing function InlineTextBox::end()
+
+        * WebCore.exp:
+        exported symbol for this new function
+
 2007-06-29  Justin Garcia  <justin.garcia@apple.com>
 
         Reviewed by Harrison.
index f42bb87..e3e9470 100644 (file)
@@ -597,6 +597,7 @@ __ZNK7WebCore5Frame10isFrameSetEv
 __ZNK7WebCore5Frame12eventHandlerEv
 __ZNK7WebCore5Frame12ownerElementEv
 __ZNK7WebCore5Frame13selectionRectEb
+__ZNK7WebCore5Frame18selectionTextRectsERN3WTF6VectorINS_9FloatRectELm0EEEb
 __ZNK7WebCore5Frame14selectionImageEb
 __ZNK7WebCore5Frame15revealSelectionERKNS_11RenderLayer15ScrollAlignmentE
 __ZNK7WebCore5Frame16inViewSourceModeEv
index a4608af..96f5d7f 100644 (file)
@@ -1158,6 +1158,27 @@ FloatRect Frame::selectionRect(bool clipToVisibleContent) const
     return clipToVisibleContent ? intersection(selectionRect, d->m_view->visibleContentRect()) : selectionRect;
 }
 
+void Frame::selectionTextRects(Vector<FloatRect>& rects, bool clipToVisibleContent) const
+{
+    RenderView *root = static_cast<RenderView*>(renderer());
+    if (!root)
+        return;
+
+    RefPtr<Range> selectedRange = selectionController()->toRange();
+
+    Vector<IntRect> intRects;
+    selectedRange->addLineBoxRects(intRects);
+
+    unsigned size = intRects.size();
+    FloatRect visibleContentRect = d->m_view->visibleContentRect();
+    for (unsigned i = 0; i < size; ++i)
+        if (clipToVisibleContent)
+            rects.append(intersection(intRects[i], visibleContentRect));
+        else
+            rects.append(intRects[i]);
+}
+
+
 bool Frame::isFrameSet() const
 {
     Document* document = d->m_doc.get();
index e6c5396..e2f49d4 100644 (file)
@@ -323,6 +323,7 @@ public:
     void clearTypingStyle();
 
     FloatRect selectionRect(bool clipToVisibleContent = true) const;
+    void selectionTextRects(Vector<FloatRect>&, bool clipToVisibleContent = true) const;
 
     HTMLFormElement* currentForm() const;
 
index 9e22adc..524c69c 100644 (file)
@@ -184,7 +184,7 @@ void RenderText::addLineBoxRects(Vector<IntRect>& rects, unsigned start, unsigne
         if (start <= box->start() && box->end() <= end)
             rects.append(IntRect(x + box->xPos(), y + box->yPos(), box->width(), box->height()));
         else {
-            unsigned realEnd = min(box->end(), end);
+            unsigned realEnd = min(box->end() + 1, end); // box->end() points at the last char, not after it
             IntRect r = box->selectionRect(x, y, start, realEnd);
             if (!r.isEmpty()) {
                 // change the height and y position because selectionRect uses selection-specific values
index d583ca2..9bee4c4 100644 (file)
@@ -1,3 +1,31 @@
+2007-06-29  John Sullivan  <sullivan@apple.com>
+
+        Reviewed by Oliver Hunt.
+
+        - WebKit support for accessing the set of rectangles that encompass the selected text
+
+        * WebView/WebDocumentPrivate.h:
+        added -selectionTextRects to WebDocumentSelection protocol; tweaked comments
+
+        * WebView/WebHTMLView.mm:
+        (-[WebHTMLView _selectionDraggingRect]):
+        use selectionRect instead of selectionImageRect since they're the same and maybe we can get
+        rid of selectionImageRect someday
+        (-[WebHTMLView selectionTextRects]):
+        added implementation of new protocol method, which calls through to WebCore
+        
+        * WebView/WebPDFView.mm:
+        (-[WebPDFView selectionTextRects]):
+        added simple implementation of new protocol method, which just returns the single selection rect.
+        PDFKit doesn't support obtaining multiple rects to describe a multi-line selection.
+        (-[WebPDFView selectionImageForcingWhiteText:]):
+        use selectionRect instead of selectionImageRect since they're the same and maybe we can get
+        rid of selectionImageRect someday
+        
+        * Misc/WebSearchableTextView.m:
+        (-[WebSearchableTextView selectionTextRects]):
+        added no-op implementation of new protocol method to this obsolete class
+
 2007-06-28  Timothy Hatcher  <timothy@apple.com>
 
         Reviewed by Darin.
index 1632cdd..cc9ed61 100644 (file)
     return NSZeroRect;
 }
 
+- (NSArray *)selectionTextRects
+{
+    // This is here to complete the <WebDocumentSelection> protocol, but it was introduced after this
+    // class was deprecated so there's no implementation.
+    return nil;
+}
+
 - (NSView *)selectionView
 {
     return self;
index 44e5986..a8619ee 100644 (file)
 - (NSArray *)pasteboardTypesForSelection;
 - (void)writeSelectionWithPasteboardTypes:(NSArray *)types toPasteboard:(NSPasteboard *)pasteboard;
 
-// Rect tightly enclosing the selection, in coordinates of selectionView. This includes portions of the
-// selection that are clipped out of view.
+// Array of rects that tightly enclose the selected text, in coordinates of selectinView.
+- (NSArray *)selectionTextRects;
+
+// Rect tightly enclosing the entire selected area, in coordinates of selectionView.
 - (NSRect)selectionRect;
 
 // NSImage of the portion of the selection that's in view. This does not draw backgrounds. 
 // The text is all white according to the parameter.
 - (NSImage *)selectionImageForcingWhiteText:(BOOL)forceWhiteText;
 
-// Rect tightly enclosing the selection, in coordinates of selectionView. This does not include portions of the
-// selection that are clipped out of view.
+// Rect tightly enclosing the entire selected area, in coordinates of selectionView.
+// NOTE: This method is equivalent to selectionRect and shouldn't be used; use selectionRect instead.
 - (NSRect)selectionImageRect;
 
 // View that draws the selection and can be made first responder. Often this is self but it could be
index 248b503..d40c832 100644 (file)
@@ -1486,7 +1486,7 @@ static NSURL* uniqueURLWithRelativePart(NSString *relativePart)
 - (NSRect)_selectionDraggingRect
 {
     // Mail currently calls this method. We can eliminate it when Mail no longer calls it.
-    return [self selectionImageRect];
+    return [self selectionRect];
 }
 
 - (DOMNode *)_insertOrderedList
@@ -5843,6 +5843,22 @@ BOOL isTextInput(Frame *coreFrame)
     return NSZeroRect;
 }
 
+- (NSArray *)selectionTextRects
+{
+    if (![self _hasSelection])
+        return nil;
+    
+    Vector<FloatRect> list;
+    core([self _frame])->selectionTextRects(list);
+
+    unsigned size = list.size();
+    NSMutableArray *result = [[[NSMutableArray alloc] initWithCapacity:size] autorelease];
+    for (unsigned i = 0; i < size; ++i)
+        [result addObject:[NSValue valueWithRect:list[i]]];
+    
+    return result;
+}
+
 - (NSView *)selectionView
 {
     return self;
index 411655c..0beb6e2 100644 (file)
@@ -829,6 +829,12 @@ static BOOL _PDFSelectionsAreEqual(PDFSelection *selectionA, PDFSelection *selec
     return result;
 }
 
+- (NSArray *)selectionTextRects
+{
+    // FIXME: We'd need new PDFKit API/SPI to get multiple text rects for selections that intersect more than one line
+    return [NSArray arrayWithObject:[NSValue valueWithRect:[self selectionRect]]];
+}
+
 - (NSView *)selectionView
 {
     return [PDFSubview documentView];
@@ -851,7 +857,7 @@ static BOOL _PDFSelectionsAreEqual(PDFSelection *selectionA, PDFSelection *selec
         [attributedString addAttribute:NSForegroundColorAttributeName value:[NSColor colorWithDeviceWhite:1.0f alpha:1.0f] range:wholeStringRange];
     [attributedString endEditing];
     
-    NSImage* selectionImage = [[[NSImage alloc] initWithSize:[self selectionImageRect].size] autorelease];
+    NSImage* selectionImage = [[[NSImage alloc] initWithSize:[self selectionRect].size] autorelease];
     
     [selectionImage lockFocus];
     [attributedString drawAtPoint:NSZeroPoint];