Reviewed by me (written by Patti Yeh).
[WebKit-https.git] / WebKit / WebView.subproj / WebHTMLView.m
index d18f0a9f1373c33ebf2481b205778023fc8b5b4c..7c9d2cf6a39842953e680a0187fc722d6976ae23 100644 (file)
@@ -4899,20 +4899,27 @@ static NSArray *validAttributes = nil;
 
 - (NSRect)firstRectForCharacterRange:(NSRange)theRange
 {
-    if (![self hasMarkedText]) {
-        return NSMakeRect(0,0,0,0);
-    }
-
+    NSRect resultRect = NSMakeRect(0,0,0,0);
     WebBridge *bridge = [self _bridge];
+    DOMRange *rectRange = nil;
+    
+    if ([self hasMarkedText]) {
+        rectRange = [[bridge DOMDocument] createRange];
+        DOMRange *markedRange = [bridge markedTextDOMRange];
+        [rectRange setStart:[markedRange startContainer] :theRange.location];
+        [rectRange setEnd:[markedRange startContainer] :(theRange.location + theRange.length)];
+    } else {
+        // no marked text, so use current selection instead
+        // this helps for text input methods that unmark and delete the typed characters,
+        // then put up a word selector at the current insertion point
+        rectRange = [self _selectedRange];
+    }
 
-    DOMRange *rectRange = [[bridge DOMDocument] createRange];
-    DOMRange *markedRange = [bridge markedTextDOMRange];
-    [rectRange setStart:[markedRange startContainer] :theRange.location];
-    [rectRange setEnd:[markedRange startContainer] :(theRange.location + theRange.length)];
-
-    NSRect resultRect = [self convertRect:[bridge firstRectForDOMRange:rectRange] toView:nil];
-    resultRect.origin = [[self window] convertBaseToScreen:resultRect.origin];
-
+    if ([rectRange startContainer]) {
+        resultRect = [self convertRect:[bridge firstRectForDOMRange:rectRange] toView:nil];
+        resultRect.origin = [[self window] convertBaseToScreen:resultRect.origin];
+    }
+    
     return resultRect;
 }