{"action":"created","comment":{"url":"https://api.github.com/repos/mozilla/firefox-ios/pulls/comments/49110919","id":49110919,"diff_hunk":"@@ -148,109 +218,177 @@ class LoginDetailViewController: UITableViewController {\n         }\n     }\n \n-    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {\n-        return 2\n+    private func dequeueLoginCellForIndexPath(indexPath: NSIndexPath) -> LoginTableViewCell {\n+        let loginCell = tableView.dequeueReusableCellWithIdentifier(LoginCellIdentifier, forIndexPath: indexPath) as! LoginTableViewCell\n+        loginCell.selectionStyle = .None\n+        loginCell.delegate = self\n+        loginCell.descriptionLabel.delegate = self\n+        return loginCell\n     }\n \n-    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n-        switch ListSection(rawValue: section)! {\n-        case .Info: return 4\n-        case .Delete: return 1\n+    private func wrapFooter(footer: UITableViewHeaderFooterView, withCellFromTableView tableView: UITableView, atIndexPath indexPath: NSIndexPath) -> UITableViewCell {\n+        let cell = tableView.dequeueReusableCellWithIdentifier(DefaultCellIdentifier, forIndexPath: indexPath)\n+        cell.selectionStyle = .None\n+        cell.addSubview(footer)\n+        footer.snp_makeConstraints { make in\n+            make.edges.equalTo(cell)\n         }\n+        return cell\n     }\n \n-    override func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {\n-        switch ListSection(rawValue: section)! {\n-        case .Info: return 60\n-        default: return 0\n-        }\n-    }\n-\n-    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {\n-        switch ListSection(rawValue: indexPath.section)! {\n-        case .Info: return LoginDetailUX.InfoRowHeight\n-        case .Delete: return LoginDetailUX.DeleteRowHeight\n-        }\n+    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n+        return 6\n     }\n+}\n \n-    override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {\n-        switch ListSection(rawValue: section)! {\n-        case .Info:\n-            let footer = tableView.dequeueReusableHeaderFooterViewWithIdentifier(SectionHeaderFooterIdentifier) as! SettingsTableSectionHeaderFooterView\n-            footer.titleAlignment = .Top\n-\n-            if let passwordModifiedTimestamp = loginUsageData?.timePasswordChanged {\n-                let lastModified = NSLocalizedString(\"Last modified %@\", tableName: \"LoginManager\", comment: \"Footer label describing when the login was last modified with the timestamp as the parameter\")\n-                let formattedLabel = String(format: lastModified, NSDate.fromTimestamp(passwordModifiedTimestamp).toRelativeTimeString())\n-                footer.titleLabel.text = formattedLabel\n-            }\n-            return footer\n-\n-        default:\n-            return nil\n+// MARK: - UITableViewDelegate\n+extension LoginDetailViewController: UITableViewDelegate {\n+\n+    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {\n+        switch InfoItem(rawValue: indexPath.row)! {\n+        case .TitleItem, .UsernameItem, .PasswordItem, .WebsiteItem:\n+            return LoginDetailUX.InfoRowHeight\n+        case .LastModifiedSeperator:\n+            return LoginDetailUX.SeperatorHeight\n+        case .DeleteItem:\n+            return LoginDetailUX.DeleteRowHeight\n         }\n     }\n \n-    override func tableView(tableView: UITableView, shouldShowMenuForRowAtIndexPath indexPath: NSIndexPath) -> Bool {\n-        let section = ListSection(rawValue: indexPath.section)!\n+    func tableView(tableView: UITableView, shouldShowMenuForRowAtIndexPath indexPath: NSIndexPath) -> Bool {\n         let item = InfoItem(rawValue: indexPath.row)!\n-        if section == .Info {\n-            if item == .PasswordItem || item == .WebsiteItem {\n-                menuControllerCell = tableView.cellForRowAtIndexPath(indexPath) as? LoginTableViewCell\n-                return true\n-            }\n+        if item == .PasswordItem || item == .WebsiteItem {\n+            menuControllerCell = tableView.cellForRowAtIndexPath(indexPath) as? LoginTableViewCell\n+            return true\n         }\n \n         return false\n     }\n \n-    override func tableView(tableView: UITableView, canPerformAction action: Selector, forRowAtIndexPath indexPath: NSIndexPath, withSender sender: AnyObject?) -> Bool {\n-        let section = ListSection(rawValue: indexPath.section)!\n+    func tableView(tableView: UITableView, canPerformAction action: Selector, forRowAtIndexPath indexPath: NSIndexPath, withSender sender: AnyObject?) -> Bool {\n         let item = InfoItem(rawValue: indexPath.row)!\n \n         // Menu actions for password\n-        if section == .Info && item == .PasswordItem {\n+        if item == .PasswordItem {\n             let loginCell = tableView.cellForRowAtIndexPath(indexPath) as! LoginTableViewCell\n             let showRevealOption = loginCell.descriptionLabel.secureTextEntry ? (action == \"SELrevealDescription\") : (action == \"SELsecureDescription\")\n             return action == \"SELcopyDescription\" || showRevealOption\n         }\n \n         // Menu actions for Website\n-        else if section == .Info && item == .WebsiteItem {\n+        else if item == .WebsiteItem {\n             return action == \"SELcopyDescription\" || action == \"SELopenAndFillDescription\"\n         } else {\n             return false\n         }\n     }\n \n-    override func tableView(tableView: UITableView, performAction action: Selector, forRowAtIndexPath indexPath: NSIndexPath, withSender sender: AnyObject?) {\n+    func tableView(tableView: UITableView, performAction action: Selector, forRowAtIndexPath indexPath: NSIndexPath, withSender sender: AnyObject?) {\n         // No-op. Needs to be overridden for custom menu action selectors to work.\n     }\n }\n \n-// MARK: - Table View Editing\n-extension LoginDetailViewController {\n+// MARK: - KeyboardHelperDelegate\n+extension LoginDetailViewController: KeyboardHelperDelegate {\n+    \n+    func keyboardHelper(keyboardHelper: KeyboardHelper, keyboardWillShowWithState state: KeyboardState) {\n+        let coveredHeight = state.intersectionHeightForView(tableView)\n+        tableView.contentInset.bottom = coveredHeight\n+    }\n+\n+    func keyboardHelper(keyboardHelper: KeyboardHelper, keyboardDidShowWithState state: KeyboardState) {\n+    }\n+\n+    func keyboardHelper(keyboardHelper: KeyboardHelper, keyboardWillHideWithState state: KeyboardState) {\n+        tableView.contentInset.bottom = 0\n+    }\n+}\n+\n+// MARK: - UITextFieldDelegate\n+extension LoginDetailViewController: UITextFieldDelegate {\n+\n+    private func cellForItem(item: InfoItem) -> LoginTableViewCell? {\n+        return tableView.cellForRowAtIndexPath(item.indexPath) as? LoginTableViewCell\n+    }\n+\n+    private func textFieldForItem(item: InfoItem) -> UITextField? {\n+        guard let loginCell = cellForItem(item) else {\n+            return nil\n+        }\n \n-    override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {\n-        return .None\n+        return loginCell.descriptionLabel\n     }\n \n-    override func tableView(tableView: UITableView, shouldIndentWhileEditingRowAtIndexPath indexPath: NSIndexPath) -> Bool {\n+    func textFieldShouldReturn(textField: UITextField) -> Bool {\n+        let usernameField = textFieldForItem(.UsernameItem)\n+        let passwordField = textFieldForItem(.PasswordItem)\n+        let websiteField = textFieldForItem(.WebsiteItem)\n+\n+        if textField == usernameField {\n+            passwordField?.becomeFirstResponder()\n+        } else if textField == passwordField {\n+            websiteField?.becomeFirstResponder()\n+        }\n+\n         return false\n     }\n+\n+    func textFieldShouldBeginEditing(textField: UITextField) -> Bool {\n+        if let passwordField = textFieldForItem(.PasswordItem) where passwordField == textField {\n+            cellForItem(.PasswordItem)?.displayDescriptionAsPassword = false\n+        }\n+        return true\n+    }\n+\n+    func textFieldDidEndEditing(textField: UITextField) {\n+        if let passwordField = textFieldForItem(.PasswordItem) where passwordField == textField {\n+            cellForItem(.PasswordItem)?.displayDescriptionAsPassword = true\n+        }\n+    }\n }\n \n // MARK: - Selectors\n extension LoginDetailViewController {\n \n+    func SELonProfileDidFinishSyncing() {\n+        // Reload details after syncing.\n+        profile.logins.getLoginDataForGUID(login.guid).uponQueue(dispatch_get_main_queue()) { result in\n+            if let syncedLogin = result.successValue {\n+                self.login = syncedLogin\n+            }\n+        }\n+    }\n+\n     func SELedit() {\n-        tableView.editing = true\n+        editingInfo = true\n+\n+        let cell = tableView.cellForRowAtIndexPath(InfoItem.UsernameItem.indexPath) as! LoginTableViewCell\n+        cell.descriptionLabel.becomeFirstResponder()\n+\n         navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Done, target: self, action: \"SELdoneEditing\")\n     }\n \n     func SELdoneEditing() {\n-        tableView.editing = false\n+        let usernameField = textFieldForItem(.UsernameItem)\n+        let passwordField = textFieldForItem(.PasswordItem)\n+        let websiteField = textFieldForItem(.WebsiteItem)\n+\n+        // Force resign responder from all input fields\n+        [usernameField, passwordField, websiteField].forEach { $0?.resignFirstResponder() }\n+\n+        editingInfo = false\n         navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Edit, target: self, action: \"SELedit\")\n+\n+        let username = usernameField?.text ?? \"\"\n+        let password = passwordField?.text ?? \"\"\n+        let hostname = websiteField?.text ?? \"\"\n+\n+        // Update login if there were any changes\n+        if username != login.username || password != login.password || hostname != login.hostname {\n+            // Update local, in-memory copy to view changes right away.\n+            login = Login(guid: login.guid, hostname: hostname, username: username, password: password)\n+            profile.logins.updateLoginByGUID(login.guid, new: login, significant: true)","path":"Client/Frontend/Settings/LoginDetailViewController.swift","position":480,"original_position":480,"commit_id":"3e0901a6680d5c1e23dcf81cdff0315cff4544c9","original_commit_id":"3e0901a6680d5c1e23dcf81cdff0315cff4544c9","user":{"login":"rnewman","id":91722,"avatar_url":"https://avatars.githubusercontent.com/u/91722?v=3","gravatar_id":"","url":"https://api.github.com/users/rnewman","html_url":"https://github.com/rnewman","followers_url":"https://api.github.com/users/rnewman/followers","following_url":"https://api.github.com/users/rnewman/following{/other_user}","gists_url":"https://api.github.com/users/rnewman/gists{/gist_id}","starred_url":"https://api.github.com/users/rnewman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rnewman/subscriptions","organizations_url":"https://api.github.com/users/rnewman/orgs","repos_url":"https://api.github.com/users/rnewman/repos","events_url":"https://api.github.com/users/rnewman/events{/privacy}","received_events_url":"https://api.github.com/users/rnewman/received_events","type":"User","site_admin":false},"body":"Can we stay in edit mode?","created_at":"2016-01-07T18:59:50Z","updated_at":"2016-01-07T18:59:50Z","html_url":"https://github.com/mozilla/firefox-ios/pull/1406#discussion_r49110919","pull_request_url":"https://api.github.com/repos/mozilla/firefox-ios/pulls/1406","_links":{"self":{"href":"https://api.github.com/repos/mozilla/firefox-ios/pulls/comments/49110919"},"html":{"href":"https://github.com/mozilla/firefox-ios/pull/1406#discussion_r49110919"},"pull_request":{"href":"https://api.github.com/repos/mozilla/firefox-ios/pulls/1406"}}},"pull_request":{"url":"https://api.github.com/repos/mozilla/firefox-ios/pulls/1406","id":55236179,"html_url":"https://github.com/mozilla/firefox-ios/pull/1406","diff_url":"https://github.com/mozilla/firefox-ios/pull/1406.diff","patch_url":"https://github.com/mozilla/firefox-ios/pull/1406.patch","issue_url":"https://api.github.com/repos/mozilla/firefox-ios/issues/1406","number":1406,"state":"open","locked":false,"title":"Bug 1221595 - Editing login from detail screen","user":{"login":"sleroux","id":434322,"avatar_url":"https://avatars.githubusercontent.com/u/434322?v=3","gravatar_id":"","url":"https://api.github.com/users/sleroux","html_url":"https://github.com/sleroux","followers_url":"https://api.github.com/users/sleroux/followers","following_url":"https://api.github.com/users/sleroux/following{/other_user}","gists_url":"https://api.github.com/users/sleroux/gists{/gist_id}","starred_url":"https://api.github.com/users/sleroux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sleroux/subscriptions","organizations_url":"https://api.github.com/users/sleroux/orgs","repos_url":"https://api.github.com/users/sleroux/repos","events_url":"https://api.github.com/users/sleroux/events{/privacy}","received_events_url":"https://api.github.com/users/sleroux/received_events","type":"User","site_admin":false},"body":null,"created_at":"2016-01-06T16:59:12Z","updated_at":"2016-01-07T18:59:50Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b87a66b5c5dc789287e55f60417bbdf66d9abef0","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/mozilla/firefox-ios/pulls/1406/commits","review_comments_url":"https://api.github.com/repos/mozilla/firefox-ios/pulls/1406/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/1406/comments","statuses_url":"https://api.github.com/repos/mozilla/firefox-ios/statuses/3e0901a6680d5c1e23dcf81cdff0315cff4544c9","head":{"label":"mozilla:sleroux/Bug1221595-EditLoginDetail","ref":"sleroux/Bug1221595-EditLoginDetail","sha":"3e0901a6680d5c1e23dcf81cdff0315cff4544c9","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":"2016-01-07T11:44:37Z","pushed_at":"2016-01-07T18:14:07Z","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":115327,"stargazers_count":5168,"watchers_count":5168,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":936,"mirror_url":null,"open_issues_count":94,"forks":936,"open_issues":94,"watchers":5168,"default_branch":"master"}},"base":{"label":"mozilla:master","ref":"master","sha":"a39e055f41293abfe1ed1db35fc916a01dd8f3d2","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":"2016-01-07T11:44:37Z","pushed_at":"2016-01-07T18:14:07Z","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":115327,"stargazers_count":5168,"watchers_count":5168,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":936,"mirror_url":null,"open_issues_count":94,"forks":936,"open_issues":94,"watchers":5168,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mozilla/firefox-ios/pulls/1406"},"html":{"href":"https://github.com/mozilla/firefox-ios/pull/1406"},"issue":{"href":"https://api.github.com/repos/mozilla/firefox-ios/issues/1406"},"comments":{"href":"https://api.github.com/repos/mozilla/firefox-ios/issues/1406/comments"},"review_comments":{"href":"https://api.github.com/repos/mozilla/firefox-ios/pulls/1406/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/1406/commits"},"statuses":{"href":"https://api.github.com/repos/mozilla/firefox-ios/statuses/3e0901a6680d5c1e23dcf81cdff0315cff4544c9"}}}}