[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:37 UTC 2009


The following commit has been merged in the debian/unstable branch:
commit e47bb12fd17a6983f255edfb34121656ee756518
Author: darin <darin at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Tue May 25 00:25:03 2004 +0000

            Reviewed by Ken.
    
            - fixed <rdar://problem/3666022>: (REGRESSION: crash from infinite regress in -[WebFrameView(WebPrivate) scrollPageDown:])
    
            * WebView.subproj/WebView.m:
            (-[WebView _performResponderOperation:sender:]): Helper method that knows how to pass on operations
            to the responder chain, allowing us to implement operations that will get passed to views inside
            us as necessary. Moved a few methods to this, and soon will move even more.
            (-[WebView scrollLineDown:]): Use the above method.
            (-[WebView scrollLineUp:]): Ditto.
            (-[WebView scrollPageDown:]): Ditto.
            (-[WebView scrollPageUp:]): Ditto.
            (-[WebView copy:]): Ditto.
            (-[WebView cut:]): Ditto.
            (-[WebView paste:]): Ditto.
            (-[WebView delete:]): Ditto.
            (-[WebView insertBacktab:]): Ditto.
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@6680 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit/ChangeLog b/WebKit/ChangeLog
index 41c8f97..ee99ccf 100644
--- a/WebKit/ChangeLog
+++ b/WebKit/ChangeLog
@@ -1,3 +1,23 @@
+2004-05-24  Darin Adler  <darin at apple.com>
+
+        Reviewed by Ken.
+
+        - fixed <rdar://problem/3666022>: (REGRESSION: crash from infinite regress in -[WebFrameView(WebPrivate) scrollPageDown:])
+
+        * WebView.subproj/WebView.m:
+        (-[WebView _performResponderOperation:sender:]): Helper method that knows how to pass on operations
+        to the responder chain, allowing us to implement operations that will get passed to views inside
+        us as necessary. Moved a few methods to this, and soon will move even more.
+        (-[WebView scrollLineDown:]): Use the above method.
+        (-[WebView scrollLineUp:]): Ditto.
+        (-[WebView scrollPageDown:]): Ditto.
+        (-[WebView scrollPageUp:]): Ditto.
+        (-[WebView copy:]): Ditto.
+        (-[WebView cut:]): Ditto.
+        (-[WebView paste:]): Ditto.
+        (-[WebView delete:]): Ditto.
+        (-[WebView insertBacktab:]): Ditto.
+
 2004-05-24  Chris Blumenberg  <cblu at apple.com>
 
 	Improved editing via drag
diff --git a/WebKit/WebView.subproj/WebView.m b/WebKit/WebView.subproj/WebView.m
index 7e7b740..ddd04b7 100644
--- a/WebKit/WebView.subproj/WebView.m
+++ b/WebKit/WebView.subproj/WebView.m
@@ -2595,6 +2595,38 @@ static NSFont *_fontFromStyle(DOMCSSStyleDeclaration *style)
 */
 @implementation WebView (WebViewEditingActions)
 
+- (void)_performResponderOperation:(SEL)selector sender:(id)sender
+{
+    static BOOL reentered = NO;
+    if (reentered) {
+        [[self nextResponder] tryToPerform:selector with:sender];
+        return;
+    }
+
+    // There are two possibilities here.
+    //
+    // One is that WebView has been called in its role as part of the responder chain.
+    // In that case, it's fine to call the first responder and end up calling down the
+    // responder chain again. Later we will return here with reentered = YES and continue
+    // past the WebView.
+    //
+    // The other is that we are being called directly, in which case we want to pass the
+    // selector down to the view inside us that can handle it, and continue down the
+    // responder chain as usual.
+
+    // Pass this selector down to the first responder.
+    NSResponder *responder = [[self window] firstResponder];
+    if (!responder || ![responder isKindOfClass:[NSView class]] || ![(NSView *)responder isDescendantOf:self]) {
+        responder = [[[self mainFrame] frameView] documentView];
+        if (!responder) {
+            responder = [[self mainFrame] frameView];
+        }
+    }
+    reentered = YES;
+    [responder tryToPerform:selector with:sender];
+    reentered = NO;
+}
+
 - (void)centerSelectionInVisibleArea:(id)sender
 {
     if ([self _currentSelectionIsEditable]) {
@@ -2859,42 +2891,22 @@ static NSFont *_fontFromStyle(DOMCSSStyleDeclaration *style)
 
 - (void)scrollLineDown:(id)sender
 {
-    WebFrameView *frameView = [[self mainFrame] frameView];
-    if (frameView) {
-        [frameView scrollLineDown:sender];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(scrollLineDown:) with:sender];
+    [self _performResponderOperation:@selector(scrollLineDown:) sender:sender];
 }
 
 - (void)scrollLineUp:(id)sender
 {
-    WebFrameView *frameView = [[self mainFrame] frameView];
-    if (frameView) {
-        [frameView scrollLineUp:sender];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(scrollLineUp:) with:sender];
+    [self _performResponderOperation:@selector(scrollLineUp:) sender:sender];
 }
 
 - (void)scrollPageDown:(id)sender
 {
-    WebFrameView *frameView = [[self mainFrame] frameView];
-    if (frameView) {
-        [frameView scrollPageDown:sender];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(scrollPageDown:) with:sender];
+    [self _performResponderOperation:@selector(scrollPageDown:) sender:sender];
 }
 
 - (void)scrollPageUp:(id)sender
 {
-    WebFrameView *frameView = [[self mainFrame] frameView];
-    if (frameView) {
-        [frameView scrollPageUp:sender];
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(scrollPageUp:) with:sender];
+    [self _performResponderOperation:@selector(scrollPageUp:) sender:sender];
 }
 
 
@@ -2941,38 +2953,17 @@ static NSFont *_fontFromStyle(DOMCSSStyleDeclaration *style)
 
 - (void)copy:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        id <WebDocumentView> view = [[[self mainFrame] frameView] documentView];
-        if ([view isKindOfClass:[WebHTMLView class]]) {
-            [(WebHTMLView *)view copy:nil];
-        }
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(copy:) with:sender];
+    [self _performResponderOperation:@selector(copy:) sender:sender];
 }
 
 - (void)cut:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        id <WebDocumentView> view = [[[self mainFrame] frameView] documentView];
-        if ([view isKindOfClass:[WebHTMLView class]]) {
-            [(WebHTMLView *)view cut:nil];
-        }
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(cut:) with:sender];
+    [self _performResponderOperation:@selector(cut:) sender:sender];
 }
 
 - (void)paste:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        id <WebDocumentView> view = [[[self mainFrame] frameView] documentView];
