Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(451)

Unified Diff: ui/gfx/render_text_mac.cc

Issue 10808084: Fix memory leaks in RenderTextMac. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/gfx/render_text_mac.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/render_text_mac.cc
===================================================================
--- ui/gfx/render_text_mac.cc (revision 147870)
+++ ui/gfx/render_text_mac.cc (working copy)
@@ -155,6 +155,7 @@
void RenderTextMac::ResetLayout() {
line_.reset();
+ attributes_.reset();
runs_.clear();
runs_valid_ = false;
}
@@ -172,7 +173,8 @@
const void* keys[] = { kCTFontAttributeName };
const void* values[] = { ct_font };
base::mac::ScopedCFTypeRef<CFDictionaryRef> attributes(
- CFDictionaryCreate(NULL, keys, values, arraysize(keys), NULL, NULL));
+ CFDictionaryCreate(NULL, keys, values, arraysize(keys), NULL,
+ &kCFTypeDictionaryValueCallBacks));
base::mac::ScopedCFTypeRef<CFStringRef> cf_text(
base::SysUTF16ToCFStringRef(text()));
@@ -228,6 +230,11 @@
void RenderTextMac::ApplyStyles(CFMutableAttributedStringRef attr_string,
CTFontRef font) {
+ // Clear attributes and reserve space to hold the maximum number of entries,
+ // which is at most three per style range per the code below.
+ attributes_.reset(CFArrayCreateMutable(NULL, 3 * style_ranges().size(),
+ &kCFTypeArrayCallBacks));
+
// https://developer.apple.com/library/mac/#documentation/Carbon/Reference/CoreText_StringAttributes_Ref/Reference/reference.html
for (size_t i = 0; i < style_ranges().size(); ++i) {
const StyleRange& style = style_ranges()[i];
@@ -235,23 +242,24 @@
style.range.length());
// Note: CFAttributedStringSetAttribute() does not appear to retain the
- // values passed in, as can be verified via CFGetRetainCount().
- //
- // TODO(asvitkine): The attributed string appears to hold weak refs to these
- // objects (it does not release them either), so we need to keep track of
- // them ourselves and release them at an appropriate time.
+ // values passed in, as can be verified via CFGetRetainCount(). To ensure
+ // the attribute objects do not leak, they are saved to |attributes_|.
- CGColorRef foreground = gfx::SkColorToCGColorRef(style.foreground);
+ base::mac::ScopedCFTypeRef<CGColorRef> foreground(
+ gfx::CGColorCreateFromSkColor(style.foreground));
CFAttributedStringSetAttribute(attr_string, range,
kCTForegroundColorAttributeName,
foreground);
+ CFArrayAppendValue(attributes_, foreground);
if (style.underline) {
CTUnderlineStyle value = kCTUnderlineStyleSingle;
- CFNumberRef underline = CFNumberCreate(NULL, kCFNumberSInt32Type, &value);
+ base::mac::ScopedCFTypeRef<CFNumberRef> underline(
+ CFNumberCreate(NULL, kCFNumberSInt32Type, &value));
CFAttributedStringSetAttribute(attr_string, range,
kCTUnderlineStyleAttributeName,
underline);
+ CFArrayAppendValue(attributes_, underline);
}
if (style.font_style & (Font::BOLD | Font::ITALIC)) {
@@ -260,12 +268,13 @@
traits |= kCTFontBoldTrait;
if (style.font_style & Font::ITALIC)
traits |= kCTFontItalicTrait;
- CTFontRef styled_font =
- CTFontCreateCopyWithSymbolicTraits(font, 0.0, NULL, traits, traits);
+ base::mac::ScopedCFTypeRef<CTFontRef> styled_font(
+ CTFontCreateCopyWithSymbolicTraits(font, 0.0, NULL, traits, traits));
// TODO(asvitkine): Handle |styled_font| == NULL case better.
if (styled_font) {
CFAttributedStringSetAttribute(attr_string, range, kCTFontAttributeName,
styled_font);
+ CFArrayAppendValue(attributes_, styled_font);
}
}
}
« no previous file with comments | « ui/gfx/render_text_mac.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698