[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677

darin darin at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 08:41:59 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit d2f6bd65ed1f9b617d817adadee129c0e28630be
Author: darin <darin at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed May 26 21:16:30 2004 +0000

            Reviewed by John.
    
            - moved HTML editing operations from WebView to WebHTMLView, leaving only forwarding machinery
              at the WebView level
    
            - fixed <rdar://problem/3655412>: (Editing:�startSpeaking:�ethod�nimplemented�WebKit�diting�PI))
            - fixed <rdar://problem/3655414>: (Editing:�stopSpeaking:�ethod�nimplemented�WebKit�diting�PI))
            - fixed <rdar://problem/3655375>: (Editing:�pasteAsRichText:�ethod�nimplemented�WebKit�diting�PI))
    
            * WebView.subproj/WebView.h: Added missing declaration of selectionAffinity. I think this
            omission was an editorial mistake.
    
            * WebView.subproj/WebView.m:
            (-[WebView searchFor:direction:caseSensitive:wrap:]): Use _frameForCurrentSelection directly,
            since it no longer returns nil.
            (-[WebView pasteboardTypesForSelection]): Use _frameForCurrentSelection instead of going through the bridge.
            (-[WebView _frameForCurrentSelection]): Renamed from _currentFrame and changed to return main frame
            rather than nil when called on WebView that has no current selection.
            (-[WebView _bridgeForCurrentSelection]): Moved in file.
            (-[WebView _updateFontPanel]): Removed the one call to _currentSelectionIsEditable here, since
            it was the only one left in this file. Eventually this code will move to WebHTMLView.
            (-[WebView _performResponderOperation:with:]): Name change.
    
            * WebView.subproj/WebDataSource.m: (-[WebDataSource _documentFragmentWithImageResource:]):
            Build document fragment using DOM instead of composing HTML text.
    
            * WebView.subproj/WebHTMLView.m:
            (-[WebHTMLView _documentFragmentFromPasteboard:allowPlainText:]): Added allowPlainText boolean,
            moved method into new location in file so it can be in the right category, changed link pasting
            to use DOM instead of composing HTML text.
            (-[WebHTMLView _replaceSelectionWithPasteboard:selectReplacement:allowPlainText:]): Added allowPlainText
            boolean, moved method into new location in file so it can be in the right category.
            (-[WebHTMLView concludeDragForDraggingInfo:]): Pass YES for allowPlainText.
            (-[WebHTMLView centerSelectionInVisibleArea:]): Moved here from WebView.
            (-[WebHTMLView _alterCurrentSelection:direction:granularity:]): Ditto.
            (-[WebHTMLView moveBackward:]): Ditto.
            (-[WebHTMLView moveBackwardAndModifySelection:]): Ditto.
            (-[WebHTMLView moveDown:]): Ditto.
            (-[WebHTMLView moveDownAndModifySelection:]): Ditto.
            (-[WebHTMLView moveForward:]): Ditto.
            (-[WebHTMLView moveForwardAndModifySelection:]): Ditto.
            (-[WebHTMLView moveLeft:]): Ditto.
            (-[WebHTMLView moveLeftAndModifySelection:]): Ditto.
            (-[WebHTMLView moveRight:]): Ditto.
            (-[WebHTMLView moveRightAndModifySelection:]): Ditto.
            (-[WebHTMLView moveToBeginningOfDocument:]): Ditto.
            (-[WebHTMLView moveToBeginningOfLine:]): Ditto.
            (-[WebHTMLView moveToBeginningOfParagraph:]): Ditto.
            (-[WebHTMLView moveToEndOfDocument:]): Ditto.
            (-[WebHTMLView moveToEndOfLine:]): Ditto.
            (-[WebHTMLView moveToEndOfParagraph:]): Ditto.
            (-[WebHTMLView moveUp:]): Ditto.
            (-[WebHTMLView moveUpAndModifySelection:]): Ditto.
            (-[WebHTMLView moveWordBackward:]): Ditto.
            (-[WebHTMLView moveWordBackwardAndModifySelection:]): Ditto.
            (-[WebHTMLView moveWordForward:]): Ditto.
            (-[WebHTMLView moveWordForwardAndModifySelection:]): Ditto.
            (-[WebHTMLView moveWordLeft:]): Ditto.
            (-[WebHTMLView moveWordLeftAndModifySelection:]): Ditto.
            (-[WebHTMLView moveWordRight:]): Ditto.
            (-[WebHTMLView moveWordRightAndModifySelection:]): Ditto.
            (-[WebHTMLView pageDown:]): Ditto.
            (-[WebHTMLView pageUp:]): Ditto.
            (-[WebHTMLView selectParagraph:]): Ditto.
            (-[WebHTMLView selectLine:]): Ditto.
            (-[WebHTMLView selectWord:]): Ditto.
            (-[WebHTMLView copy:]): Moved down in file so it's in the right category.
            (-[WebHTMLView cut:]): Ditto.
            (-[WebHTMLView delete:]): Ditto.
            (-[WebHTMLView paste:]): Ditto.
            (-[WebHTMLView copyFont:]): Moved here from WebView.
            (-[WebHTMLView pasteFont:]): Ditto.
            (-[WebHTMLView pasteAsPlainText:]): Ditto.
            (-[WebHTMLView pasteAsRichText:]): Implemented this by calling the paste code with
            allowPlainText:NO; believe it or not, that's what this means in NSTextView.
            (-[WebHTMLView changeFont:]): Moved here from WebView.
            (-[WebHTMLView changeAttributes:]): Ditto.
            (-[WebHTMLView changeDocumentBackgroundColor:]): Ditto.
            (-[WebHTMLView changeColor:]): Ditto.
            (-[WebHTMLView alignCenter:]): Ditto.
            (-[WebHTMLView alignJustified:]): Ditto.
            (-[WebHTMLView alignLeft:]): Ditto.
            (-[WebHTMLView alignRight:]): Ditto.
            (-[WebHTMLView indent:]): Ditto.
            (-[WebHTMLView insertTab:]): Moved here from WebView, also call insertText rather than
            replaceSelectionWithText so it's undoable like a typed character.
            (-[WebHTMLView insertBacktab:]): Moved here from WebView.
            (-[WebHTMLView insertNewline:]): Moved here from WebView, also call insertText rather than
            replaceSelectionWithText so it's undoable like a typed character.
            (-[WebHTMLView insertParagraphSeparator:]): Moved here from WebView.
            (-[WebHTMLView changeCaseOfLetter:]): Ditto.
            (-[WebHTMLView uppercaseWord:]): Ditto.
            (-[WebHTMLView lowercaseWord:]): Ditto.
            (-[WebHTMLView capitalizeWord:]): Ditto.
            (-[WebHTMLView deleteForward:]): Ditto.
            (-[WebHTMLView deleteBackward:]): Ditto.
            (-[WebHTMLView deleteBackwardByDecomposingPreviousCharacter:]): Ditto.
            (-[WebHTMLView deleteWordForward:]): Ditto.
            (-[WebHTMLView deleteWordBackward:]): Ditto.
            (-[WebHTMLView deleteToBeginningOfLine:]): Ditto.
            (-[WebHTMLView deleteToEndOfLine:]): Ditto.
            (-[WebHTMLView deleteToBeginningOfParagraph:]): Ditto.
            (-[WebHTMLView deleteToEndOfParagraph:]): Ditto.
            (-[WebHTMLView complete:]): Ditto.
            (-[WebHTMLView checkSpelling:]): Ditto.
            (-[WebHTMLView showGuessPanel:]): Ditto.
            (-[WebHTMLView performFindPanelAction:]): Ditto.
            (-[WebHTMLView startSpeaking:]): Implemented this.
            (-[WebHTMLView stopSpeaking:]): Implemented this.
            (-[WebHTMLView insertText:]): Moved here from WebView.
    
            * WebView.subproj/WebHTMLViewPrivate.h: Removed declarations of methods that are neither
            SPI nor needed outside WebHTMLView.m.
    
            * WebView.subproj/WebViewInternal.h: Removed _currentFrame, and added _frameForCurrentSelection and
            _bridgeForCurrentSelection.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@6692 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit/ChangeLog b/WebKit/ChangeLog
index 1614481..f81ad0c 100644
--- a/WebKit/ChangeLog
+++ b/WebKit/ChangeLog
@@ -1,3 +1,122 @@
+2004-05-26  Darin Adler  <darin at apple.com>
+
+        Reviewed by John.
+
+        - moved HTML editing operations from WebView to WebHTMLView, leaving only forwarding machinery
+          at the WebView level
+
+        - fixed <rdar://problem/3655412>: (Editing:Ê-startSpeaking:ÊmethodÊunimplementedÊ(WebKitÊeditingÊAPI))
+        - fixed <rdar://problem/3655414>: (Editing:Ê-stopSpeaking:ÊmethodÊunimplementedÊ(WebKitÊeditingÊAPI))
+        - fixed <rdar://problem/3655375>: (Editing:Ê-pasteAsRichText:ÊmethodÊunimplementedÊ(WebKitÊeditingÊAPI))
+
+        * WebView.subproj/WebView.h: Added missing declaration of selectionAffinity. I think this
+        omission was an editorial mistake.
+
+        * WebView.subproj/WebView.m:
+        (-[WebView searchFor:direction:caseSensitive:wrap:]): Use _frameForCurrentSelection directly,
+        since it no longer returns nil.
+        (-[WebView pasteboardTypesForSelection]): Use _frameForCurrentSelection instead of going through the bridge.
+        (-[WebView _frameForCurrentSelection]): Renamed from _currentFrame and changed to return main frame
+        rather than nil when called on WebView that has no current selection.
+        (-[WebView _bridgeForCurrentSelection]): Moved in file.
+        (-[WebView _updateFontPanel]): Removed the one call to _currentSelectionIsEditable here, since
+        it was the only one left in this file. Eventually this code will move to WebHTMLView.
+        (-[WebView _performResponderOperation:with:]): Name change.
+
+        * WebView.subproj/WebDataSource.m: (-[WebDataSource _documentFragmentWithImageResource:]):
+        Build document fragment using DOM instead of composing HTML text.
+
+        * WebView.subproj/WebHTMLView.m:
+        (-[WebHTMLView _documentFragmentFromPasteboard:allowPlainText:]): Added allowPlainText boolean,
+        moved method into new location in file so it can be in the right category, changed link pasting
+        to use DOM instead of composing HTML text.
+        (-[WebHTMLView _replaceSelectionWithPasteboard:selectReplacement:allowPlainText:]): Added allowPlainText
+        boolean, moved method into new location in file so it can be in the right category.
+        (-[WebHTMLView concludeDragForDraggingInfo:]): Pass YES for allowPlainText.
+        (-[WebHTMLView centerSelectionInVisibleArea:]): Moved here from WebView.
+        (-[WebHTMLView _alterCurrentSelection:direction:granularity:]): Ditto.
+        (-[WebHTMLView moveBackward:]): Ditto.
+        (-[WebHTMLView moveBackwardAndModifySelection:]): Ditto.
+        (-[WebHTMLView moveDown:]): Ditto.
+        (-[WebHTMLView moveDownAndModifySelection:]): Ditto.
+        (-[WebHTMLView moveForward:]): Ditto.
+        (-[WebHTMLView moveForwardAndModifySelection:]): Ditto.
+        (-[WebHTMLView moveLeft:]): Ditto.
+        (-[WebHTMLView moveLeftAndModifySelection:]): Ditto.
+        (-[WebHTMLView moveRight:]): Ditto.
+        (-[WebHTMLView moveRightAndModifySelection:]): Ditto.
+        (-[WebHTMLView moveToBeginningOfDocument:]): Ditto.
+        (-[WebHTMLView moveToBeginningOfLine:]): Ditto.
+        (-[WebHTMLView moveToBeginningOfParagraph:]): Ditto.
+        (-[WebHTMLView moveToEndOfDocument:]): Ditto.
+        (-[WebHTMLView moveToEndOfLine:]): Ditto.
+        (-[WebHTMLView moveToEndOfParagraph:]): Ditto.
+        (-[WebHTMLView moveUp:]): Ditto.
+        (-[WebHTMLView moveUpAndModifySelection:]): Ditto.
+        (-[WebHTMLView moveWordBackward:]): Ditto.
+        (-[WebHTMLView moveWordBackwardAndModifySelection:]): Ditto.
+        (-[WebHTMLView moveWordForward:]): Ditto.
+        (-[WebHTMLView moveWordForwardAndModifySelection:]): Ditto.
+        (-[WebHTMLView moveWordLeft:]): Ditto.
+        (-[WebHTMLView moveWordLeftAndModifySelection:]): Ditto.
+        (-[WebHTMLView moveWordRight:]): Ditto.
+        (-[WebHTMLView moveWordRightAndModifySelection:]): Ditto.
+        (-[WebHTMLView pageDown:]): Ditto.
+        (-[WebHTMLView pageUp:]): Ditto.
+        (-[WebHTMLView selectParagraph:]): Ditto.
+        (-[WebHTMLView selectLine:]): Ditto.
+        (-[WebHTMLView selectWord:]): Ditto.
+        (-[WebHTMLView copy:]): Moved down in file so it's in the right category.
+        (-[WebHTMLView cut:]): Ditto.
+        (-[WebHTMLView delete:]): Ditto.
+        (-[WebHTMLView paste:]): Ditto.
+        (-[WebHTMLView copyFont:]): Moved here from WebView.
+        (-[WebHTMLView pasteFont:]): Ditto.
+        (-[WebHTMLView pasteAsPlainText:]): Ditto.
+        (-[WebHTMLView pasteAsRichText:]): Implemented this by calling the paste code with
+        allowPlainText:NO; believe it or not, that's what this means in NSTextView.
+        (-[WebHTMLView changeFont:]): Moved here from WebView.
+        (-[WebHTMLView changeAttributes:]): Ditto.
+        (-[WebHTMLView changeDocumentBackgroundColor:]): Ditto.
+        (-[WebHTMLView changeColor:]): Ditto.
+        (-[WebHTMLView alignCenter:]): Ditto.
+        (-[WebHTMLView alignJustified:]): Ditto.
+        (-[WebHTMLView alignLeft:]): Ditto.
+        (-[WebHTMLView alignRight:]): Ditto.
+        (-[WebHTMLView indent:]): Ditto.
+        (-[WebHTMLView insertTab:]): Moved here from WebView, also call insertText rather than
+        replaceSelectionWithText so it's undoable like a typed character.
+        (-[WebHTMLView insertBacktab:]): Moved here from WebView.
+        (-[WebHTMLView insertNewline:]): Moved here from WebView, also call insertText rather than
+        replaceSelectionWithText so it's undoable like a typed character.
+        (-[WebHTMLView insertParagraphSeparator:]): Moved here from WebView.
+        (-[WebHTMLView changeCaseOfLetter:]): Ditto.
+        (-[WebHTMLView uppercaseWord:]): Ditto.
+        (-[WebHTMLView lowercaseWord:]): Ditto.
+        (-[WebHTMLView capitalizeWord:]): Ditto.
+        (-[WebHTMLView deleteForward:]): Ditto.
+        (-[WebHTMLView deleteBackward:]): Ditto.
+        (-[WebHTMLView deleteBackwardByDecomposingPreviousCharacter:]): Ditto.
+        (-[WebHTMLView deleteWordForward:]): Ditto.
+        (-[WebHTMLView deleteWordBackward:]): Ditto.
+        (-[WebHTMLView deleteToBeginningOfLine:]): Ditto.
+        (-[WebHTMLView deleteToEndOfLine:]): Ditto.
+        (-[WebHTMLView deleteToBeginningOfParagraph:]): Ditto.
+        (-[WebHTMLView deleteToEndOfParagraph:]): Ditto.
+        (-[WebHTMLView complete:]): Ditto.
+        (-[WebHTMLView checkSpelling:]): Ditto.
+        (-[WebHTMLView showGuessPanel:]): Ditto.
+        (-[WebHTMLView performFindPanelAction:]): Ditto.
+        (-[WebHTMLView startSpeaking:]): Implemented this.
+        (-[WebHTMLView stopSpeaking:]): Implemented this.
+        (-[WebHTMLView insertText:]): Moved here from WebView.
+
+        * WebView.subproj/WebHTMLViewPrivate.h: Removed declarations of methods that are neither
+        SPI nor needed outside WebHTMLView.m.
+
+        * WebView.subproj/WebViewInternal.h: Removed _currentFrame, and added _frameForCurrentSelection and
+        _bridgeForCurrentSelection.
+
 2004-05-25  Maciej Stachowiak  <mjs at apple.com>
 
         Reviewed by Richard.
diff --git a/WebKit/WebView.subproj/WebDataSource.m b/WebKit/WebView.subproj/WebDataSource.m
index 35f5b58..e7d868c 100644
--- a/WebKit/WebView.subproj/WebDataSource.m
+++ b/WebKit/WebView.subproj/WebDataSource.m
@@ -204,8 +204,14 @@
 {
     ASSERT(resource);
     [self addSubresource:resource];
-    NSString *markupString = [NSString stringWithFormat:@"<IMG SRC=\"%@\">", [[resource URL] _web_originalDataAsString]];
-    return [[self _bridge] documentFragmentWithMarkupString:markupString baseURLString:nil];
+
+    DOMDocument *document = [[self _bridge] DOMDocument];
+    DOMDocumentFragment *fragment = [document createDocumentFragment];
+    DOMElement *imageElement = [document createElement:@"img"];
+    [imageElement setAttribute:@"src" :[[resource URL] _web_originalDataAsString]];
+    [fragment appendChild:imageElement];
+
+    return fragment;
 }
 
 - (DOMDocumentFragment *)_documentFragmentWithArchive:(WebArchive *)archive
diff --git a/WebKit/WebView.subproj/WebHTMLView.m b/WebKit/WebView.subproj/WebHTMLView.m
index 7530b54..e39b295 100644
--- a/WebKit/WebView.subproj/WebHTMLView.m
+++ b/WebKit/WebView.subproj/WebHTMLView.m
@@ -14,6 +14,7 @@
 #import <WebKit/WebDataSourcePrivate.h>
 #import <WebKit/WebDocumentInternal.h>
 #import <WebKit/WebDOMOperations.h>
+#import <WebKit/WebEditingDelegate.h>
 #import <WebKit/WebException.h>
 #import <WebKit/WebFramePrivate.h>
 #import <WebKit/WebFrameViewPrivate.h>
@@ -84,6 +85,11 @@
 
 static BOOL forceRealHitTest = NO;
 
+ at interface WebHTMLView (WebHTMLViewFileInternal)
+- (DOMDocumentFragment *)_documentFragmentFromPasteboard:(NSPasteboard *)pasteboard allowPlainText:(BOOL)allowPlainText;
+- (void)_replaceSelectionWithPasteboard:(NSPasteboard *)pasteboard selectReplacement:(BOOL)selectReplacement allowPlainText:(BOOL)allowPlainText;
+ at end
+
 @interface WebHTMLView (WebHTMLViewPrivate)
 - (void)_setPrinting:(BOOL)printing minimumPageWidth:(float)minPageWidth maximumPageWidth:(float)maxPageWidth adjustViewSize:(BOOL)adjustViewSize;
 - (void)_updateTextSizeMultiplier;
@@ -94,7 +100,6 @@ static BOOL forceRealHitTest = NO;
 // Any non-zero value will do, but using somethign recognizable might help us debug some day.
 #define TRACKING_RECT_TAG 0xBADFACE
 
-
 @interface NSView (AppKitSecretsIKnowAbout)
 - (void)_recursiveDisplayRectIfNeededIgnoringOpacity:(NSRect)rect isVisibleRect:(BOOL)isVisibleRect rectIsVisibleRectForView:(NSView *)visibleView topView:(BOOL)topView;
 - (void)_recursiveDisplayAllDirtyWithLockFocus:(BOOL)needsLockFocus visRect:(NSRect)visRect;
@@ -102,6 +107,10 @@ static BOOL forceRealHitTest = NO;
 - (void)_setDrawsOwnDescendants:(BOOL)drawsOwnDescendants;
 @end
 
+ at interface NSApplication (AppKitSecretsIKnowAbout)
+- (void)speakString:(NSString *)string;
+ at end
+
 @interface NSView (WebHTMLViewPrivate)
 - (void)_web_setPrintingModeRecursive;
 - (void)_web_clearPrintingModeRecursive;
@@ -131,6 +140,81 @@ static BOOL forceRealHitTest = NO;
 
 @end
 
+ at implementation WebHTMLView (WebHTMLViewFileInternal)
+
+- (DOMDocumentFragment *)_documentFragmentFromPasteboard:(NSPasteboard *)pasteboard allowPlainText:(BOOL)allowPlainText
+{
+    NSArray *types = [pasteboard types];
+
+    if ([types containsObject:WebArchivePboardType]) {
+        WebArchive *archive = [[WebArchive alloc] initWithData:[pasteboard dataForType:WebArchivePboardType]];
+        if (archive) {
+            DOMDocumentFragment *fragment = [[self _dataSource] _documentFragmentWithArchive:archive];
+            [archive release];
+            if (fragment) {
+                return fragment;
+            }
+        }
+    }
+    
+    NSURL *URL;
+    
+    if ([types containsObject:NSHTMLPboardType]) {
+        return [[self _bridge] documentFragmentWithMarkupString:[pasteboard stringForType:NSHTMLPboardType] baseURLString:nil];
+    } else if ([types containsObject:NSTIFFPboardType]) {
+        WebResource *resource = [[WebResource alloc] initWithData:[pasteboard dataForType:NSTIFFPboardType]
+                                                              URL:[NSURL _web_uniqueWebDataURLWithRelativeString:@"/image.tiff"]
+                                                         MIMEType:@"image/tiff" 
+                                                 textEncodingName:nil
+                                                        frameName:nil];
+        DOMDocumentFragment *fragment = [[self _dataSource] _documentFragmentWithImageResource:resource];
+        [resource release];
+        return fragment;
+    } else if ([types containsObject:NSPICTPboardType]) {
+        WebResource *resource = [[WebResource alloc] initWithData:[pasteboard dataForType:NSPICTPboardType]
+                                                              URL:[NSURL _web_uniqueWebDataURLWithRelativeString:@"/image.pict"]
+                                                         MIMEType:@"image/pict" 
+                                                 textEncodingName:nil
+                                                        frameName:nil];
+        DOMDocumentFragment *fragment = [[self _dataSource] _documentFragmentWithImageResource:resource];
+        [resource release];
+        return fragment;
+    } else if ((URL = [pasteboard _web_bestURL])) {
+        NSString *URLString = [URL _web_originalDataAsString];
+        NSString *linkLabel = [pasteboard stringForType:WebURLNamePboardType];
+        linkLabel = [linkLabel length] > 0 ? linkLabel : URLString;
+
+        DOMDocument *document = [[self _bridge] DOMDocument];
+        DOMDocumentFragment *fragment = [document createDocumentFragment];
+        DOMElement *anchorElement = [document createElement:@"a"];
+        [anchorElement setAttribute:@"href" :URLString];
+        [fragment appendChild:anchorElement];
+        [anchorElement appendChild:[document createTextNode:linkLabel]];
+        return fragment;
+    } else if ([types containsObject:NSRTFDPboardType]) {
+        // FIXME: Support RTFD to HTML (or DOM) conversion.
+        ERROR("RTFD to HTML conversion not yet supported.");
+        return [[self _bridge] documentFragmentWithMarkupString:[pasteboard stringForType:NSStringPboardType] baseURLString:nil];
+    } else if ([types containsObject:NSRTFPboardType]) {
+        // FIXME: Support RTF to HTML (or DOM) conversion.
+        ERROR("RTF to HTML conversion not yet supported.");
+        return [[self _bridge] documentFragmentWithMarkupString:[pasteboard stringForType:NSStringPboardType] baseURLString:nil];
+    } else if (allowPlainText && [types containsObject:NSStringPboardType]) {
+        return [[self _bridge] documentFragmentWithText:[pasteboard stringForType:NSStringPboardType]];
+    }
+    
+    return nil;
+}
+
+- (void)_replaceSelectionWithPasteboard:(NSPasteboard *)pasteboard selectReplacement:(BOOL)selectReplacement allowPlainText:(BOOL)allowPlainText
+{
+    DOMDocumentFragment *fragment = [self _documentFragmentFromPasteboard:pasteboard allowPlainText:allowPlainText];
+    if (fragment) {
+        [[self _bridge] replaceSelectionWithFragment:fragment selectReplacement:selectReplacement];
+    }
+}
+
+ at end
 
 @implementation WebHTMLView (WebPrivate)
 
@@ -544,75 +628,6 @@ static WebHTMLView *lastHitView = nil;
     return [[self _bridge] isSelectionEditable];
 }
 
