Skip to content

Commit

Permalink
Merge pull request #1589 from thebnich/domain-fixes
Browse files Browse the repository at this point in the history
Bug 1250514/1250518 - Domain autocomplete improvements
  • Loading branch information
thebnich committed Mar 2, 2016
2 parents 03cdc3d + 0c73205 commit e32b0e3
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 5 deletions.
14 changes: 9 additions & 5 deletions Client/Frontend/Widgets/AutocompleteTextField.swift
Expand Up @@ -50,6 +50,10 @@ class AutocompleteTextField: UITextField, UITextFieldDelegate {
}
}

var normalizedEnteredText: String {
return enteredText.lowercaseString.stringByTrimmingLeadingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
}

override var text: String? {
didSet {
// SELtextDidChange is not called when directly setting the text property, so fire it manually.
Expand All @@ -72,7 +76,7 @@ class AutocompleteTextField: UITextField, UITextFieldDelegate {
super.addTarget(self, action: "SELtextDidChange:", forControlEvents: UIControlEvents.EditingChanged)
notifyTextChanged = debounce(0.1, action: {
if self.editing {
self.autocompleteDelegate?.autocompleteTextField(self, didEnterText: self.enteredText)
self.autocompleteDelegate?.autocompleteTextField(self, didEnterText: self.enteredText.stringByTrimmingLeadingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()))
}
})
}
Expand Down Expand Up @@ -142,7 +146,7 @@ class AutocompleteTextField: UITextField, UITextFieldDelegate {
private func removeCompletionIfRequiredForEnteredString(string: String) {
// If user-entered text does not start with previous suggestion then remove the completion.
let actualEnteredString = enteredText + string
if !previousSuggestion.startsWith(actualEnteredString) {
if !previousSuggestion.startsWith(normalizedEnteredText) {
removeCompletion()
}
enteredText = actualEnteredString
Expand All @@ -156,9 +160,9 @@ class AutocompleteTextField: UITextField, UITextFieldDelegate {
// Check that the length of the entered text is shorter than the length of the suggestion.
// This ensures that completionActive is true only if there are remaining characters to
// suggest (which will suppress the caret).
if suggestion.startsWith(enteredText) && (enteredText).characters.count < suggestion.characters.count {
let endingString = suggestion.substringFromIndex(suggestion.startIndex.advancedBy(enteredText.characters.count))
let completedAndMarkedString = NSMutableAttributedString(string: suggestion)
if suggestion.startsWith(normalizedEnteredText) && normalizedEnteredText.characters.count < suggestion.characters.count {
let endingString = suggestion.substringFromIndex(suggestion.startIndex.advancedBy(normalizedEnteredText.characters.count))
let completedAndMarkedString = NSMutableAttributedString(string: enteredText + endingString)
completedAndMarkedString.addAttribute(NSBackgroundColorAttributeName, value: highlightColor, range: NSMakeRange(enteredText.characters.count, endingString.characters.count))
attributedText = completedAndMarkedString
completionActive = true
Expand Down
6 changes: 6 additions & 0 deletions ClientTests/StringExtensionsTests.swift
Expand Up @@ -52,4 +52,10 @@ class StringExtensionsTests: XCTestCase {
// maxLength < 2.
XCTAssertEqual("abcdefgh", "abcdefgh".ellipsize(maxLength: 0))
}

func testStringByTrimmingLeadingCharactersInSet() {
XCTAssertEqual("foo ", " foo ".stringByTrimmingLeadingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()))
XCTAssertEqual("foo456", "123foo456".stringByTrimmingLeadingCharactersInSet(NSCharacterSet.decimalDigitCharacterSet()))
XCTAssertEqual("", "123456".stringByTrimmingLeadingCharactersInSet(NSCharacterSet.decimalDigitCharacterSet()))
}
}
14 changes: 14 additions & 0 deletions UITests/DomainAutocompleteTests.swift
Expand Up @@ -89,6 +89,20 @@ class DomainAutocompleteTests: KIFTestCase {
BrowserUtils.ensureAutocompletionResult(tester(), textField: textField, prefix: "an", completion: "swers.com/")
tester().enterTextIntoCurrentFirstResponder("c")
BrowserUtils.ensureAutocompletionResult(tester(), textField: textField, prefix: "anc", completion: "estry.com/")
tester().clearTextFromFirstResponder()

// Test mixed case autocompletion.
tester().enterTextIntoCurrentFirstResponder("YaH")
BrowserUtils.ensureAutocompletionResult(tester(), textField: textField, prefix: "YaH", completion: "oo.com/")
tester().clearTextFromFirstResponder()

// Test that leading spaces still show suggestions.
tester().enterTextIntoCurrentFirstResponder(" yah")
BrowserUtils.ensureAutocompletionResult(tester(), textField: textField, prefix: " yah", completion: "oo.com/")

// Test that trailing spaces do *not* show suggestions.
tester().enterTextIntoCurrentFirstResponder(" ")
BrowserUtils.ensureAutocompletionResult(tester(), textField: textField, prefix: " yah ", completion: "")

tester().tapViewWithAccessibilityLabel("Cancel")
}
Expand Down
10 changes: 10 additions & 0 deletions Utils/Extensions/StringExtensions.swift
Expand Up @@ -84,4 +84,14 @@ public extension String {
return NSURL(string: self) ??
NSURL(string: self.stringWithAdditionalEscaping)
}

/// Returns a new string made by removing the leading String characters contained
/// in a given character set.
public func stringByTrimmingLeadingCharactersInSet(set: NSCharacterSet) -> String {
var trimmed = self
while trimmed.rangeOfCharacterFromSet(set)?.startIndex == trimmed.startIndex {
trimmed.removeAtIndex(trimmed.startIndex)
}
return trimmed
}
}

0 comments on commit e32b0e3

Please sign in to comment.