WebKit:
authorrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 15 Mar 2005 00:50:45 +0000 (00:50 +0000)
committerrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 15 Mar 2005 00:50:45 +0000 (00:50 +0000)
Fixed <rdar://problem/4027928> Tiger_8A394:Acrobat crashes while tried to remove the subscription errors by clicking on "Would you like to remove the subscription" from Tracker details view pane

The Acrobat application triggers loads of new documents in it's policy delegate.  This
ultimately causes the WebHTMLView to be released before their event handlers have
returned.  To bullet proof against this case we retain/release self before passing
the event on for further handling.

        Reviewed by Maciej.

        * WebView.subproj/WebHTMLView.m:
        (-[WebHTMLView _updateMouseoverWithEvent:]):
        (-[WebHTMLView scrollWheel:]):
        (-[WebHTMLView mouseDown:]):
        (-[WebHTMLView mouseDragged:]):
        (-[WebHTMLView mouseUp:]):
        (-[WebHTMLView keyDown:]):
        (-[WebHTMLView keyUp:]):
        (-[WebHTMLView performKeyEquivalent:]):

WebCore:
Fixed <rdar://problem/4027928> Tiger_8A394:Acrobat crashes while tried to remove the subscription errors by clicking on "Would you like to remove the subscription" from Tracker details view pane

A document may be deleted as a consequence of handling an event,
as was the case with Acrobat.app.  Ensure that the document is still valid
before passing the event on for further handling.

        * khtml/xml/dom_nodeimpl.cpp:
        (NodeImpl::dispatchUIEvent):

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/xml/dom_nodeimpl.cpp
WebKit/ChangeLog
WebKit/WebView.subproj/WebHTMLView.m

index eea82dd571e23def9c415bc509eef633d1d15122..7350cb26f3ea09e0e8da8068523e851cfbe5ddd9 100644 (file)
@@ -1,3 +1,14 @@
+2005-03-14  Richard Williamson   <rjw@apple.com>
+
+       Fixed <rdar://problem/4027928> Tiger_8A394:Acrobat crashes while tried to remove the subscription errors by clicking on "Would you like to remove the subscription" from Tracker details view pane
+
+       A document may be deleted as a consequence of handling an event,
+       as was the case with Acrobat.app.  Ensure that the document is still valid
+       before passing the event on for further handling.
+
+        * khtml/xml/dom_nodeimpl.cpp:
+        (NodeImpl::dispatchUIEvent):
+
 2005-03-14  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by me
index 064262527b260c41bb1f107e66854f4bd6408fba..5c554e863bc3cad20e56a6f3f98a8b36c74ad899 100644 (file)
@@ -791,9 +791,12 @@ bool NodeImpl::dispatchUIEvent(int _id, int detail)
         cancelable = true;
 
     int exceptioncode = 0;
-    UIEventImpl *evt = new UIEventImpl(static_cast<EventImpl::EventId>(_id),true,
-                                       cancelable,getDocument()->defaultView(),detail);
-    return dispatchEvent(evt,exceptioncode,true);
+    if (getDocument()) {
+        UIEventImpl *evt = new UIEventImpl(static_cast<EventImpl::EventId>(_id),true,
+                                           cancelable,getDocument()->defaultView(),detail);
+        return dispatchEvent(evt,exceptioncode,true);
+    }
+    return false;
 }
 
 void NodeImpl::registerNodeList(NodeListImpl *list)
index 86ee7570c5d9170bdc38ffd70b1dbaba82cd74a5..0fbdd256e59a1eb6ac2eeb37facb839c0cfaab14 100644 (file)
@@ -1,3 +1,24 @@
+2005-03-14  Richard Williamson   <rjw@apple.com>
+
+       Fixed <rdar://problem/4027928> Tiger_8A394:Acrobat crashes while tried to remove the subscription errors by clicking on "Would you like to remove the subscription" from Tracker details view pane
+
+       The Acrobat application triggers loads of new documents in it's policy delegate.  This
+       ultimately causes the WebHTMLView to be released before their event handlers have
+       returned.  To bullet proof against this case we retain/release self before passing
+       the event on for further handling.
+       
+        Reviewed by Maciej.
+
+        * WebView.subproj/WebHTMLView.m:
+        (-[WebHTMLView _updateMouseoverWithEvent:]):
+        (-[WebHTMLView scrollWheel:]):
+        (-[WebHTMLView mouseDown:]):
+        (-[WebHTMLView mouseDragged:]):
+        (-[WebHTMLView mouseUp:]):
+        (-[WebHTMLView keyDown:]):
+        (-[WebHTMLView keyUp:]):
+        (-[WebHTMLView performKeyEquivalent:]):
+
 2005-03-14  Vicki Murley  <vicki@apple.com>
 
        - roll out the fix for 4040321, since it is still pending CCC review.
