Fix memory leak in ANSCI parsing code

We do not have ARC enabled.
This commit is contained in:
Cheng Zhao 2017-11-28 16:18:07 +09:00
parent 4ded79801f
commit c9acccaddc
5 changed files with 49 additions and 38 deletions

View file

@ -4,8 +4,8 @@
// Use of this source code is governed by the MIT license that can be // Use of this source code is governed by the MIT license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef ATOM_BROWSER_UI_COCOA_NSCOLOR+HEX_H_ #ifndef ATOM_BROWSER_UI_COCOA_NSCOLOR_HEX_H_
#define ATOM_BROWSER_UI_COCOA_NSCOLOR+HEX_H_ #define ATOM_BROWSER_UI_COCOA_NSCOLOR_HEX_H_
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>

View file

@ -9,7 +9,6 @@
@implementation NSColor (Hex) @implementation NSColor (Hex)
+ (NSColor*)colorWithHexColorString:(NSString*)inColorString { + (NSColor*)colorWithHexColorString:(NSString*)inColorString {
NSColor* result = nil;
unsigned colorCode = 0; unsigned colorCode = 0;
unsigned char redByte, greenByte, blueByte; unsigned char redByte, greenByte, blueByte;

View file

@ -10,10 +10,8 @@
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
@interface NSString(ANSI) @interface NSString(ANSI)
- (BOOL)containsANSICodes; - (BOOL)containsANSICodes;
- (NSMutableAttributedString*)attributedStringParsingANSICodes; - (NSMutableAttributedString*)attributedStringParsingANSICodes;
@end @end
#endif // ATOM_BROWSER_UI_COCOA_NSSTRING_ANSI_H_ #endif // ATOM_BROWSER_UI_COCOA_NSSTRING_ANSI_H_

View file

@ -4,9 +4,9 @@
// Use of this source code is governed by the MIT license that can be // Use of this source code is governed by the MIT license that can be
// found in the LICENSE file. // found in the LICENSE file.
#import "Cocoa/Cocoa.h" #include "atom/browser/ui/cocoa/NSString+ANSI.h"
#import "NSString+ANSI.h" #include "atom/browser/ui/cocoa/NSColor+Hex.h"
#import "NSColor+Hex.h" #include "base/mac/scoped_nsobject.h"
@implementation NSMutableDictionary (ANSI) @implementation NSMutableDictionary (ANSI)
@ -112,9 +112,12 @@
- (NSMutableAttributedString*)attributedStringParsingANSICodes { - (NSMutableAttributedString*)attributedStringParsingANSICodes {
NSMutableAttributedString* result = [[NSMutableAttributedString alloc] init]; NSMutableAttributedString* result = [[NSMutableAttributedString alloc] init];
NSMutableDictionary* attributes = [NSMutableDictionary.alloc init]; base::scoped_nsobject<NSMutableDictionary> attributes(
[[NSMutableDictionary alloc] init]);
NSArray* parts = [self componentsSeparatedByString:@"\\033["]; NSArray* parts = [self componentsSeparatedByString:@"\\033["];
[result appendAttributedString:[NSAttributedString.alloc initWithString:parts.firstObject attributes:nil]]; [result appendAttributedString:[[[NSAttributedString alloc]
initWithString:parts.firstObject
attributes:nil] autorelease]];
for (NSString* part in [parts subarrayWithRange:NSMakeRange(1, parts.count - 1)]) { for (NSString* part in [parts subarrayWithRange:NSMakeRange(1, parts.count - 1)]) {
if (part.length == 0) if (part.length == 0)
@ -124,17 +127,20 @@
NSString* text = sequence.lastObject; NSString* text = sequence.lastObject;
if (sequence.count < 2) { if (sequence.count < 2) {
[result appendAttributedString:[NSAttributedString.alloc initWithString:text attributes:attributes]]; [result appendAttributedString:[[[NSAttributedString alloc]
initWithString:text
attributes:attributes] autorelease]];
} else if (sequence.count >= 2) { } else if (sequence.count >= 2) {
text = [[sequence subarrayWithRange:NSMakeRange(1, sequence.count - 1)] componentsJoinedByString:@"m"]; text = [[sequence subarrayWithRange:NSMakeRange(1, sequence.count - 1)]
componentsJoinedByString:@"m"];
[attributes modifyAttributesForANSICodes:sequence[0]]; [attributes modifyAttributesForANSICodes:sequence[0]];
[result appendAttributedString:[NSAttributedString.alloc initWithString:text attributes:attributes]]; [result appendAttributedString:[[[NSAttributedString alloc]
initWithString:text
attributes:attributes] autorelease]];
} }
} }
return result; return result;
} }
@end @end

View file

@ -5,12 +5,12 @@
#include "atom/browser/ui/tray_icon_cocoa.h" #include "atom/browser/ui/tray_icon_cocoa.h"
#include "atom/browser/ui/cocoa/atom_menu_controller.h" #include "atom/browser/ui/cocoa/atom_menu_controller.h"
#include "atom/browser/ui/cocoa/NSString+ANSI.h"
#include "base/strings/sys_string_conversions.h" #include "base/strings/sys_string_conversions.h"
#include "ui/events/cocoa/cocoa_event_utils.h" #include "ui/events/cocoa/cocoa_event_utils.h"
#include "ui/gfx/image/image.h" #include "ui/gfx/image/image.h"
#include "ui/gfx/mac/coordinate_conversion.h" #include "ui/gfx/mac/coordinate_conversion.h"
#include "ui/display/screen.h" #include "ui/display/screen.h"
#include "atom/browser/ui/cocoa/NSString+ANSI.h"
namespace { namespace {
@ -122,8 +122,8 @@ const CGFloat kVerticalTitleMargin = 2;
NSRect titleDrawRect = NSMakeRect( NSRect titleDrawRect = NSMakeRect(
[self iconWidth], -kVerticalTitleMargin, [self titleWidth], thickness); [self iconWidth], -kVerticalTitleMargin, [self titleWidth], thickness);
NSAttributedString* titleParsed = [self attributedTitleWithParams:title_]; base::scoped_nsobject<NSAttributedString> titleParsed(
[self attributedTitleWithParams:title_]);
[titleParsed drawInRect:titleDrawRect]; [titleParsed drawInRect:titleDrawRect];
} }
} }
@ -174,10 +174,13 @@ const CGFloat kVerticalTitleMargin = 2;
// The width of the title. // The width of the title.
- (CGFloat)titleWidth { - (CGFloat)titleWidth {
if (!title_) if (!title_)
return 0; return 0;
if (ANSI_) if (ANSI_) {
return [[title_ attributedStringParsingANSICodes] size].width + 10; base::scoped_nsobject<NSMutableAttributedString> attributedTitle(
[title_ attributedStringParsingANSICodes]);
return [attributedTitle size].width + 10;
}
base::scoped_nsobject<NSAttributedString> attributes( base::scoped_nsobject<NSAttributedString> attributes(
[[NSAttributedString alloc] initWithString:title_ [[NSAttributedString alloc] initWithString:title_
@ -226,25 +229,30 @@ const CGFloat kVerticalTitleMargin = 2;
} }
- (NSAttributedString*) attributedTitleWithParams:(NSString *)fullTitle { - (NSAttributedString*)attributedTitleWithParams:(NSString*)fullTitle {
fullTitle = [fullTitle stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceCharacterSet]; NSString* title = [fullTitle
NSString * title = fullTitle; stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSDictionary* attributes =
[self titleAttributesWithHighlight:[self isHighlighted]];
NSDictionary* attributes = [self titleAttributesWithHighlight:[self isHighlighted]]; base::scoped_nsobject<NSMutableAttributedString> attributedTitle(
NSMutableAttributedString * attributedTitle = [NSMutableAttributedString.alloc initWithString:title attributes:attributes]; [[NSMutableAttributedString alloc] initWithString:title
if (ANSI_) { attributes:attributes]);
attributedTitle = [title attributedStringParsingANSICodes]; if (ANSI_) {
[attributedTitle addAttributes:attributes range:NSMakeRange(0, attributedTitle.length)]; attributedTitle.reset([title attributedStringParsingANSICodes]);
return attributedTitle; [attributedTitle addAttributes:attributes
} range:NSMakeRange(0, [attributedTitle length])];
return attributedTitle.release();
}
//NSFontAttributeName:[NSFont menuBarFontOfSize:0], //NSFontAttributeName:[NSFont menuBarFontOfSize:0],
//NSForegroundColorAttributeName:[self colorWithHighlight: highlight] //NSForegroundColorAttributeName:[self colorWithHighlight: highlight]
[attributedTitle addAttributes:attributes
[attributedTitle addAttributes:attributes range:NSMakeRange(0, attributedTitle.length)]; range:NSMakeRange(0, [attributedTitle length])];
[attributedTitle addAttribute:NSForegroundColorAttributeName value:[self colorWithHighlight: [self isDarkMode]] range:NSMakeRange(0, attributedTitle.length)]; [attributedTitle addAttribute:NSForegroundColorAttributeName
value:[self colorWithHighlight: [self isDarkMode]]
return attributedTitle; range:NSMakeRange(0, [attributedTitle length])];
return attributedTitle.release();
} }
- (void)setMenuController:(AtomMenuController*)menu { - (void)setMenuController:(AtomMenuController*)menu {