-- (DOMDocumentFragment *)_documentFragmentFromPasteboard:(NSPasteboard *)pasteboard
-{
-    NSArray *types = [pasteboard types];
-
-    if ([types containsObject:WebArchivePboardType]) {
-        WebArchive *archive = [[WebArchive alloc] initWithData:[pasteboard dataForType:WebArchivePboardType]];
-        if (archive) {
-            DOMDocumentFragment *fragment = [[self _dataSource] _documentFragmentWithArchive:archive];
-            [archive release];
-            if (fragment) {
-                return fragment;
-            }
-        }
-    }
-    
-    NSURL *URL;
-    
-    if ([types containsObject:NSHTMLPboardType]) {
-        return [[self _bridge] documentFragmentWithMarkupString:[pasteboard stringForType:NSHTMLPboardType] baseURLString:nil];
-    } else if ([types containsObject:NSTIFFPboardType]) {
-        WebResource *resource = [[WebResource alloc] initWithData:[pasteboard dataForType:NSTIFFPboardType]
-                                                              URL:[NSURL _web_uniqueWebDataURLWithRelativeString:@"/image.tiff"]
-                                                         MIMEType:@"image/tiff" 
-                                                 textEncodingName:nil
-                                                        frameName:nil];
-        DOMDocumentFragment *fragment = [[self _dataSource] _documentFragmentWithImageResource:resource];
-        [resource release];
-        return fragment;
-    } else if ([types containsObject:NSPICTPboardType]) {
-        WebResource *resource = [[WebResource alloc] initWithData:[pasteboard dataForType:NSPICTPboardType]
-                                                              URL:[NSURL _web_uniqueWebDataURLWithRelativeString:@"/image.pict"]
-                                                         MIMEType:@"image/pict" 
-                                                 textEncodingName:nil
-                                                        frameName:nil];
-        DOMDocumentFragment *fragment = [[self _dataSource] _documentFragmentWithImageResource:resource];
-        [resource release];
-        return fragment;
-    } else if ((URL = [pasteboard _web_bestURL])) {
-        NSString *URLString = [URL _web_originalDataAsString];
-        NSString *linkLabel = [pasteboard stringForType:WebURLNamePboardType];
-        linkLabel = [linkLabel length] > 0 ? linkLabel : URLString;
-        // FIXME: Need to escape the text in the linkLabel, otherwise characters like "<" won't work.
-        // An even better solution would be to make a DOM node with the DOM API rather than creating
-        // a markup string here.
-        NSString *markupString = [NSString stringWithFormat:@"<A HREF=\"%@\">%@</A>", URLString, linkLabel];
-        return [[self _bridge] documentFragmentWithMarkupString:markupString baseURLString:nil];
-    } else if ([types containsObject:NSRTFDPboardType]) {
-        // FIXME: Support RTFD to HTML (or DOM) conversion.
-        ERROR("RTFD to HTML conversion not yet supported.");
-        return [[self _bridge] documentFragmentWithMarkupString:[pasteboard stringForType:NSStringPboardType] baseURLString:nil];
-    } else if ([types containsObject:NSRTFPboardType]) {
-        // FIXME: Support RTF to HTML (or DOM) conversion.
-        ERROR("RTF to HTML conversion not yet supported.");
-        return [[self _bridge] documentFragmentWithMarkupString:[pasteboard stringForType:NSStringPboardType] baseURLString:nil];
-    } else if ([types containsObject:NSStringPboardType]) {
-        return [[self _bridge] documentFragmentWithText:[pasteboard stringForType:NSStringPboardType]];
-    }
-    
-    return nil;
-}
-
-- (void)_replaceSelectionWithPasteboard:(NSPasteboard *)pasteboard selectReplacement:(BOOL)selectReplacement
-{
-    DOMDocumentFragment *fragment = [self _documentFragmentFromPasteboard:pasteboard];
-    if (fragment) {
-        [[self _bridge] replaceSelectionWithFragment:fragment selectReplacement:selectReplacement];
-    }
-}
-
 - (NSImage *)_dragImageForLinkElement:(NSDictionary *)element
 {
     NSURL *linkURL = [element objectForKey: WebElementLinkURLKey];
@@ -892,39 +907,6 @@ static WebHTMLView *lastHitView = nil;
     [self mouseDragged:fakeEvent];
 }
 
