summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authormarq <marq@chromium.org>2015-09-01 09:02:03 -0700
committerCommit bot <commit-bot@chromium.org>2015-09-01 16:02:40 +0000
commit6c505001884107ae2bfa4c3bc22b4e6ae3ee30a3 (patch)
tree2a14bb808e881a0735c01e8ec19a00f2aa4cec08 /base
parentba4a30f51e70228d8cbd7c0e7c2158c8a58087a7 (diff)
downloadchromium_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}
Diffstat (limited to 'base')
-rw-r--r--base/mac/foundation_util.h8
-rw-r--r--base/mac/foundation_util.mm14
-rw-r--r--base/mac/foundation_util_unittest.mm12
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