diff options
author | Andrej Mihajlov <and@mullvad.net> | 2020-12-15 18:26:55 +0100 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2020-12-17 17:36:46 +0100 |
commit | 9269c7c1c13f5d7a70fbef1d9c3fdf0b3e87ca70 (patch) | |
tree | 5f8dade651cf0d82113d1c2a4ee947ff7325a986 | |
parent | project: generate more stable locale IDs (diff) | |
download | wireguard-apple-9269c7c1c13f5d7a70fbef1d9c3fdf0b3e87ca70.tar.xz wireguard-apple-9269c7c1c13f5d7a70fbef1d9c3fdf0b3e87ca70.zip |
UI: macOS: Fix UTF-8 and UTF-16 conversions in highlighter code
NSString uses UTF-16 internally, while String uses UTF-8 in Swift 5.
Signed-off-by: Andrej Mihajlov <and@mullvad.net>
-rw-r--r-- | Sources/WireGuardApp/UI/macOS/View/ConfTextStorage.swift | 32 | ||||
-rw-r--r-- | Sources/WireGuardApp/UI/macOS/View/ConfTextView.swift | 2 |
2 files changed, 25 insertions, 9 deletions
diff --git a/Sources/WireGuardApp/UI/macOS/View/ConfTextStorage.swift b/Sources/WireGuardApp/UI/macOS/View/ConfTextStorage.swift index 0e63b73..d050630 100644 --- a/Sources/WireGuardApp/UI/macOS/View/ConfTextStorage.swift +++ b/Sources/WireGuardApp/UI/macOS/View/ConfTextStorage.swift @@ -67,7 +67,7 @@ class ConfTextStorage: NSTextStorage { override func replaceCharacters(in range: NSRange, with str: String) { beginEditing() backingStore.replaceCharacters(in: range, with: str) - edited(.editedCharacters, range: range, changeInLength: str.count - range.length) + edited(.editedCharacters, range: range, changeInLength: str.utf16.count - range.length) endEditing() } @@ -94,6 +94,7 @@ class ConfTextStorage: NSTextStorage { func evaluateExcludePrivateIPs(highlightSpans: UnsafePointer<highlight_span>) { var spans = highlightSpans + let string = backingStore.string enum FieldType: String { case dns case allowedips @@ -102,7 +103,7 @@ class ConfTextStorage: NSTextStorage { resetLastPeer() while spans.pointee.type != HighlightEnd { let span = spans.pointee - var substring = backingStore.attributedSubstring(from: NSRange(location: span.start, length: span.len)).string.lowercased() + var substring = String(string.substring(higlightSpan: span)).lowercased() if span.type == HighlightError { resetLastPeer() @@ -123,8 +124,9 @@ class ConfTextStorage: NSTextStorage { let next = spans.successor() let nextnext = next.successor() if next.pointee.type == HighlightDelimiter && nextnext.pointee.type == HighlightCidr { - substring += backingStore.attributedSubstring(from: NSRange(location: next.pointee.start, length: next.pointee.len)).string + - backingStore.attributedSubstring(from: NSRange(location: nextnext.pointee.start, length: nextnext.pointee.len)).string + let delimiter = string.substring(higlightSpan: next.pointee) + let cidr = string.substring(higlightSpan: nextnext.pointee) + substring += delimiter + cidr } lastOnePeerAllowedIPs.append(substring) } else if span.type == HighlightPublicKey { @@ -139,7 +141,8 @@ class ConfTextStorage: NSTextStorage { hasError = false privateKeyString = nil - let fullTextRange = NSRange(location: 0, length: (backingStore.string as NSString).length) + let string = backingStore.string + let fullTextRange = NSRange(..<string.endIndex, in: string) backingStore.beginEditing() let defaultAttributes: [NSAttributedString.Key: Any] = [ @@ -147,15 +150,19 @@ class ConfTextStorage: NSTextStorage { .font: defaultFont ] backingStore.setAttributes(defaultAttributes, range: fullTextRange) - var spans = highlight_config(backingStore.string)! + var spans = highlight_config(string)! evaluateExcludePrivateIPs(highlightSpans: spans) let spansStart = spans while spans.pointee.type != HighlightEnd { let span = spans.pointee - let range = NSRange(location: span.start, length: span.len) + let startIndex = string.utf8.index(string.startIndex, offsetBy: span.start) + let endIndex = string.utf8.index(startIndex, offsetBy: span.len) + let range = NSRange(startIndex..<endIndex, in: string) + backingStore.setAttributes(nonColorAttributes(for: span.type), range: range) + let color = textColorTheme.colorMap[span.type.rawValue, default: textColorTheme.defaultColor] backingStore.addAttribute(.foregroundColor, value: color, range: range) @@ -164,7 +171,7 @@ class ConfTextStorage: NSTextStorage { } if span.type == HighlightPrivateKey { - privateKeyString = backingStore.attributedSubstring(from: NSRange(location: span.start, length: span.len)).string + privateKeyString = String(string.substring(higlightSpan: span)) } spans = spans.successor() @@ -178,3 +185,12 @@ class ConfTextStorage: NSTextStorage { } } + +private extension String { + func substring(higlightSpan span: highlight_span) -> Substring { + let startIndex = self.utf8.index(self.utf8.startIndex, offsetBy: span.start) + let endIndex = self.utf8.index(startIndex, offsetBy: span.len) + + return self[startIndex..<endIndex] + } +} diff --git a/Sources/WireGuardApp/UI/macOS/View/ConfTextView.swift b/Sources/WireGuardApp/UI/macOS/View/ConfTextView.swift index eb19ecf..50947d7 100644 --- a/Sources/WireGuardApp/UI/macOS/View/ConfTextView.swift +++ b/Sources/WireGuardApp/UI/macOS/View/ConfTextView.swift @@ -70,7 +70,7 @@ class ConfTextView: NSTextView { } func setConfText(_ text: String) { - let fullTextRange = NSRange(location: 0, length: (string as NSString).length) + let fullTextRange = NSRange(..<string.endIndex, in: string) if shouldChangeText(in: fullTextRange, replacementString: text) { replaceCharacters(in: fullTextRange, with: text) didChangeText() |