diff options
author | marq <marq@chromium.org> | 2015-09-01 09:02:03 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-09-01 16:02:40 +0000 |
commit | 6c505001884107ae2bfa4c3bc22b4e6ae3ee30a3 (patch) | |
tree | 2a14bb808e881a0735c01e8ec19a00f2aa4cec08 | |
parent | ba4a30f51e70228d8cbd7c0e7c2158c8a58087a7 (diff) | |
download | chromium_src-6c505001884107ae2bfa4c3bc22b4e6ae3ee30a3.zip chromium_src-6c505001884107ae2bfa4c3bc22b4e6ae3ee30a3.tar.gz chromium_src-6c505001884107ae2bfa4c3bc22b4e6ae3ee30a3.tar.bz2 |
Add CFRangeToNSRange
Adds a utility function for converting CFRanges to NSRanges, asserting
if any of the CFRange's values are outside of NSUInteger's range.
BUG=517791
Review URL: https://codereview.chromium.org/1314753003
Cr-Commit-Position: refs/heads/master@{#346668}
-rw-r--r-- | base/mac/foundation_util.h | 8 | ||||
-rw-r--r-- | base/mac/foundation_util.mm | 14 | ||||
-rw-r--r-- | base/mac/foundation_util_unittest.mm | 12 |
3 files changed, 34 insertions, 0 deletions
diff --git a/base/mac/foundation_util.h b/base/mac/foundation_util.h index 353ed7c..6e8505d 100644 --- a/base/mac/foundation_util.h +++ b/base/mac/foundation_util.h @@ -373,6 +373,14 @@ BASE_EXPORT NSString* FilePathToNSString(const FilePath& path); // Converts |str| to a FilePath. Returns an empty path if |str| is nil. BASE_EXPORT FilePath NSStringToFilePath(NSString* str); +#if defined(__OBJC__) +// Converts |range| to an NSRange, returning the new range in |range_out|. +// Returns true if conversion was successful, false if the values of |range| +// could not be converted to NSUIntegers. +BASE_EXPORT bool CFRangeToNSRange(CFRange range, + NSRange* range_out) WARN_UNUSED_RESULT; +#endif // defined(__OBJC__) + } // namespace mac } // namespace base diff --git a/base/mac/foundation_util.mm b/base/mac/foundation_util.mm index 27d6e7c..bd5d514 100644 --- a/base/mac/foundation_util.mm +++ b/base/mac/foundation_util.mm @@ -11,6 +11,7 @@ #include "base/logging.h" #include "base/mac/bundle_locations.h" #include "base/mac/mac_logging.h" +#include "base/numerics/safe_conversions.h" #include "base/strings/sys_string_conversions.h" #if !defined(OS_IOS) @@ -430,6 +431,19 @@ FilePath NSStringToFilePath(NSString* str) { return FilePath([str fileSystemRepresentation]); } +bool CFRangeToNSRange(CFRange range, NSRange* range_out) { + if (base::IsValueInRangeForNumericType<decltype(range_out->location)>( + range.location) && + base::IsValueInRangeForNumericType<decltype(range_out->length)>( + range.length) && + base::IsValueInRangeForNumericType<decltype(range_out->location)>( + range.location + range.length)) { + *range_out = NSMakeRange(range.location, range.length); + return true; + } + return false; +} + } // namespace mac } // namespace base diff --git a/base/mac/foundation_util_unittest.mm b/base/mac/foundation_util_unittest.mm index e60a0f6..c688442 100644 --- a/base/mac/foundation_util_unittest.mm +++ b/base/mac/foundation_util_unittest.mm @@ -317,6 +317,18 @@ TEST(FoundationUtilTest, NSStringToFilePath) { EXPECT_EQ(FilePath("/a/b"), NSStringToFilePath(@"/a/b")); } +TEST(FoundationUtilTest, CFRangeToNSRange) { + NSRange range_out; + EXPECT_TRUE(CFRangeToNSRange(CFRangeMake(10, 5), &range_out)); + EXPECT_EQ(10UL, range_out.location); + EXPECT_EQ(5UL, range_out.length); + EXPECT_FALSE(CFRangeToNSRange(CFRangeMake(-1, 5), &range_out)); + EXPECT_FALSE(CFRangeToNSRange(CFRangeMake(5, -1), &range_out)); + EXPECT_FALSE(CFRangeToNSRange(CFRangeMake(-1, -1), &range_out)); + EXPECT_FALSE(CFRangeToNSRange(CFRangeMake(LONG_MAX, LONG_MAX), &range_out)); + EXPECT_FALSE(CFRangeToNSRange(CFRangeMake(LONG_MIN, LONG_MAX), &range_out)); +} + TEST(StringNumberConversionsTest, FormatNSInteger) { // The PRI[dxu]NS macro assumes that NSInteger is a typedef to "int" on // 32-bit architecture and a typedef to "long" on 64-bit architecture |