{"action":"created","comment":{"url":"https://api.github.com/repos/mozilla/firefox-ios/pulls/comments/28387493","id":28387493,"diff_hunk":"@@ -0,0 +1,66 @@\n+/* This Source Code Form is subject to the terms of the Mozilla Public\n+ * License, v. 2.0. If a copy of the MPL was not distributed with this\n+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n+\n+import Foundation\n+\n+/**\n+ * A list that weakly holds references to its items.\n+ * Note that while the references themselves are cleared, their wrapper objects\n+ * are not (though they are reused). Also note that since slots are reused,\n+ * order is not preserved.\n+ *\n+ * This class crashes at runtime with EXC_BAD_ACCESS if a protocol is given as\n+ * the type T. Make sure to use a class type.\n+ */\n+public class WeakList<T: AnyObject>: SequenceType {\n+    private var items = [WeakRef<T>]()\n+\n+    public init() {}\n+\n+    /**\n+     * Adds an item to the list.\n+     * Note that every insertion iterates through the list to find any \"holes\" (items that have\n+     * been deallocated) to reuse them, so this class may not be appropriate in situations where\n+     * appending is frequent.\n+     */\n+    public func add(item: T) {","path":"Utils/WeakList.swift","position":27,"original_position":27,"commit_id":"dcb8e7edc3382617dbeeb0e2be346ef6a2cb04b6","original_commit_id":"dcb8e7edc3382617dbeeb0e2be346ef6a2cb04b6","user":{"login":"thebnich","id":1093266,"avatar_url":"https://avatars.githubusercontent.com/u/1093266?v=3","gravatar_id":"","url":"https://api.github.com/users/thebnich","html_url":"https://github.com/thebnich","followers_url":"https://api.github.com/users/thebnich/followers","following_url":"https://api.github.com/users/thebnich/following{/other_user}","gists_url":"https://api.github.com/users/thebnich/gists{/gist_id}","starred_url":"https://api.github.com/users/thebnich/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thebnich/subscriptions","organizations_url":"https://api.github.com/users/thebnich/orgs","repos_url":"https://api.github.com/users/thebnich/repos","events_url":"https://api.github.com/users/thebnich/events{/privacy}","received_events_url":"https://api.github.com/users/thebnich/received_events","type":"User","site_admin":false},"body":"Looks like `Set` uses `insert`, so I'll use that.","created_at":"2015-04-15T01:32:59Z","updated_at":"2015-04-15T01:32:59Z","html_url":"https://github.com/mozilla/firefox-ios/pull/300#discussion_r28387493","pull_request_url":"https://api.github.com/repos/mozilla/firefox-ios/pulls/300","_links":{"self":{"href":"https://api.github.com/repos/mozilla/firefox-ios/pulls/comments/28387493"},"html":{"href":"https://github.com/mozilla/firefox-ios/pull/300#discussion_r28387493"},"pull_request":{"href":"https://api.github.com/repos/mozilla/firefox-ios/pulls/300"}}},"pull_request":{"url":"https://api.github.com/repos/mozilla/firefox-ios/pulls/300","id":32555599,"html_url":"https://github.com/mozilla/firefox-ios/pull/300","diff_url":"https://github.com/mozilla/firefox-ios/pull/300.diff","patch_url":"https://github.com/mozilla/firefox-ios/pull/300.patch","issue_url":"https://api.github.com/repos/mozilla/firefox-ios/issues/300","number":300,"state":"open","locked":false,"title":"Bug 1109656 - Implement domain autocompletion","user":{"login":"thebnich","id":1093266,"avatar_url":"https://avatars.githubusercontent.com/u/1093266?v=3","gravatar_id":"","url":"https://api.github.com/users/thebnich","html_url":"https://github.com/thebnich","followers_url":"https://api.github.com/users/thebnich/followers","following_url":"https://api.github.com/users/thebnich/following{/other_user}","gists_url":"https://api.github.com/users/thebnich/gists{/gist_id}","starred_url":"https://api.github.com/users/thebnich/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thebnich/subscriptions","organizations_url":"https://api.github.com/users/thebnich/orgs","repos_url":"https://api.github.com/users/thebnich/repos","events_url":"https://api.github.com/users/thebnich/events{/privacy}","received_events_url":"https://api.github.com/users/thebnich/received_events","type":"User","site_admin":false},"body":"I was originally going to port over the autocomplete handling from the older PR, but it needed to be updated to handle requests asynchronously (from the profile), and I found the implementation a bit tricky to understand without any comments, so I decided to just write an `AutocompleteTextField` from scratch. There were a few edge case bugs that needed be ironed out, but it seems to work pretty well now.\r\n\r\nRather than parsing the URL via `NSURL`, I decided to use a regex -- mainly for performance. Unfortunately, SQLite doesn't have regex support built in, so our frecency query will return lots of false positives. Doing a full `NSURL` parse of all of these can get expensive, especially considering we only care about the part leading up to the path. Our Android implementation does this, and I notice it taking several _seconds_ to show autocomplete results sometimes, so I tried to come up with something better.","created_at":"2015-04-02T22:14:23Z","updated_at":"2015-04-15T01:32:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c61fc2df4631a7ac8ac6abb92f2f870ab5bbd213","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/mozilla/firefox-ios/pulls/300/commits","review_comments_url":"https://api.github.com/repos/mozilla/firefox-ios/pulls/300/comments","review_comment_url":"https://api.github.com/repos/mozilla/firefox-ios/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mozilla/firefox-ios/issues/300/comments","statuses_url":"https://api.github.com/repos/mozilla/firefox-ios/statuses/dcb8e7edc3382617dbeeb0e2be346ef6a2cb04b6","head":{"label":"thebnich:domain-autocomplete","ref":"domain-autocomplete","sha":"dcb8e7edc3382617dbeeb0e2be346ef6a2cb04b6","user":{"login":"thebnich","id":1093266,"avatar_url":"https://avatars.githubusercontent.com/u/1093266?v=3","gravatar_id":"","url":"https://api.github.com/users/thebnich","html_url":"https://github.com/thebnich","followers_url":"https://api.github.com/users/thebnich/followers","following_url":"https://api.github.com/users/thebnich/following{/other_user}","gists_url":"https://api.github.com/users/thebnich/gists{/gist_id}","starred_url":"https://api.github.com/users/thebnich/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thebnich/subscriptions","organizations_url":"https://api.github.com/users/thebnich/orgs","repos_url":"https://api.github.com/users/thebnich/repos","events_url":"https://api.github.com/users/thebnich/events{/privacy}","received_events_url":"https://api.github.com/users/thebnich/received_events","type":"User","site_admin":false},"repo":{"id":27744299,"name":"firefox-ios","full_name":"thebnich/firefox-ios","owner":{"login":"thebnich","id":1093266,"avatar_url":"https://avatars.githubusercontent.com/u/1093266?v=3","gravatar_id":"","url":"https://api.github.com/users/thebnich","html_url":"https://github.com/thebnich","followers_url":"https://api.github.com/users/thebnich/followers","following_url":"https://api.github.com/users/thebnich/following{/other_user}","gists_url":"https://api.github.com/users/thebnich/gists{/gist_id}","starred_url":"https://api.github.com/users/thebnich/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thebnich/subscriptions","organizations_url":"https://api.github.com/users/thebnich/orgs","repos_url":"https://api.github.com/users/thebnich/repos","events_url":"https://api.github.com/users/thebnich/events{/privacy}","received_events_url":"https://api.github.com/users/thebnich/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/thebnich/firefox-ios","description":"Firefox for iOS","fork":true,"url":"https://api.github.com/repos/thebnich/firefox-ios","forks_url":"https://api.github.com/repos/thebnich/firefox-ios/forks","keys_url":"https://api.github.com/repos/thebnich/firefox-ios/keys{/key_id}","collaborators_url":"https://api.github.com/repos/thebnich/firefox-ios/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/thebnich/firefox-ios/teams","hooks_url":"https://api.github.com/repos/thebnich/firefox-ios/hooks","issue_events_url":"https://api.github.com/repos/thebnich/firefox-ios/issues/events{/number}","events_url":"https://api.github.com/repos/thebnich/firefox-ios/events","assignees_url":"https://api.github.com/repos/thebnich/firefox-ios/assignees{/user}","branches_url":"https://api.github.com/repos/thebnich/firefox-ios/branches{/branch}","tags_url":"https://api.github.com/repos/thebnich/firefox-ios/tags","blobs_url":"https://api.github.com/repos/thebnich/firefox-ios/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/thebnich/firefox-ios/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/thebnich/firefox-ios/git/refs{/sha}","trees_url":"https://api.github.com/repos/thebnich/firefox-ios/git/trees{/sha}","statuses_url":"https://api.github.com/repos/thebnich/firefox-ios/statuses/{sha}","languages_url":"https://api.github.com/repos/thebnich/firefox-ios/languages","stargazers_url":"https://api.github.com/repos/thebnich/firefox-ios/stargazers","contributors_url":"https://api.github.com/repos/thebnich/firefox-ios/contributors","subscribers_url":"https://api.github.com/repos/thebnich/firefox-ios/subscribers","subscription_url":"https://api.github.com/repos/thebnich/firefox-ios/subscription","commits_url":"https://api.github.com/repos/thebnich/firefox-ios/commits{/sha}","git_commits_url":"https://api.github.com/repos/thebnich/firefox-ios/git/commits{/sha}","comments_url":"https://api.github.com/repos/thebnich/firefox-ios/comments{/number}","issue_comment_url":"https://api.github.com/repos/thebnich/firefox-ios/issues/comments{/number}","contents_url":"https://api.github.com/repos/thebnich/firefox-ios/contents/{+path}","compare_url":"https://api.github.com/repos/thebnich/firefox-ios/compare/{base}...{head}","merges_url":"https://api.github.com/repos/thebnich/firefox-ios/merges","archive_url":"https://api.github.com/repos/thebnich/firefox-ios/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/thebnich/firefox-ios/downloads","issues_url":"https://api.github.com/repos/thebnich/firefox-ios/issues{/number}","pulls_url":"https://api.github.com/repos/thebnich/firefox-ios/pulls{/number}","milestones_url":"https://api.github.com/repos/thebnich/firefox-ios/milestones{/number}","notifications_url":"https://api.github.com/repos/thebnich/firefox-ios/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/thebnich/firefox-ios/labels{/name}","releases_url":"https://api.github.com/repos/thebnich/firefox-ios/releases{/id}","created_at":"2014-12-09T01:43:28Z","updated_at":"2015-02-20T01:57:25Z","pushed_at":"2015-04-10T17:47:05Z","git_url":"git://github.com/thebnich/firefox-ios.git","ssh_url":"git@github.com:thebnich/firefox-ios.git","clone_url":"https://github.com/thebnich/firefox-ios.git","svn_url":"https://github.com/thebnich/firefox-ios","homepage":"","size":16321,"stargazers_count":2,"watchers_count":2,"language":"C","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":2,"default_branch":"master"}},"base":{"label":"mozilla:master","ref":"master","sha":"f2c14f8ece97f8f95fa68791fba5b7635d1f5abd","user":{"login":"mozilla","id":131524,"avatar_url":"https://avatars.githubusercontent.com/u/131524?v=3","gravatar_id":"","url":"https://api.github.com/users/mozilla","html_url":"https://github.com/mozilla","followers_url":"https://api.github.com/users/mozilla/followers","following_url":"https://api.github.com/users/mozilla/following{/other_user}","gists_url":"https://api.github.com/users/mozilla/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla/subscriptions","organizations_url":"https://api.github.com/users/mozilla/orgs","repos_url":"https://api.github.com/users/mozilla/repos","events_url":"https://api.github.com/users/mozilla/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla/received_events","type":"Organization","site_admin":false},"repo":{"id":26133979,"name":"firefox-ios","full_name":"mozilla/firefox-ios","owner":{"login":"mozilla","id":131524,"avatar_url":"https://avatars.githubusercontent.com/u/131524?v=3","gravatar_id":"","url":"https://api.github.com/users/mozilla","html_url":"https://github.com/mozilla","followers_url":"https://api.github.com/users/mozilla/followers","following_url":"https://api.github.com/users/mozilla/following{/other_user}","gists_url":"https://api.github.com/users/mozilla/gists{/gist_id}","starred_url":"https://api.github.com/users/mozilla/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mozilla/subscriptions","organizations_url":"https://api.github.com/users/mozilla/orgs","repos_url":"https://api.github.com/users/mozilla/repos","events_url":"https://api.github.com/users/mozilla/events{/privacy}","received_events_url":"https://api.github.com/users/mozilla/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mozilla/firefox-ios","description":"Firefox for iOS","fork":false,"url":"https://api.github.com/repos/mozilla/firefox-ios","forks_url":"https://api.github.com/repos/mozilla/firefox-ios/forks","keys_url":"https://api.github.com/repos/mozilla/firefox-ios/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mozilla/firefox-ios/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mozilla/firefox-ios/teams","hooks_url":"https://api.github.com/repos/mozilla/firefox-ios/hooks","issue_events_url":"https://api.github.com/repos/mozilla/firefox-ios/issues/events{/number}","events_url":"https://api.github.com/repos/mozilla/firefox-ios/events","assignees_url":"https://api.github.com/repos/mozilla/firefox-ios/assignees{/user}","branches_url":"https://api.github.com/repos/mozilla/firefox-ios/branches{/branch}","tags_url":"https://api.github.com/repos/mozilla/firefox-ios/tags","blobs_url":"https://api.github.com/repos/mozilla/firefox-ios/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mozilla/firefox-ios/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mozilla/firefox-ios/git/refs{/sha}","trees_url":"https://api.github.com/repos/mozilla/firefox-ios/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mozilla/firefox-ios/statuses/{sha}","languages_url":"https://api.github.com/repos/mozilla/firefox-ios/languages","stargazers_url":"https://api.github.com/repos/mozilla/firefox-ios/stargazers","contributors_url":"https://api.github.com/repos/mozilla/firefox-ios/contributors","subscribers_url":"https://api.github.com/repos/mozilla/firefox-ios/subscribers","subscription_url":"https://api.github.com/repos/mozilla/firefox-ios/subscription","commits_url":"https://api.github.com/repos/mozilla/firefox-ios/commits{/sha}","git_commits_url":"https://api.github.com/repos/mozilla/firefox-ios/git/commits{/sha}","comments_url":"https://api.github.com/repos/mozilla/firefox-ios/comments{/number}","issue_comment_url":"https://api.github.com/repos/mozilla/firefox-ios/issues/comments{/number}","contents_url":"https://api.github.com/repos/mozilla/firefox-ios/contents/{+path}","compare_url":"https://api.github.com/repos/mozilla/firefox-ios/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mozilla/firefox-ios/merges","archive_url":"https://api.github.com/repos/mozilla/firefox-ios/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mozilla/firefox-ios/downloads","issues_url":"https://api.github.com/repos/mozilla/firefox-ios/issues{/number}","pulls_url":"https://api.github.com/repos/mozilla/firefox-ios/pulls{/number}","milestones_url":"https://api.github.com/repos/mozilla/firefox-ios/milestones{/number}","notifications_url":"https://api.github.com/repos/mozilla/firefox-ios/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mozilla/firefox-ios/labels{/name}","releases_url":"https://api.github.com/repos/mozilla/firefox-ios/releases{/id}","created_at":"2014-11-03T19:07:02Z","updated_at":"2015-04-14T21:18:29Z","pushed_at":"2015-04-15T00:56:42Z","git_url":"git://github.com/mozilla/firefox-ios.git","ssh_url":"git@github.com:mozilla/firefox-ios.git","clone_url":"https://github.com/mozilla/firefox-ios.git","svn_url":"https://github.com/mozilla/firefox-ios","homepage":"","size":27526,"stargazers_count":3090,"watchers_count":3090,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":513,"mirror_url":null,"open_issues_count":15,"forks":513,"open_issues":15,"watchers":3090,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mozilla/firefox-ios/pulls/300"},"html":{"href":"https://github.com/mozilla/firefox-ios/pull/300"},"issue":{"href":"https://api.github.com/repos/mozilla/firefox-ios/issues/300"},"comments":{"href":"https://api.github.com/repos/mozilla/firefox-ios/issues/300/comments"},"review_comments":{"href":"https://api.github.com/repos/mozilla/firefox-ios/pulls/300/comments"},"review_comment":{"href":"https://api.github.com/repos/mozilla/firefox-ios/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mozilla/firefox-ios/pulls/300/commits"},"statuses":{"href":"https://api.github.com/repos/mozilla/firefox-ios/statuses/dcb8e7edc3382617dbeeb0e2be346ef6a2cb04b6"}}}}