-- (void)copy:(id)sender
-{
-    if (![self _haveSelection]) {
-        NSBeep();
-        return;
-    }
-    [self _writeSelectionToPasteboard:[NSPasteboard generalPasteboard]];
-}
-
-- (void)cut:(id)sender
-{   
-    if (![self _haveSelection]) {
-        NSBeep();
-        return;
-    }
-    [self copy:sender];
-    [[self _bridge] deleteSelection];
-}
-
-- (void)delete:(id)sender
-{
-    if (![self _haveSelection]) {
-        NSBeep();
-        return;
-    }
-    [[self _bridge] deleteSelection];
-}
-
-- (void)paste:(id)sender
-{
-    [self _replaceSelectionWithPasteboard:[NSPasteboard generalPasteboard] selectReplacement:NO];
-}
-
 @end
 
 @implementation NSView (WebHTMLViewPrivate)
@@ -1750,11 +1732,11 @@ static WebHTMLView *lastHitView = nil;
     BOOL didInsert = NO;
     if ([self _canProcessDragWithDraggingInfo:draggingInfo]) {
         if (_private->initiatedDrag && [[self _bridge] isSelectionEditable]) {
-            DOMDocumentFragment *fragment = [self _documentFragmentFromPasteboard:[draggingInfo draggingPasteboard]];
+            DOMDocumentFragment *fragment = [self _documentFragmentFromPasteboard:[draggingInfo draggingPasteboard] allowPlainText:YES];
             [bridge moveSelectionToDragCaret:fragment];
         } else {
             [bridge setSelectionToDragCaret];
-            [self _replaceSelectionWithPasteboard:[draggingInfo draggingPasteboard] selectReplacement:YES];
+            [self _replaceSelectionWithPasteboard:[draggingInfo draggingPasteboard] selectReplacement:YES allowPlainText:YES];
         }
         didInsert = YES;
     }
