[webkit-changes] cvs commit: WebKit/WebCoreSupport.subproj WebImageData.m

Darin darin at opensource.apple.com
Mon Sep 5 15:22:41 PDT 2005


darin       05/09/05 15:22:40

  Modified:    .        ChangeLog
               WebCoreSupport.subproj WebImageData.m
  Log:
          Reviewed by John Sullivan.
  
          - fixed http://bugzilla.opendarwin.org/show_bug.cgi?id=4357
            crash related to animated GIFs, reproducible in non-Safari WebKit application
  
          * WebCoreSupport.subproj/WebImageData.m:
          (removeAnimatingRendererFromView): Added.
          (removeFromDictionary): Added.
          (-[WebImageData removeAnimatingRenderer:]): Rewrote using CF functions rather than
          NS functions so that we never retain the views, since this can be called from
          a view's dealloc method.
          (setNeedsDisplayInAnimationRect): Added.
          (-[WebImageData _nextFrame:]): Rewrote as above, even though in this case it can't
          be called from the dealloc method.
  
  Revision  Changes    Path
  1.3308    +23 -6     WebKit/ChangeLog
  
  Index: ChangeLog
  ===================================================================
  RCS file: /cvs/root/WebKit/ChangeLog,v
  retrieving revision 1.3307
  retrieving revision 1.3308
  diff -u -r1.3307 -r1.3308
  --- ChangeLog	27 Aug 2005 00:03:33 -0000	1.3307
  +++ ChangeLog	5 Sep 2005 22:22:29 -0000	1.3308
  @@ -1,3 +1,20 @@
  +2005-09-05  Darin Adler  <darin at apple.com>
  +
  +        Reviewed by John Sullivan.
  +
  +        - fixed http://bugzilla.opendarwin.org/show_bug.cgi?id=4357
  +          crash related to animated GIFs, reproducible in non-Safari WebKit application
  +
  +        * WebCoreSupport.subproj/WebImageData.m:
  +        (removeAnimatingRendererFromView): Added.
  +        (removeFromDictionary): Added.
  +        (-[WebImageData removeAnimatingRenderer:]): Rewrote using CF functions rather than
  +        NS functions so that we never retain the views, since this can be called from
  +        a view's dealloc method.
  +        (setNeedsDisplayInAnimationRect): Added.
  +        (-[WebImageData _nextFrame:]): Rewrote as above, even though in this case it can't
  +        be called from the dealloc method.
  +
   2005-08-26  David Hyatt  <hyatt at apple.com>
   
   	Add support for a new scaling and tiling function so that border images from CSS3
  @@ -10500,10 +10517,10 @@
           Reviewed by Trey.
           
           Work on text-align API. Marked these bugs fixed:
  -        <rdar://problem/3655380>: (Editing:Ê-alignCenter:ÊmethodÊunimplementedÊ(WebKitÊeditingÊAPI))
  -        <rdar://problem/3655381>: (Editing:Ê-alignJustified:ÊmethodÊunimplementedÊ(WebKitÊeditingÊAPI))
  -        <rdar://problem/3655383>: (Editing:Ê-alignLeft:ÊmethodÊunimplementedÊ(WebKitÊeditingÊAPI))
  -        <rdar://problem/3655384>: (Editing:Ê-alignRight:ÊmethodÊunimplementedÊ(WebKitÊeditingÊAPI))        
  +        <rdar://problem/3655380>: (Editing: -alignCenter: method unimplemented (WebKit editing API))
  +        <rdar://problem/3655381>: (Editing: -alignJustified: method unimplemented (WebKit editing API))
  +        <rdar://problem/3655383>: (Editing: -alignLeft: method unimplemented (WebKit editing API))
  +        <rdar://problem/3655384>: (Editing: -alignRight: method unimplemented (WebKit editing API))        
           
           in favor of opening this bug:
           <rdar://problem/3675191>: (Editing: -alignLeft: and friends mostly implemented but not 
  @@ -10530,8 +10547,8 @@
   
           Reviewed by Ken.
           
  -        - fixed <rdar://problem/3655378>: (Editing:Ê-changeDocumentBackgroundColor:Ê
  -        methodÊunimplementedÊ(WebKitÊeditingÊAPI))
  +        - fixed <rdar://problem/3655378>: (Editing: -changeDocumentBackgroundColor: 
  +        method unimplemented (WebKit editing API))
           - made startSpeaking: actually work; previous implementation raised a DOMException
   
           * WebView.subproj/WebHTMLView.m:
  
  
  
  1.47      +56 -22    WebKit/WebCoreSupport.subproj/WebImageData.m
  
  Index: WebImageData.m
  ===================================================================
  RCS file: /cvs/root/WebKit/WebCoreSupport.subproj/WebImageData.m,v
  retrieving revision 1.46
  retrieving revision 1.47
  diff -u -r1.46 -r1.47
  --- WebImageData.m	27 Aug 2005 00:03:42 -0000	1.46
  +++ WebImageData.m	5 Sep 2005 22:22:40 -0000	1.47
  @@ -951,22 +951,53 @@
       [activeAnimations addObject:self];
   }
   
  +typedef struct {
  +    WebImageRenderer *renderer;
  +    CFMutableArrayRef viewsToRemove;
  +} RemoveRendererParameters;
  +
  +static void removeAnimatingRendererFromView(const void *key, const void *value, void *context)
  +{
  +    NSView *view = (NSView *)key;
  +    NSMutableSet *renderers = (NSMutableSet *)value;
  +    RemoveRendererParameters *parameters = (RemoveRendererParameters *)context;
  +    [renderers removeObject:parameters->renderer];
  +    if ([renderers count] == 0) {
  +        CFMutableArrayRef viewsToRemove = parameters->viewsToRemove;
  +        if (viewsToRemove == NULL) {
  +            viewsToRemove = CFArrayCreateMutable(NULL, 0, NULL);
  +            parameters->viewsToRemove = viewsToRemove;
  +        }
  +        CFArrayAppendValue(viewsToRemove, view);
  +    }
  +}
  +
  +static void removeFromDictionary(const void *value, void *context)
  +{
  +    CFMutableDictionaryRef dictionary = (CFMutableDictionaryRef)context;
  +    CFDictionaryRemoveValue(dictionary, value);
  +}
  +
   - (void)removeAnimatingRenderer:(WebImageRenderer *)r
   {
  -    NSEnumerator *viewEnumerator = [(NSMutableDictionary *)animatingRenderers keyEnumerator];
  -    NSView *view;
  -    while ((view = [viewEnumerator nextObject])) {
  -        NSMutableSet *renderers = (NSMutableSet *)CFDictionaryGetValue(animatingRenderers, view);
  -        [renderers removeObject:r];
  -        if ([renderers count] == 0) {
  -            CFDictionaryRemoveValue(animatingRenderers, view);
  +    // It's important not to do anything here to could retain the view, since this is called
  +    // from code to stop animations, which is called inside -[WebHTMLView dealloc].
  +    // Of course, that's also a design problem we'll have to fix eventually, since dealloc
  +    // doesn't happen at all when running with garbage collection.
  +    if (animatingRenderers) {
  +        RemoveRendererParameters parameters = { r, NULL };
  +        CFDictionaryApplyFunction(animatingRenderers, removeAnimatingRendererFromView, &parameters);
  +        CFMutableArrayRef viewsToRemove = parameters.viewsToRemove;
  +        if (viewsToRemove) {
  +            CFRange range = CFRangeMake(0, CFArrayGetCount(viewsToRemove));
  +            CFArrayApplyFunction(viewsToRemove, range, removeFromDictionary, animatingRenderers);
  +            CFRelease(viewsToRemove);
  +            if (CFDictionaryGetCount(animatingRenderers) == 0) {
  +                [activeAnimations removeObject:self];
  +                [self _stopAnimation];
  +            }
           }
       }
  -    
  -    if (animatingRenderers && CFDictionaryGetCount(animatingRenderers) == 0) {
  -        [activeAnimations removeObject:self];
  -        [self _stopAnimation];
  -    }
   }
   
   - (void)resetAnimation
  @@ -986,6 +1017,17 @@
       frameTimer = nil;
   }
   
  +static void setNeedsDisplayInAnimationRect(const void *key, const void *value, void *context)
  +{
  +    NSView *view = (NSView *)key;
  +    NSSet *renderers = (NSSet *)value;
  +    NSEnumerator *rendererEnumerator = [renderers objectEnumerator];
  +    WebImageRenderer *renderer;
  +    while ((renderer = [rendererEnumerator nextObject])) {
  +        [view setNeedsDisplayInRect:[renderer targetAnimationRect]];
  +    }
  +}
  +
   - (void)_nextFrame:(id)context
   {
       // Release the timer that just fired.
  @@ -1003,16 +1045,8 @@
           currentFrame = 0;
       }
       
  -    NSEnumerator *viewEnumerator = [(NSMutableDictionary *)animatingRenderers keyEnumerator];
  -    NSView *view;
  -    while ((view = [viewEnumerator nextObject])) {
  -        NSMutableSet *renderers = [(NSMutableDictionary *)animatingRenderers objectForKey:view];
  -        WebImageRenderer *renderer;
  -        NSEnumerator *rendererEnumerator = [renderers objectEnumerator];
  -        while ((renderer = [rendererEnumerator nextObject])) {
  -            [view setNeedsDisplayInRect:[renderer targetAnimationRect]];
  -        }
  -    }
  +    if (animatingRenderers)
  +        CFDictionaryApplyFunction(animatingRenderers, setNeedsDisplayInAnimationRect, NULL);
   }
   
   - (BOOL)shouldAnimate
  
  
  



More information about the webkit-changes mailing list