1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
content / common / mac / attributed_string_type_converters_unittest.mm [blame]
// Copyright 2011 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "content/common/mac/attributed_string_type_converters.h"
#include <AppKit/AppKit.h>
#include <memory>
#include "base/apple/bridging.h"
#include "base/apple/foundation_util.h"
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/gtest_mac.h"
class AttributedStringConverterTest : public testing::Test {
public:
NSMutableAttributedString* AttributedString() {
NSString* str = @"The quick brown fox jumped over the lazy dog.";
return [[NSMutableAttributedString alloc] initWithString:str];
}
NSDictionary* FontAttributeDictionary(NSString* name, CGFloat size) {
NSFont* font = [NSFont fontWithName:name size:size];
return @{NSFontAttributeName : font};
}
NSAttributedString* ConvertAndRestore(NSAttributedString* str) {
ui::mojom::AttributedStringPtr attributed_str =
ui::mojom::AttributedString::From(base::apple::NSToCFPtrCast(str));
return base::apple::CFToNSPtrCast(
attributed_str.To<CFAttributedStringRef>());
}
};
TEST_F(AttributedStringConverterTest, SimpleString) {
NSMutableAttributedString* attr_str = AttributedString();
[attr_str addAttributes:FontAttributeDictionary(@"Helvetica", 12.5)
range:NSMakeRange(0, attr_str.length)];
NSAttributedString* ns_attributed_string = ConvertAndRestore(attr_str);
EXPECT_NSEQ(attr_str, ns_attributed_string);
}
TEST_F(AttributedStringConverterTest, NoAttributes) {
NSMutableAttributedString* attr_str = AttributedString();
NSAttributedString* ns_attributed_string = ConvertAndRestore(attr_str);
EXPECT_NSEQ(attr_str, ns_attributed_string);
}
TEST_F(AttributedStringConverterTest, StripColor) {
NSMutableAttributedString* attr_str = AttributedString();
const NSUInteger kStringLength = attr_str.length;
[attr_str addAttribute:NSFontAttributeName
value:[NSFont systemFontOfSize:26]
range:NSMakeRange(0, kStringLength)];
[attr_str addAttribute:NSForegroundColorAttributeName
value:NSColor.redColor
range:NSMakeRange(0, kStringLength)];
NSAttributedString* ns_attributed_string = ConvertAndRestore(attr_str);
NSRange range;
NSDictionary* attrs = [ns_attributed_string attributesAtIndex:0
effectiveRange:&range];
EXPECT_TRUE(NSEqualRanges(NSMakeRange(0, kStringLength), range));
EXPECT_NSEQ([NSFont systemFontOfSize:26], attrs[NSFontAttributeName]);
EXPECT_FALSE(attrs[NSForegroundColorAttributeName]);
}
TEST_F(AttributedStringConverterTest, MultipleFonts) {
NSMutableAttributedString* attr_str = AttributedString();
[attr_str setAttributes:FontAttributeDictionary(@"Courier", 12)
range:NSMakeRange(0, 10)];
[attr_str addAttributes:FontAttributeDictionary(@"Helvetica", 16)
range:NSMakeRange(12, 6)];
[attr_str addAttributes:FontAttributeDictionary(@"Helvetica", 14)
range:NSMakeRange(15, 5)];
NSAttributedString* ns_attributed_string = ConvertAndRestore(attr_str);
EXPECT_NSEQ(attr_str, ns_attributed_string);
}
TEST_F(AttributedStringConverterTest, NoPertinentAttributes) {
NSMutableAttributedString* attr_str = AttributedString();
[attr_str addAttribute:NSForegroundColorAttributeName
value:NSColor.blueColor
range:NSMakeRange(0, 10)];
[attr_str addAttribute:NSBackgroundColorAttributeName
value:NSColor.blueColor
range:NSMakeRange(15, 5)];
[attr_str addAttribute:NSKernAttributeName
value:@(2.6)
range:NSMakeRange(11, 3)];
NSAttributedString* ns_attributed_string = ConvertAndRestore(attr_str);
NSMutableAttributedString* expected = AttributedString();
EXPECT_NSEQ(expected, ns_attributed_string);
}
TEST_F(AttributedStringConverterTest, NilString) {
NSAttributedString* ns_attributed_string = ConvertAndRestore(nil);
EXPECT_TRUE(ns_attributed_string);
EXPECT_EQ(0U, ns_attributed_string.length);
}
TEST_F(AttributedStringConverterTest, OutOfRange) {
NSFont* system_font = [NSFont systemFontOfSize:10];
std::u16string font_name = base::SysNSStringToUTF16(system_font.fontName);
ui::mojom::AttributedStringPtr attributed_string =
ui::mojom::AttributedString::New();
attributed_string->string = u"Hello World";
attributed_string->attributes.push_back(
ui::mojom::FontAttribute::New(font_name, 12, gfx::Range(0, 5)));
attributed_string->attributes.push_back(
ui::mojom::FontAttribute::New(font_name, 14, gfx::Range(5, 100)));
attributed_string->attributes.push_back(
ui::mojom::FontAttribute::New(font_name, 16, gfx::Range(100, 5)));
CFAttributedStringRef cf_attributed_string =
attributed_string.To<CFAttributedStringRef>();
EXPECT_TRUE(cf_attributed_string);
NSAttributedString* ns_attributed_string =
base::apple::CFToNSPtrCast(cf_attributed_string);
NSRange range;
NSDictionary* attrs = [ns_attributed_string attributesAtIndex:0
effectiveRange:&range];
EXPECT_NSEQ([NSFont systemFontOfSize:12], attrs[NSFontAttributeName]);
EXPECT_TRUE(NSEqualRanges(range, NSMakeRange(0, 5)));
attrs = [ns_attributed_string attributesAtIndex:5 effectiveRange:&range];
EXPECT_FALSE(attrs[NSFontAttributeName]);
EXPECT_EQ(0U, attrs.count);
}
TEST_F(AttributedStringConverterTest, SystemFontSubstitution) {
// Ask for a specialization of the system font that the OS will refuse to
// instantiate via the normal font APIs.
std::u16string font_name = u".SFNS-Regular_wdth_opsz200000_GRAD_wght2BC0000";
ui::mojom::AttributedStringPtr attributed_string =
ui::mojom::AttributedString::New();
attributed_string->string = u"Hello";
attributed_string->attributes.push_back(
ui::mojom::FontAttribute::New(font_name, 12, gfx::Range(0, 5)));
CFAttributedStringRef cf_attributed_string =
attributed_string.To<CFAttributedStringRef>();
EXPECT_TRUE(cf_attributed_string);
NSAttributedString* ns_attributed_string =
base::apple::CFToNSPtrCast(cf_attributed_string);
NSRange range;
NSDictionary* attrs = [ns_attributed_string attributesAtIndex:0
effectiveRange:&range];
EXPECT_NSEQ([NSFont systemFontOfSize:12], attrs[NSFontAttributeName]);
EXPECT_TRUE(NSEqualRanges(range, NSMakeRange(0, 5)));
}