@@ -2101,6 +2083,443 @@ static WebHTMLView *lastHitView = nil;
     else
         return self;
 }
+
+- (void)centerSelectionInVisibleArea:(id)sender
+{
+    // FIXME: Does this do the right thing when the selection is not a caret?
+    [[self _bridge] ensureCaretVisible];
+}
+
+- (void)_alterCurrentSelection:(WebSelectionAlteration)alteration direction:(WebSelectionDirection)direction granularity:(WebSelectionGranularity)granularity
+{
+    WebBridge *bridge = [self _bridge];
+    DOMRange *proposedRange = [bridge rangeByAlteringCurrentSelection:alteration direction:direction granularity:granularity];
+    WebView *webView = [self _webView];
+    if ([[webView _editingDelegateForwarder] webView:webView shouldChangeSelectedDOMRange:[bridge selectedDOMRange] toDOMRange:proposedRange affinity:[bridge selectionAffinity] stillSelecting:NO]) {
+        [bridge alterCurrentSelection:alteration direction:direction granularity:granularity];
+        [bridge ensureCaretVisible];
+    }
+}
+
+- (void)moveBackward:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectBackward granularity:WebSelectByCharacter];
+}
+
+- (void)moveBackwardAndModifySelection:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectBackward granularity:WebSelectByCharacter];
+}
+
+- (void)moveDown:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectDown granularity:WebSelectByCharacter];
+}
+
+- (void)moveDownAndModifySelection:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectDown granularity:WebSelectByCharacter];
+}
+
+- (void)moveForward:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectForward granularity:WebSelectByCharacter];
+}
+
+- (void)moveForwardAndModifySelection:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectForward granularity:WebSelectByCharacter];
+}
+
+- (void)moveLeft:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectLeft granularity:WebSelectByCharacter];
+}
+
+- (void)moveLeftAndModifySelection:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectLeft granularity:WebSelectByCharacter];
+}
+
+- (void)moveRight:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectRight granularity:WebSelectByCharacter];
+}
+
+- (void)moveRightAndModifySelection:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectRight granularity:WebSelectByCharacter];
+}
+
+- (void)moveToBeginningOfDocument:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)moveToBeginningOfLine:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)moveToBeginningOfParagraph:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)moveToEndOfDocument:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)moveToEndOfLine:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)moveToEndOfParagraph:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)moveUp:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectUp granularity:WebSelectByCharacter];
+}
+
+- (void)moveUpAndModifySelection:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectUp granularity:WebSelectByCharacter];
+}
+
+- (void)moveWordBackward:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectBackward granularity:WebSelectByWord];
+}
+
+- (void)moveWordBackwardAndModifySelection:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectBackward granularity:WebSelectByWord];
+}
+
+- (void)moveWordForward:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectForward granularity:WebSelectByWord];
+}
+
+- (void)moveWordForwardAndModifySelection:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectForward granularity:WebSelectByWord];
+}
+
+- (void)moveWordLeft:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectLeft granularity:WebSelectByWord];
+}
+
+- (void)moveWordLeftAndModifySelection:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectLeft granularity:WebSelectByWord];
+}
+
+- (void)moveWordRight:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectRight granularity:WebSelectByWord];
+}
+
+- (void)moveWordRightAndModifySelection:(id)sender
+{
+    [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectRight granularity:WebSelectByWord];
+}
+
+- (void)pageDown:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)pageUp:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+
+    /* Selections */
+
+- (void)selectParagraph:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)selectLine:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)selectWord:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)copy:(id)sender
+{
+    if (![self _haveSelection]) {
+        NSBeep();
+        return;
+    }
+    [self _writeSelectionToPasteboard:[NSPasteboard generalPasteboard]];
+}
+
+- (void)cut:(id)sender
+{   
+    if (![self _haveSelection]) {
+        NSBeep();
+        return;
+    }
+    [self copy:sender];
+    [[self _bridge] deleteSelection];
+}
+
+- (void)delete:(id)sender
+{
+    if (![self _haveSelection]) {
+        NSBeep();
+        return;
+    }
+    [[self _bridge] deleteSelection];
+}
+
+- (void)paste:(id)sender
+{
+    [self _replaceSelectionWithPasteboard:[NSPasteboard generalPasteboard] selectReplacement:NO allowPlainText:YES];
+}
+
+- (void)copyFont:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)pasteFont:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)pasteAsPlainText:(id)sender
+{
+    NSString *text = [[NSPasteboard generalPasteboard] stringForType:NSStringPboardType];
+    WebView *webView = [self _webView];
+    WebBridge *bridge = [self _bridge];
+    if ([[webView _editingDelegateForwarder] webView:webView shouldInsertText:text replacingDOMRange:[bridge selectedDOMRange] givenAction:WebViewInsertActionPasted]) {
+        [[self _bridge] replaceSelectionWithText:text selectReplacement:NO];
+    }
+}
+
+- (void)pasteAsRichText:(id)sender
+{
+    [self _replaceSelectionWithPasteboard:[NSPasteboard generalPasteboard] selectReplacement:NO allowPlainText:NO];
+}
+
+- (void)changeFont:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)changeAttributes:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)changeDocumentBackgroundColor:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)changeColor:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)alignCenter:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)alignJustified:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)alignLeft:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)alignRight:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)indent:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)insertTab:(id)sender
+{
+    WebView *webView = [self _webView];
+    WebBridge *bridge = [self _bridge];
+    if ([[webView _editingDelegateForwarder] webView:webView shouldInsertText:@"\t" replacingDOMRange:[bridge selectedDOMRange] givenAction:WebViewInsertActionPasted]) {
+        [[self _bridge] insertText:@"\t"];
+    }
+}
+
+- (void)insertBacktab:(id)sender
+{
+    // Doing nothing matches normal NSTextView behavior. If we ever use WebView for a field-editor-type purpose
+    // we might add code here.
+}
+
+- (void)insertNewline:(id)sender
+{
+    // Perhaps we should make this delegate call sensitive to the real DOM operation we actually do.
+    WebView *webView = [self _webView];
+    WebBridge *bridge = [self _bridge];
+    if ([[webView _editingDelegateForwarder] webView:webView shouldInsertText:@"\n" replacingDOMRange:[bridge selectedDOMRange] givenAction:WebViewInsertActionTyped]) {
+        [bridge replaceSelectionWithNewline];
+        [bridge ensureCaretVisible];
+    }
+}
+
+- (void)insertParagraphSeparator:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)changeCaseOfLetter:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)uppercaseWord:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)lowercaseWord:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)capitalizeWord:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)deleteForward:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)deleteBackward:(id)sender
+{
+    WebBridge *bridge = [self _bridge];
+    if ([bridge isSelectionEditable]) {
+        WebView *webView = [self _webView];
+        if ([[webView _editingDelegateForwarder] webView:webView shouldDeleteDOMRange:[bridge selectedDOMRange]]) {
+            [bridge deleteKeyPressed];
+            [bridge ensureCaretVisible];
+        }
+    }
+}
+
+- (void)deleteBackwardByDecomposingPreviousCharacter:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)deleteWordForward:(id)sender
+{
+    [self moveWordForwardAndModifySelection:sender];
+    [self delete:sender];
+}
+
+- (void)deleteWordBackward:(id)sender
+{
+    [self moveWordBackwardAndModifySelection:sender];
+    [self delete:sender];
+}
+
+- (void)deleteToBeginningOfLine:(id)sender
+{
+    [self moveToBeginningOfLine:sender];
+    [self delete:sender];
+}
+
+- (void)deleteToEndOfLine:(id)sender
+{
+    [self moveToEndOfLine:sender];
+    [self delete:sender];
+}
+
+- (void)deleteToBeginningOfParagraph:(id)sender
+{
+    [self moveToBeginningOfParagraph:sender];
+    [self delete:sender];
+}
+
+- (void)deleteToEndOfParagraph:(id)sender
+{
+    [self moveToEndOfParagraph:sender];
+    [self delete:sender];
+}
+
+- (void)complete:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)checkSpelling:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)showGuessPanel:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)performFindPanelAction:(id)sender
+{
+    ERROR("unimplemented");
+}
+
+- (void)startSpeaking:(id)sender
+{
+    NSString *string = [self selectedString];
+    if ([string length] == 0) {
+        // FIXME: This cast must go away, because otherwise we have XML bugs.
+        // We agreed to do this by just adding another bridge method analogous to
+        // selectedString rather than trying to straighten this out in the DOM API for now.
+        string = [(DOMHTMLElement *)[[[self _bridge] DOMDocument] documentElement] outerText];
+    }
+    [NSApp speakString:string];
+}
+
+- (void)stopSpeaking:(id)sender
+{
+    [NSApp stopSpeaking:sender];
+}
+
+- (void)insertText:(NSString *)text
+{
+    WebBridge *bridge = [self _bridge];
+    if ([bridge isSelectionEditable]) {
+        WebView *webView = [self _webView];
+        if ([[webView _editingDelegateForwarder] webView:webView shouldInsertText:text replacingDOMRange:[bridge selectedDOMRange] givenAction:WebViewInsertActionTyped]) {
+            [bridge insertText:text];
+            [bridge ensureCaretVisible];
+        }
+    }
+}
+
 @end
 
 @implementation WebHTMLView (TextSizing)
