[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, ¶meters);
+ 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