index e4c6453076a764e65144bd0de08cc1b7719cb906..bf72b39d55ae814769c9099167502f33bd772ad5 100644 (file)
@@ -969,6 +969,8 @@ static WebHTMLView *lastHitView = nil;
 
 - (void)_updateMouseoverWithEvent:(NSEvent *)event
 {
+    [self retain];
+    
     WebHTMLView *view = nil;
     if ([event window] == [self window]) {
         NSView *hitView = [self _hitViewForEvent:event];
@@ -1023,6 +1025,8 @@ static WebHTMLView *lastHitView = nil;
         newToolTip = [element objectForKey:WebCoreElementTitleKey];
     }
     [self _setToolTip:newToolTip];
+    
+    [self release];
 }
 
 + (NSArray *)_insertablePasteboardTypes
@@ -2542,9 +2546,13 @@ static WebHTMLView *lastHitView = nil;
 
 - (void)scrollWheel:(NSEvent *)event
 {
+    [self retain];
+    
     if (![[self _bridge] scrollOverflowWithScrollWheelEvent:event]) {
         [[self nextResponder] scrollWheel:event];
     }    
+    
+    [self release];
 }
 
 - (BOOL)_isSelectionEvent:(NSEvent *)event
@@ -2600,6 +2608,8 @@ static WebHTMLView *lastHitView = nil;
 
 - (void)mouseDown:(NSEvent *)event
 {
+    [self retain];
+
     _private->handlingMouseDownEvent = YES;
 
     // Record the mouse down position so we can determine drag hysteresis.
@@ -2630,6 +2640,8 @@ static WebHTMLView *lastHitView = nil;
     _private->firstResponderAtMouseDownTime = nil;
 
     _private->handlingMouseDownEvent = NO;
+    
+    [self release];
 }
 
 - (void)dragImage:(NSImage *)dragImage
@@ -2653,6 +2665,8 @@ static WebHTMLView *lastHitView = nil;
 
 - (void)mouseDragged:(NSEvent *)event
 {
+    [self retain];
+    
     // TEXTINPUT: if there is marked text and the current input
     // manager wants to handle mouse events, we need to make sure to
     // pass it to them.
@@ -2660,6 +2674,8 @@ static WebHTMLView *lastHitView = nil;
     if (!_private->ignoringMouseDraggedEvents) {
         [[self _bridge] mouseDragged:event];
     }
+    
+    [self release];
 }
 
 - (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal
@@ -2878,9 +2894,13 @@ static WebHTMLView *lastHitView = nil;
     // manager wants to handle mouse events, we need to make sure to
     // pass it to them.
 
+    [self retain];
+    
     [self _stopAutoscrollTimer];
     [[self _bridge] mouseUp:event];
     [self _updateMouseoverWithFakeEvent];
+
+    [self release];
 }
 
 - (void)mouseMovedNotification:(NSNotification *)notification
@@ -3184,6 +3204,8 @@ static WebHTMLView *lastHitView = nil;
 
 - (void)keyDown:(NSEvent *)event
 {
+    [self retain];
+
     BOOL callSuper = NO;
 
     _private->keyDownEvent = event;
@@ -3210,13 +3232,19 @@ static WebHTMLView *lastHitView = nil;
     }
 
     _private->keyDownEvent = nil;
+    
+    [self release];
 }
 
 - (void)keyUp:(NSEvent *)event
 {
+    [self retain];
+    
     if (![[self _bridge] interceptKeyEvent:event toView:self]) {
         [super keyUp:event];
     }
+    
+    [self release];
 }
 
 - (id)accessibilityAttributeValue:(NSString*)attributeName
@@ -3763,15 +3791,25 @@ static WebHTMLView *lastHitView = nil;
         return YES;
     }
     
+    BOOL ret;
+    
+    [self retain];
+    
     // Pass command-key combos through WebCore if there is a key binding available for
     // this event. This lets web pages have a crack at intercepting command-modified keypresses.
     // But don't do it if we have already handled the event.
     if (event != _private->keyDownEvent
             && [self _web_firstResponderIsSelfOrDescendantView]
             && [[self _bridge] interceptKeyEvent:event toView:self]) {
-        return YES;
+        
+        ret = YES;
     }
-    return [super performKeyEquivalent:event];
+    else
+        ret = [super performKeyEquivalent:event];
+    
+    [self release];
+    
+    return ret;
 }
 
 - (void)copyFont:(id)sender