diff --git a/WebKit/WebView.subproj/WebHTMLViewPrivate.h b/WebKit/WebView.subproj/WebHTMLViewPrivate.h
index a1b2f5c..d23bb73 100644
--- a/WebKit/WebView.subproj/WebHTMLViewPrivate.h
+++ b/WebKit/WebView.subproj/WebHTMLViewPrivate.h
@@ -73,13 +73,11 @@
 + (NSArray *)_insertablePasteboardTypes;
 + (NSArray *)_selectionPasteboardTypes;
 - (void)_writeSelectionToPasteboard:(NSPasteboard *)pasteboard;
-- (DOMDocumentFragment *)_documentFragmentFromPasteboard:(NSPasteboard *)pasteboard;
 - (WebArchive *)_selectedArchive:(NSString **)markupString;
 - (NSData *)_selectedRTFData;
 - (BOOL)_canDelete;
 - (BOOL)_canPaste;
 - (BOOL)_haveSelection;
-- (void)_replaceSelectionWithPasteboard:(NSPasteboard *)pasteboard selectReplacement:(BOOL)selectReplacement;
 
 - (void)_frameOrBoundsChanged;
 
@@ -95,10 +93,4 @@
 - (void)_startAutoscrollTimer:(NSEvent *)event;
 - (void)_stopAutoscrollTimer;
 
-- (void)copy:(id)sender;
-- (void)cut:(id)sender;
-- (void)delete:(id)sender;
-- (void)paste:(id)sender;
-- (void)delete:(id)sender;
-
 @end
diff --git a/WebKit/WebView.subproj/WebView.h b/WebKit/WebView.subproj/WebView.h
index 535be3b..3682550 100644
--- a/WebKit/WebView.subproj/WebView.h
+++ b/WebKit/WebView.subproj/WebView.h
@@ -548,6 +548,7 @@ extern NSString * const WebViewDidChangeSelectionNotification;
 @interface WebView (WebViewEditing)
 - (void)setSelectedDOMRange:(DOMRange *)range affinity:(NSSelectionAffinity)selectionAffinity;
 - (DOMRange *)selectedDOMRange;