-        if ([view isKindOfClass:[WebHTMLView class]]) {
-            [(WebHTMLView *)view paste:nil];
-        }
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(paste:) with:sender];
+    [self _performResponderOperation:@selector(paste:) sender:sender];
 }
 
 - (void)copyFont:(id)sender
@@ -2995,14 +2986,7 @@ static NSFont *_fontFromStyle(DOMCSSStyleDeclaration *style)
 
 - (void)delete:(id)sender
 {
-    if ([self _currentSelectionIsEditable]) {
-        id <WebDocumentView> view = [[[self mainFrame] frameView] documentView];
-        if ([view isKindOfClass:[WebHTMLView class]]) {
-            [(WebHTMLView *)view delete:nil];
-        }
-        return;
-    }
-    [[self nextResponder] tryToPerform:@selector(delete:) with:sender];
+    [self _performResponderOperation:@selector(delete:) sender:sender];
 }
 
 - (void)pasteAsPlainText:(id)sender
@@ -3140,7 +3124,7 @@ static NSFont *_fontFromStyle(DOMCSSStyleDeclaration *style)
 {
     // Doing nothing matches normal NSTextView behavior. If we ever use WebView for a field-editor-type purpose
     // we might add code here.
-    [[self nextResponder] tryToPerform:@selector(insertBacktab:) with:sender];
+    [self _performResponderOperation:@selector(insertBacktab:) sender:sender];
 }
 
 - (void)insertNewline:(id)sender

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list