+- (NSSelectionAffinity)selectionAffinity;
 - (void)setEditable:(BOOL)flag;
 - (BOOL)isEditable;
 - (void)setTypingStyle:(DOMCSSStyleDeclaration *)style;
diff --git a/WebKit/WebView.subproj/WebView.m b/WebKit/WebView.subproj/WebView.m
index 84ca1e6..a09d296 100644
--- a/WebKit/WebView.subproj/WebView.m
+++ b/WebKit/WebView.subproj/WebView.m
@@ -115,13 +115,6 @@ NSString *_WebMainFrameURLKey =         @"mainFrameURL";
 @implementation WebProgressItem
 @end
 
- at interface WebView (WebViewEditingInternal)
-- (void)_alterCurrentSelection:(WebSelectionAlteration)alteration direction:(WebSelectionDirection)direction granularity:(WebSelectionGranularity)granularity;
-- (WebBridge *)_bridgeForCurrentSelection;
-- (BOOL)_currentSelectionIsEditable;
- at end
-
-
 @implementation WebViewPrivate
 
 - init 
@@ -1849,10 +1842,7 @@ static WebFrame *incrementFrame(WebFrame *curr, BOOL forward, BOOL wrapFlag)
 - (BOOL)searchFor:(NSString *)string direction:(BOOL)forward caseSensitive:(BOOL)caseFlag wrap:(BOOL)wrapFlag
 {
     // Get the frame holding the selection, or start with the main frame
-    WebFrame *startFrame = [self _currentFrame];
-    if (!startFrame) {
-        startFrame = [self mainFrame];
-    }
+    WebFrame *startFrame = [self _frameForCurrentSelection];
 
     // Search the first frame, then all the other frames, in order
     NSView <WebDocumentSearching> *startSearchView = nil;
@@ -1925,7 +1915,7 @@ static WebFrame *incrementFrame(WebFrame *curr, BOOL forward, BOOL wrapFlag)
 
 - (NSArray *)pasteboardTypesForSelection
 {
-    NSView <WebDocumentView> *documentView = [[[[self _bridgeForCurrentSelection] webFrame] frameView] documentView];
+    NSView <WebDocumentView> *documentView = [[[self _frameForCurrentSelection] frameView] documentView];
     if ([documentView conformsToProtocol:@protocol(WebDocumentSelection)]) {
         return [(NSView <WebDocumentSelection> *)documentView pasteboardTypesForSelection];
     }
@@ -2244,32 +2234,6 @@ static WebFrame *incrementFrame(WebFrame *curr, BOOL forward, BOOL wrapFlag)
 //==========================================================================================
 // Editing
 
- at implementation WebView (WebViewEditingInternal)
-
-- (void)_alterCurrentSelection:(WebSelectionAlteration)alteration direction:(WebSelectionDirection)direction granularity:(WebSelectionGranularity)granularity
-{
-    WebBridge *bridge = [self _bridgeForCurrentSelection];
-    DOMRange *proposedRange = [bridge rangeByAlteringCurrentSelection:alteration direction:direction granularity:granularity];
-    if ([[self _editingDelegateForwarder] webView:self shouldChangeSelectedDOMRange:[self selectedDOMRange] toDOMRange:proposedRange affinity:[bridge selectionAffinity] stillSelecting:NO]) {
-        [bridge alterCurrentSelection:alteration direction:direction granularity:granularity];
-        [bridge ensureCaretVisible];
-    }
-}
-
-// Note: This method should only be used by callers that wish to do nothing if there is no selection or if
-// the selection is outside of the WebView hierarchy.
-- (WebBridge *)_bridgeForCurrentSelection
-{
-    return [[self _currentFrame] _bridge];
-}
-
-- (BOOL)_currentSelectionIsEditable
-{
-    return [[self _bridgeForCurrentSelection] isSelectionEditable];
-}
-
- at end
-
 @implementation WebView (WebViewCSS)
 
 - (DOMCSSStyleDeclaration *)computedStyleForElement:(DOMElement *)element pseudoElement:(NSString *)pseudoElement
@@ -2286,18 +2250,23 @@ static WebFrame *incrementFrame(WebFrame *curr, BOOL forward, BOOL wrapFlag)
 @implementation WebView (WebInternal)
 
 // Return the frame holding first responder
-- (WebFrame *)_currentFrame
+- (WebFrame *)_frameForCurrentSelection
 {
     // Find the frame holding the first responder, or holding the first form in the doc
     NSResponder *resp = [[self window] firstResponder];
     if (!resp || ![resp isKindOfClass:[NSView class]] || ![(NSView *)resp isDescendantOf:self]) {
-        return nil;	// first responder outside our view tree
+        return [self mainFrame];	// first responder outside our view tree
     } else {
         WebFrameView *frameView = (WebFrameView *)[(NSView *)resp _web_superviewOfClass:[WebFrameView class]];
         return [frameView webFrame];
     }
 }
 
+- (WebBridge *)_bridgeForCurrentSelection
+{
+    return [[self _frameForCurrentSelection] _bridge];
+}
+
 - (BOOL)_isLoading
 {
     WebFrame *mainFrame = [self mainFrame];
@@ -2305,6 +2274,7 @@ static WebFrame *incrementFrame(WebFrame *curr, BOOL forward, BOOL wrapFlag)
         || [[mainFrame provisionalDataSource] isLoading];
 }
 
+// FIXME: Move to WebHTMLView.
 static NSFont *_fontFromStyle(DOMCSSStyleDeclaration *style)
 {
     // FIXME: can't get at CSS_PROP_FONT_FAMILY and such from cssproperties.h in WebCore
@@ -2317,12 +2287,13 @@ static NSFont *_fontFromStyle(DOMCSSStyleDeclaration *style)
     return nil;
 }
 
+// FIXME: Move to WebHTMLView.
 - (void)_updateFontPanel
 {
     // FIXME: NSTextView bails out if becoming or resigning first responder, for which it has ivar flags. Not
     // sure if we need to do something similar.
     
-    if (![self _currentSelectionIsEditable]) {
+    if (![[self _bridgeForCurrentSelection] isSelectionEditable]) {
         return;
     }
     
@@ -2602,17 +2573,13 @@ static NSFont *_fontFromStyle(DOMCSSStyleDeclaration *style)
 
 @end
 
-
-/*!
-    @implementation WebView (WebViewEditingActions)
-*/
 @implementation WebView (WebViewEditingActions)
 
-- (void)_performResponderOperation:(SEL)selector sender:(id)sender
+- (void)_performResponderOperation:(SEL)selector with:(id)parameter
 {
     static BOOL reentered = NO;
     if (reentered) {
-        [[self nextResponder] tryToPerform:selector with:sender];
+        [[self nextResponder] tryToPerform:selector with:parameter];
         return;
     }
 
@@ -2636,741 +2603,398 @@ static NSFont *_fontFromStyle(DOMCSSStyleDeclaration *style)
         }
     }
     reentered = YES;
-    [responder tryToPerform:selector with:sender];
+    [responder tryToPerform:selector with:parameter];
     reentered = NO;
 }
 
 - (void)centerSelectionInVisibleArea:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        // FIXME: Does this do the right thing when the selection is not a caret?
-        [[self _bridgeForCurrentSelection] ensureCaretVisible];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(centerSelectionInVisibleArea:) with:sender];
+    [self _performResponderOperation:@selector(centerSelectionInVisibleArea:) with:sender];
 }
 
 - (void)moveBackward:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectBackward granularity:WebSelectByCharacter];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveBackward:) with:sender];
+    [self _performResponderOperation:@selector(moveBackward:) with:sender];
 }
 
 - (void)moveBackwardAndModifySelection:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectBackward granularity:WebSelectByCharacter];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveBackwardAndModifySelection:) with:sender];
+    [self _performResponderOperation:@selector(moveBackwardAndModifySelection:) with:sender];
 }
 
 - (void)moveDown:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectDown granularity:WebSelectByCharacter];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveDown:) with:sender];
+    [self _performResponderOperation:@selector(moveDown:) with:sender];
 }
 
 - (void)moveDownAndModifySelection:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectDown granularity:WebSelectByCharacter];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveDownAndModifySelection:) with:sender];
+    [self _performResponderOperation:@selector(moveDownAndModifySelection:) with:sender];
 }
 
 - (void)moveForward:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectForward granularity:WebSelectByCharacter];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveForward:) with:sender];
+    [self _performResponderOperation:@selector(moveForward:) with:sender];
 }
 
 - (void)moveForwardAndModifySelection:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectForward granularity:WebSelectByCharacter];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveForwardAndModifySelection:) with:sender];
+    [self _performResponderOperation:@selector(moveForwardAndModifySelection:) with:sender];
 }
 
 - (void)moveLeft:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectLeft granularity:WebSelectByCharacter];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveLeft:) with:sender];
+    [self _performResponderOperation:@selector(moveLeft:) with:sender];
 }
 
 - (void)moveLeftAndModifySelection:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectLeft granularity:WebSelectByCharacter];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveLeftAndModifySelection:) with:sender];
+    [self _performResponderOperation:@selector(moveLeftAndModifySelection:) with:sender];
 }
 
 - (void)moveRight:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectRight granularity:WebSelectByCharacter];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveRight:) with:sender];
+    [self _performResponderOperation:@selector(moveRight:) with:sender];
 }
 
 - (void)moveRightAndModifySelection:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectRight granularity:WebSelectByCharacter];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveRightAndModifySelection:) with:sender];
+    [self _performResponderOperation:@selector(moveRightAndModifySelection:) with:sender];
 }
 
 - (void)moveToBeginningOfDocument:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveToBeginningOfDocument:) with:sender];
+    [self _performResponderOperation:@selector(moveToBeginningOfDocument:) with:sender];
 }
 
 - (void)moveToBeginningOfLine:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveToBeginningOfLine:) with:sender];
+    [self _performResponderOperation:@selector(moveToBeginningOfLine:) with:sender];
 }
 
 - (void)moveToBeginningOfParagraph:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveToBeginningOfParagraph:) with:sender];
+    [self _performResponderOperation:@selector(moveToBeginningOfParagraph:) with:sender];
 }
 
 - (void)moveToEndOfDocument:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveToEndOfDocument:) with:sender];
+    [self _performResponderOperation:@selector(moveToEndOfDocument:) with:sender];
 }
 
 - (void)moveToEndOfLine:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveToEndOfLine:) with:sender];
+    [self _performResponderOperation:@selector(moveToEndOfLine:) with:sender];
 }
 
 - (void)moveToEndOfParagraph:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveToEndOfParagraph:) with:sender];
+    [self _performResponderOperation:@selector(moveToEndOfParagraph:) with:sender];
 }
 
 - (void)moveUp:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectUp granularity:WebSelectByCharacter];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveUp:) with:sender];
+    [self _performResponderOperation:@selector(moveUp:) with:sender];
 }
 
 - (void)moveUpAndModifySelection:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectUp granularity:WebSelectByCharacter];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveUpAndModifySelection:) with:sender];
+    [self _performResponderOperation:@selector(moveUpAndModifySelection:) with:sender];
 }
 
 - (void)moveWordBackward:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectBackward granularity:WebSelectByWord];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveWordBackward:) with:sender];
+    [self _performResponderOperation:@selector(moveWordBackward:) with:sender];
 }
 
 - (void)moveWordBackwardAndModifySelection:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectBackward granularity:WebSelectByWord];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveWordBackwardAndModifySelection:) with:sender];
+    [self _performResponderOperation:@selector(moveWordBackwardAndModifySelection:) with:sender];
 }
 
 - (void)moveWordForward:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectForward granularity:WebSelectByWord];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveWordForward:) with:sender];
+    [self _performResponderOperation:@selector(moveWordForward:) with:sender];
 }
 
 - (void)moveWordForwardAndModifySelection:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectForward granularity:WebSelectByWord];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveWordForwardAndModifySelection:) with:sender];
+    [self _performResponderOperation:@selector(moveWordForwardAndModifySelection:) with:sender];
 }
 
 - (void)moveWordLeft:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectLeft granularity:WebSelectByWord];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveWordLeft:) with:sender];
+    [self _performResponderOperation:@selector(moveWordLeft:) with:sender];
 }
 
 - (void)moveWordLeftAndModifySelection:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectLeft granularity:WebSelectByWord];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveWordLeftAndModifySelection:) with:sender];
+    [self _performResponderOperation:@selector(moveWordLeftAndModifySelection:) with:sender];
 }
 
 - (void)moveWordRight:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByMoving direction:WebSelectRight granularity:WebSelectByWord];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveWordRight:) with:sender];
+    [self _performResponderOperation:@selector(moveWordRight:) with:sender];
 }
 
 - (void)moveWordRightAndModifySelection:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self _alterCurrentSelection:WebSelectByExtending direction:WebSelectRight granularity:WebSelectByWord];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(moveWordRightAndModifySelection:) with:sender];
+    [self _performResponderOperation:@selector(moveWordRightAndModifySelection:) with:sender];
 }
 
 - (void)pageDown:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(pageDown:) with:sender];
+    [self _performResponderOperation:@selector(pageDown:) with:sender];
 }
 
 - (void)pageUp:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(pageUp:) with:sender];
+    [self _performResponderOperation:@selector(pageUp:) with:sender];
 }
 
 - (void)scrollLineDown:(id)sender
 {
-    [self _performResponderOperation:@selector(scrollLineDown:) sender:sender];
+    [self _performResponderOperation:@selector(scrollLineDown:) with:sender];
 }
 
 - (void)scrollLineUp:(id)sender
 {
-    [self _performResponderOperation:@selector(scrollLineUp:) sender:sender];
+    [self _performResponderOperation:@selector(scrollLineUp:) with:sender];
 }
 
 - (void)scrollPageDown:(id)sender
 {
-    [self _performResponderOperation:@selector(scrollPageDown:) sender:sender];
+    [self _performResponderOperation:@selector(scrollPageDown:) with:sender];
 }
 
 - (void)scrollPageUp:(id)sender
 {
-    [self _performResponderOperation:@selector(scrollPageUp:) sender:sender];
+    [self _performResponderOperation:@selector(scrollPageUp:) with:sender];
 }
 
-
-    /* Selections */
-
 - (void)selectAll:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(selectAll:) with:sender];
+    [self _performResponderOperation:@selector(selectAll:) with:sender];
 }
 
 - (void)selectParagraph:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(selectParagraph:) with:sender];
+    [self _performResponderOperation:@selector(selectParagraph:) with:sender];
 }
 
 - (void)selectLine:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(selectLine:) with:sender];
+    [self _performResponderOperation:@selector(selectLine:) with:sender];
 }
 
 - (void)selectWord:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(selectWord:) with:sender];
+    [self _performResponderOperation:@selector(selectWord:) with:sender];
 }
 
-
-    /* "Edit menu" actions */
-
 - (void)copy:(id)sender
 {
-    [self _performResponderOperation:@selector(copy:) sender:sender];
+    [self _performResponderOperation:@selector(copy:) with:sender];
 }
 
 - (void)cut:(id)sender
 {
-    [self _performResponderOperation:@selector(cut:) sender:sender];
+    [self _performResponderOperation:@selector(cut:) with:sender];
 }
 
 - (void)paste:(id)sender
 {
-    [self _performResponderOperation:@selector(paste:) sender:sender];
+    [self _performResponderOperation:@selector(paste:) with:sender];
 }
 
 - (void)copyFont:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(copyFont:) with:sender];
+    [self _performResponderOperation:@selector(copyFont:) with:sender];
 }
 
 - (void)pasteFont:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(pasteFont:) with:sender];
+    [self _performResponderOperation:@selector(pasteFont:) with:sender];
 }
 
 - (void)delete:(id)sender
 {
-    [self _performResponderOperation:@selector(delete:) sender:sender];
+    [self _performResponderOperation:@selector(delete:) with:sender];
 }
 
 - (void)pasteAsPlainText:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        id <WebDocumentView> view = [[[self mainFrame] frameView] documentView];
-        if ([view isKindOfClass:[WebHTMLView class]]) {
-            NSString *text = [[NSPasteboard generalPasteboard] stringForType:NSStringPboardType];
-            if ([[self _editingDelegateForwarder] webView:self shouldInsertText:text replacingDOMRange:[self selectedDOMRange] givenAction:WebViewInsertActionPasted]) {
-                [[self _bridgeForCurrentSelection] replaceSelectionWithText:text selectReplacement:NO];
-            }
-        }
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(pasteAsPlainText:) with:sender];
+    [self _performResponderOperation:@selector(pasteAsPlainText:) with:sender];
 }
 
 - (void)pasteAsRichText:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(pasteAsRichText:) with:sender];
+    [self _performResponderOperation:@selector(pasteAsRichText:) with:sender];
 }
 
-
-    /* Fonts */
-
 - (void)changeFont:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(changeFont:) with:sender];
+    [self _performResponderOperation:@selector(changeFont:) with:sender];
 }
 
 - (void)changeAttributes:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(changeAttributes:) with:sender];
+    [self _performResponderOperation:@selector(changeAttributes:) with:sender];
 }
 
 - (void)changeDocumentBackgroundColor:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(changeDocumentBackgroundColor:) with:sender];
+    [self _performResponderOperation:@selector(changeDocumentBackgroundColor:) with:sender];
 }
 
-
-    /* Colors */
-
 - (void)changeColor:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(changeColor:) with:sender];
+    [self _performResponderOperation:@selector(changeColor:) with:sender];
 }
 
-
-	/* Alignment */
-
 - (void)alignCenter:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(alignCenter:) with:sender];
+    [self _performResponderOperation:@selector(alignCenter:) with:sender];
 }
 
 - (void)alignJustified:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(alignJustified:) with:sender];
+    [self _performResponderOperation:@selector(alignJustified:) with:sender];
 }
 
 - (void)alignLeft:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(alignLeft:) with:sender];
+    [self _performResponderOperation:@selector(alignLeft:) with:sender];
 }
 
 - (void)alignRight:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(alignRight:) with:sender];
+    [self _performResponderOperation:@selector(alignRight:) with:sender];
 }
 
-
-    /* Insertions and Indentations */
-
 - (void)indent:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(indent:) with:sender];
+    [self _performResponderOperation:@selector(indent:) with:sender];
 }
 
 - (void)insertTab:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        id <WebDocumentView> view = [[[self mainFrame] frameView] documentView];
-        if ([view isKindOfClass:[WebHTMLView class]]) {
-            if ([[self _editingDelegateForwarder] webView:self shouldInsertText:@"\t" replacingDOMRange:[self selectedDOMRange] givenAction:WebViewInsertActionPasted]) {
-                [[self _bridgeForCurrentSelection] replaceSelectionWithText:@"\t" selectReplacement:NO];
-            }
-        }
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(insertTab:) with:sender];
+    [self _performResponderOperation:@selector(insertTab:) with:sender];
 }
 
 - (void)insertBacktab:(id)sender
 {
-    // Doing nothing matches normal NSTextView behavior. If we ever use WebView for a field-editor-type purpose
-    // we might add code here.
-    [self _performResponderOperation:@selector(insertBacktab:) sender:sender];
+    [self _performResponderOperation:@selector(insertBacktab:) with:sender];
 }
 
 - (void)insertNewline:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        // Perhaps we should make this delegate call sensitive to the real DOM operation we actually do.
-        if ([[self _editingDelegateForwarder] webView:self shouldInsertText:@"\n" replacingDOMRange:[self selectedDOMRange] givenAction:WebViewInsertActionTyped]) {
-            WebBridge *bridge = [self _bridgeForCurrentSelection];
-            [bridge replaceSelectionWithNewline];
-            [bridge ensureCaretVisible];
-        }
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(insertNewline:) with:sender];
+    [self _performResponderOperation:@selector(insertNewline:) with:sender];
 }
 
 - (void)insertParagraphSeparator:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(insertParagraphSeparator:) with:sender];
+    [self _performResponderOperation:@selector(insertParagraphSeparator:) with:sender];
 }
 
-
-    /* Case changes */
-
 - (void)changeCaseOfLetter:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(changeCaseOfLetter:) with:sender];
+    [self _performResponderOperation:@selector(changeCaseOfLetter:) with:sender];
 }
 
 - (void)uppercaseWord:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(uppercaseWord:) with:sender];
+    [self _performResponderOperation:@selector(uppercaseWord:) with:sender];
 }
 
 - (void)lowercaseWord:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(lowercaseWord:) with:sender];
+    [self _performResponderOperation:@selector(lowercaseWord:) with:sender];
 }
 
 - (void)capitalizeWord:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(capitalizeWord:) with:sender];
+    [self _performResponderOperation:@selector(capitalizeWord:) with:sender];
 }
 
-
-    /* Deletions */
-
 - (void)deleteForward:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(deleteForward:) with:sender];
+    [self _performResponderOperation:@selector(deleteForward:) with:sender];
 }
 
 - (void)deleteBackward:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        if ([[self _editingDelegateForwarder] webView:self shouldDeleteDOMRange:[self selectedDOMRange]]) {
-            WebBridge *bridge = [self _bridgeForCurrentSelection];
-            [bridge deleteKeyPressed];
-            [bridge ensureCaretVisible];
-        }
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(deleteBackward:) with:sender];
+    [self _performResponderOperation:@selector(deleteBackward:) with:sender];
 }
 
 - (void)deleteBackwardByDecomposingPreviousCharacter:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(deleteBackwardByDecomposingPreviousCharacter:) with:sender];
+    [self _performResponderOperation:@selector(deleteBackwardByDecomposingPreviousCharacter:) with:sender];
 }
 
 - (void)deleteWordForward:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self moveWordForwardAndModifySelection:sender];
-        [self delete:sender];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(deleteWordForward:) with:sender];
+    [self _performResponderOperation:@selector(deleteWordForward:) with:sender];
 }
 
 - (void)deleteWordBackward:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        [self moveWordBackwardAndModifySelection:sender];
-        [self delete:sender];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(deleteWordBackward:) with:sender];
+    [self _performResponderOperation:@selector(deleteWordBackward:) with:sender];
 }
 
 - (void)deleteToBeginningOfLine:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(deleteToBeginningOfLine:) with:sender];
+    [self _performResponderOperation:@selector(deleteToBeginningOfLine:) with:sender];
 }
 
 - (void)deleteToEndOfLine:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(deleteToEndOfLine:) with:sender];
+    [self _performResponderOperation:@selector(deleteToEndOfLine:) with:sender];
 }
 
 - (void)deleteToBeginningOfParagraph:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(deleteToBeginningOfParagraph:) with:sender];
+    [self _performResponderOperation:@selector(deleteToBeginningOfParagraph:) with:sender];
 }
 
 - (void)deleteToEndOfParagraph:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(deleteToEndOfParagraph:) with:sender];
+    [self _performResponderOperation:@selector(deleteToEndOfParagraph:) with:sender];
 }
 
-
-    /* Completion */
-
 - (void)complete:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(complete:) with:sender];
+    [self _performResponderOperation:@selector(complete:) with:sender];
 }
 
-
-    /* Spelling */
-
 - (void)checkSpelling:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(checkSpelling:) with:sender];
+    [self _performResponderOperation:@selector(checkSpelling:) with:sender];
 }
 
 - (void)showGuessPanel:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(showGuessPanel:) with:sender];
+    [self _performResponderOperation:@selector(showGuessPanel:) with:sender];
 }
 
-
-    /* Finding */
-    
 - (void)performFindPanelAction:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(performFindPanelAction:) with:sender];
+    [self _performResponderOperation:@selector(performFindPanelAction:) with:sender];
 }
 
-
-	/* Speech */
-
 - (void)startSpeaking:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(startSpeaking:) with:sender];
+    [self _performResponderOperation:@selector(startSpeaking:) with:sender];
 }
 
 - (void)stopSpeaking:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        ERROR("unimplemented");
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(stopSpeaking:) with:sender];
+    [self _performResponderOperation:@selector(stopSpeaking:) with:sender];
 }
 
-	/* Text input */
-
 - (void)insertText:(NSString *)text
 {
-    if ([self _currentSelectionIsEditable]) {
-        if ([[self _editingDelegateForwarder] webView:self shouldInsertText:text replacingDOMRange:[self selectedDOMRange] givenAction:WebViewInsertActionTyped]) {
-            WebBridge *bridge = [self _bridgeForCurrentSelection];
-            [bridge insertText:text];
-            [bridge ensureCaretVisible];
-        }
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(insertText:) with:text];
+    [self _performResponderOperation:@selector(insertText:) with:text];
 }
 
 @end
diff --git a/WebKit/WebView.subproj/WebViewInternal.h b/WebKit/WebView.subproj/WebViewInternal.h
index 40a18c3..b117f5f 100644
--- a/WebKit/WebView.subproj/WebViewInternal.h
+++ b/WebKit/WebView.subproj/WebViewInternal.h
@@ -3,7 +3,8 @@
 #import <WebKit/WebViewPrivate.h>
 
 @interface WebView (WebInternal)
-- (WebFrame *)_currentFrame;
+- (WebFrame *)_frameForCurrentSelection;
+- (WebBridge *)_bridgeForCurrentSelection;
 - (BOOL)_isLoading;
 - (void)_updateFontPanel;
 @end;

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list