{"action":"created","comment":{"url":"https://api.github.com/repos/mozilla/newtab-dev/pulls/comments/38250524","id":38250524,"diff_hunk":"@@ -0,0 +1,258 @@\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 file,\n+ * You can obtain one at http://mozilla.org/MPL/2.0/. */\n+\n+/* global XPCOMUtils, Services, BinarySearch, PlacesUtils, gPrincipal, EventEmitter */\n+/* exported PlacesProvider */\n+\n+\"use strict\";\n+\n+this.EXPORTED_SYMBOLS = [\"PlacesProvider\"];\n+\n+const {interfaces: Ci, utils: Cu} = Components;\n+Cu.import(\"resource://gre/modules/Services.jsm\");\n+Cu.import(\"resource://gre/modules/XPCOMUtils.jsm\");\n+\n+XPCOMUtils.defineLazyModuleGetter(this, \"BinarySearch\",\n+  \"resource://gre/modules/BinarySearch.jsm\");\n+\n+XPCOMUtils.defineLazyModuleGetter(this, \"PlacesUtils\",\n+  \"resource://gre/modules/PlacesUtils.jsm\");\n+\n+XPCOMUtils.defineLazyGetter(this, \"EventEmitter\", function() {\n+  const {EventEmitter} = Cu.import(\"resource://gre/modules/devtools/event-emitter.js\", {});\n+  return EventEmitter;\n+});\n+\n+XPCOMUtils.defineLazyGetter(this, \"gPrincipal\", function() {\n+  let uri = Services.io.newURI(\"about:newtab\", null, null);\n+  return Services.scriptSecurityManager.getNoAppCodebasePrincipal(uri);\n+});\n+\n+// The maximum number of results PlacesProvider retrieves from history.\n+const HISTORY_RESULTS_LIMIT = 100;\n+\n+/**\n+ * Singleton that checks if a given link should be displayed on about:newtab\n+ * or if we should rather not do it for security reasons. URIs that inherit\n+ * their caller's principal will be filtered.\n+ */\n+let LinkChecker = {\n+  _cache: {},\n+\n+  get flags() {\n+    return Ci.nsIScriptSecurityManager.DISALLOW_INHERIT_PRINCIPAL |\n+           Ci.nsIScriptSecurityManager.DONT_REPORT_ERRORS;\n+  },\n+\n+  checkLoadURI: function LinkChecker_checkLoadURI(aURI) {\n+    if (!(aURI in this._cache)) {\n+      this._cache[aURI] = this._doCheckLoadURI(aURI);\n+    }\n+\n+    return this._cache[aURI];\n+  },\n+\n+  _doCheckLoadURI: function LinkChecker_doCheckLoadURI(aURI) {\n+    try {\n+      Services.scriptSecurityManager.\n+        checkLoadURIStrWithPrincipal(gPrincipal, aURI, this.flags);\n+      return true;\n+    } catch (e) {\n+      // We got a weird URI or one that would inherit the caller's principal.\n+      return false;\n+    }\n+  }\n+};\n+\n+/**\n+ * Singleton that provides utility functions for links.\n+ * A link is a plain object that looks like this:\n+ *\n+ * {\n+ *   url: \"http://www.mozilla.org/\",\n+ *   title: \"Mozilla\",\n+ *   frecency: 1337,\n+ *   lastVisitDate: 1394678824766431,\n+ * }\n+ */\n+let LinkUtils = {\n+  _sortProperties: [\n+    \"frecency\",\n+    \"lastVisitDate\",\n+    \"url\",\n+  ],\n+\n+  /**\n+   * Compares two links.\n+   *\n+   * @param {String} aLink1 The first link.\n+   * @param {String} aLink2 The second link.\n+   * @return {Number} A negative number if aLink1 is ordered before aLink2, zero if\n+   *         aLink1 and aLink2 have the same ordering, or a positive number if\n+   *         aLink1 is ordered after aLink2.\n+   *         Order is ascending.\n+   */\n+  compareLinks: function LinkUtils_compareLinks(aLink1, aLink2) {\n+    for (let prop of this._sortProperties) {\n+      if (!(prop in aLink1) || !(prop in aLink2)) {\n+        throw new Error(\"Comparable link missing required property: \" + prop);\n+      }\n+    }\n+    return aLink2.frecency - aLink1.frecency ||\n+           aLink2.lastVisitDate - aLink1.lastVisitDate ||\n+           aLink1.url.localeCompare(aLink2.url);\n+  },\n+};\n+\n+/**\n+ * Singleton that serves as the default link provider for the grid. It queries\n+ * the history to retrieve the most frequently visited sites.\n+ */\n+let Links = {\n+  /**\n+   * EventEmitter interface\n+   */\n+  eventEmitter: new EventEmitter(),\n+  on: (...params) => this.eventEmitter.on(...params),\n+  once: (...params) => this.eventEmitter.once(...params),\n+  off: (...params) => this.eventEmitter.off(...params),\n+\n+  /**\n+   * Set this to change the maximum number of links the provider will provide.\n+   */\n+  maxNumLinks: HISTORY_RESULTS_LIMIT,\n+\n+  /**\n+   * A set of functions called by @mozilla.org/browser/nav-historyservice\n+   * All history events are emitted from this object.\n+   */\n+  historyObserver: {\n+    onDeleteURI: function PlacesProvider_onDeleteURI(aURI) {\n+      // let observers remove sensetive data associated with deleted visit\n+      Links.eventEmitter.emit(\"deleteURI\", {\n+        url: aURI.spec,\n+      });\n+    },\n+\n+    onClearHistory: function() {\n+      Links.eventEmitter.emit(\"clearHistory\");\n+    },\n+\n+    onFrecencyChanged: function PlacesProvider_onFrecencyChanged(aURI,\n+                           aNewFrecency, aGUID, aHidden, aLastVisitDate) { // jshint ignore:line\n+      // The implementation of the query in getLinks excludes hidden and\n+      // unvisited pages, so it's important to exclude them here, too.\n+      if (!aHidden && aLastVisitDate) {\n+        Links.eventEmitter.emit(\"linkChanged\", {\n+          url: aURI.spec,\n+          frecency: aNewFrecency,\n+          lastVisitDate: aLastVisitDate,\n+          type: \"history\",\n+        });\n+      }\n+    },\n+\n+    onManyFrecenciesChanged: function PlacesProvider_onManyFrecenciesChanged() {\n+      Links.eventEmitter.emit(\"manyLinksChanged\");\n+    },\n+\n+    onTitleChanged: function PlacesProvider_onTitleChanged(aURI, aNewTitle) {\n+      Links.eventEmitter.emit(\"linkChanged\", {\n+        url: aURI.spec,\n+        title: aNewTitle\n+      });\n+    },\n+\n+    QueryInterface: XPCOMUtils.generateQI([Ci.nsINavHistoryObserver,\n+                        Ci.nsISupportsWeakReference])\n+  },\n+\n+  /**\n+   * Must be called before the provider is used.\n+   */\n+  init: function PlacesProvider_init() {\n+    PlacesUtils.history.addObserver(this.historyObserver, true);\n+  },\n+\n+  /**\n+   * Gets the current set of links delivered by this provider.\n+   *\n+   * @returns {Promise} Returns a promise with the array of links as payload.\n+   */\n+  getLinks: function PlacesProvider_getLinks() {\n+    let getLinksPromise = new Promise((resolve, reject) => {\n+      let options = PlacesUtils.history.getNewQueryOptions();\n+      options.maxResults = this.maxNumLinks;\n+\n+      // Sort by frecency, descending.\n+      options.sortingMode = Ci.nsINavHistoryQueryOptions\n+        .SORT_BY_FRECENCY_DESCENDING;\n+\n+      let links = [];\n+\n+      let callback = {\n+        handleResult: function(aResultSet) {\n+          let row;\n+\n+          while ((row = aResultSet.getNextRow())) {\n+            let url = row.getResultByIndex(1);\n+            if (LinkChecker.checkLoadURI(url)) {\n+              let title = row.getResultByIndex(2);","path":"browser/modules/PlacesProvider.jsm","position":201,"original_position":201,"commit_id":"aa1595db069ecc961fd741a905e4afa3ef71fade","original_commit_id":"aa1595db069ecc961fd741a905e4afa3ef71fade","user":{"login":"marcoscaceres","id":870154,"avatar_url":"https://avatars.githubusercontent.com/u/870154?v=3","gravatar_id":"","url":"https://api.github.com/users/marcoscaceres","html_url":"https://github.com/marcoscaceres","followers_url":"https://api.github.com/users/marcoscaceres/followers","following_url":"https://api.github.com/users/marcoscaceres/following{/other_user}","gists_url":"https://api.github.com/users/marcoscaceres/gists{/gist_id}","starred_url":"https://api.github.com/users/marcoscaceres/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/marcoscaceres/subscriptions","organizations_url":"https://api.github.com/users/marcoscaceres/orgs","repos_url":"https://api.github.com/users/marcoscaceres/repos","events_url":"https://api.github.com/users/marcoscaceres/events{/privacy}","received_events_url":"https://api.github.com/users/marcoscaceres/received_events","type":"User","site_admin":false},"body":"Fixed code in comment above. ","created_at":"2015-08-28T22:26:15Z","updated_at":"2015-08-28T22:26:15Z","html_url":"https://github.com/mozilla/newtab-dev/pull/9#discussion_r38250524","pull_request_url":"https://api.github.com/repos/mozilla/newtab-dev/pulls/9","_links":{"self":{"href":"https://api.github.com/repos/mozilla/newtab-dev/pulls/comments/38250524"},"html":{"href":"https://github.com/mozilla/newtab-dev/pull/9#discussion_r38250524"},"pull_request":{"href":"https://api.github.com/repos/mozilla/newtab-dev/pulls/9"}}},"pull_request":{"url":"https://api.github.com/repos/mozilla/newtab-dev/pulls/9","id":43664894,"html_url":"https://github.com/mozilla/newtab-dev/pull/9","diff_url":"https://github.com/mozilla/newtab-dev/pull/9.diff","patch_url":"https://github.com/mozilla/newtab-dev/pull/9.patch","issue_url":"https://api.github.com/repos/mozilla/newtab-dev/issues/9","number":9,"state":"open","locked":false,"title":"Bug 1196755 implement placesprovider jsm as service","user":{"login":"oyiptong","id":9365,"avatar_url":"https://avatars.githubusercontent.com/u/9365?v=3","gravatar_id":"","url":"https://api.github.com/users/oyiptong","html_url":"https://github.com/oyiptong","followers_url":"https://api.github.com/users/oyiptong/followers","following_url":"https://api.github.com/users/oyiptong/following{/other_user}","gists_url":"https://api.github.com/users/oyiptong/gists{/gist_id}","starred_url":"https://api.github.com/users/oyiptong/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oyiptong/subscriptions","organizations_url":"https://api.github.com/users/oyiptong/orgs","repos_url":"https://api.github.com/users/oyiptong/repos","events_url":"https://api.github.com/users/oyiptong/events{/privacy}","received_events_url":"https://api.github.com/users/oyiptong/received_events","type":"User","site_admin":false},"body":"Feedback requested about EventEmitter interface\r\n\r\n@marcoscaceres @emtwo @sarracini \r\n\r\nThis is still a WIP\r\n\r\nPlease pay particular attention to the EventEmitter interface.\r\nI propose we use the same interface for the upcoming Thumbs Storage, Pref and Idle Daily observers/emitters","created_at":"2015-08-28T19:47:12Z","updated_at":"2015-08-28T22:26:15Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9be709333664188676f714fdb450a229710726ee","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/mozilla/newtab-dev/pulls/9/commits","review_comments_url":"https://api.github.com/repos/mozilla/newtab-dev/pulls/9/comments","review_comment_url":"https://api.github.com/repos/mozilla/newtab-dev/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mozilla/newtab-dev/issues/9/comments","statuses_url":"https://api.github.com/repos/mozilla/newtab-dev/statuses/aa1595db069ecc961fd741a905e4afa3ef71fade","head":{"label":"mozilla:bug_1196755_implement_placesprovider_jsm_as_service","ref":"bug_1196755_implement_placesprovider_jsm_as_service","sha":"aa1595db069ecc961fd741a905e4afa3ef71fade","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":41306135,"name":"newtab-dev","full_name":"mozilla/newtab-dev","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/newtab-dev","description":"Repo following geck-dev for newtab development","fork":false,"url":"https://api.github.com/repos/mozilla/newtab-dev","forks_url":"https://api.github.com/repos/mozilla/newtab-dev/forks","keys_url":"https://api.github.com/repos/mozilla/newtab-dev/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mozilla/newtab-dev/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mozilla/newtab-dev/teams","hooks_url":"https://api.github.com/repos/mozilla/newtab-dev/hooks","issue_events_url":"https://api.github.com/repos/mozilla/newtab-dev/issues/events{/number}","events_url":"https://api.github.com/repos/mozilla/newtab-dev/events","assignees_url":"https://api.github.com/repos/mozilla/newtab-dev/assignees{/user}","branches_url":"https://api.github.com/repos/mozilla/newtab-dev/branches{/branch}","tags_url":"https://api.github.com/repos/mozilla/newtab-dev/tags","blobs_url":"https://api.github.com/repos/mozilla/newtab-dev/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mozilla/newtab-dev/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mozilla/newtab-dev/git/refs{/sha}","trees_url":"https://api.github.com/repos/mozilla/newtab-dev/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mozilla/newtab-dev/statuses/{sha}","languages_url":"https://api.github.com/repos/mozilla/newtab-dev/languages","stargazers_url":"https://api.github.com/repos/mozilla/newtab-dev/stargazers","contributors_url":"https://api.github.com/repos/mozilla/newtab-dev/contributors","subscribers_url":"https://api.github.com/repos/mozilla/newtab-dev/subscribers","subscription_url":"https://api.github.com/repos/mozilla/newtab-dev/subscription","commits_url":"https://api.github.com/repos/mozilla/newtab-dev/commits{/sha}","git_commits_url":"https://api.github.com/repos/mozilla/newtab-dev/git/commits{/sha}","comments_url":"https://api.github.com/repos/mozilla/newtab-dev/comments{/number}","issue_comment_url":"https://api.github.com/repos/mozilla/newtab-dev/issues/comments{/number}","contents_url":"https://api.github.com/repos/mozilla/newtab-dev/contents/{+path}","compare_url":"https://api.github.com/repos/mozilla/newtab-dev/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mozilla/newtab-dev/merges","archive_url":"https://api.github.com/repos/mozilla/newtab-dev/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mozilla/newtab-dev/downloads","issues_url":"https://api.github.com/repos/mozilla/newtab-dev/issues{/number}","pulls_url":"https://api.github.com/repos/mozilla/newtab-dev/pulls{/number}","milestones_url":"https://api.github.com/repos/mozilla/newtab-dev/milestones{/number}","notifications_url":"https://api.github.com/repos/mozilla/newtab-dev/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mozilla/newtab-dev/labels{/name}","releases_url":"https://api.github.com/repos/mozilla/newtab-dev/releases{/id}","created_at":"2015-08-24T13:57:42Z","updated_at":"2015-08-24T15:48:21Z","pushed_at":"2015-08-28T20:11:34Z","git_url":"git://github.com/mozilla/newtab-dev.git","ssh_url":"git@github.com:mozilla/newtab-dev.git","clone_url":"https://github.com/mozilla/newtab-dev.git","svn_url":"https://github.com/mozilla/newtab-dev","homepage":"","size":2411376,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":6,"forks":1,"open_issues":6,"watchers":0,"default_branch":"master"}},"base":{"label":"mozilla:master","ref":"master","sha":"61acc456ad99e72ffbd3c8b2ab8eb01699946578","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":41306135,"name":"newtab-dev","full_name":"mozilla/newtab-dev","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/newtab-dev","description":"Repo following geck-dev for newtab development","fork":false,"url":"https://api.github.com/repos/mozilla/newtab-dev","forks_url":"https://api.github.com/repos/mozilla/newtab-dev/forks","keys_url":"https://api.github.com/repos/mozilla/newtab-dev/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mozilla/newtab-dev/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mozilla/newtab-dev/teams","hooks_url":"https://api.github.com/repos/mozilla/newtab-dev/hooks","issue_events_url":"https://api.github.com/repos/mozilla/newtab-dev/issues/events{/number}","events_url":"https://api.github.com/repos/mozilla/newtab-dev/events","assignees_url":"https://api.github.com/repos/mozilla/newtab-dev/assignees{/user}","branches_url":"https://api.github.com/repos/mozilla/newtab-dev/branches{/branch}","tags_url":"https://api.github.com/repos/mozilla/newtab-dev/tags","blobs_url":"https://api.github.com/repos/mozilla/newtab-dev/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mozilla/newtab-dev/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mozilla/newtab-dev/git/refs{/sha}","trees_url":"https://api.github.com/repos/mozilla/newtab-dev/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mozilla/newtab-dev/statuses/{sha}","languages_url":"https://api.github.com/repos/mozilla/newtab-dev/languages","stargazers_url":"https://api.github.com/repos/mozilla/newtab-dev/stargazers","contributors_url":"https://api.github.com/repos/mozilla/newtab-dev/contributors","subscribers_url":"https://api.github.com/repos/mozilla/newtab-dev/subscribers","subscription_url":"https://api.github.com/repos/mozilla/newtab-dev/subscription","commits_url":"https://api.github.com/repos/mozilla/newtab-dev/commits{/sha}","git_commits_url":"https://api.github.com/repos/mozilla/newtab-dev/git/commits{/sha}","comments_url":"https://api.github.com/repos/mozilla/newtab-dev/comments{/number}","issue_comment_url":"https://api.github.com/repos/mozilla/newtab-dev/issues/comments{/number}","contents_url":"https://api.github.com/repos/mozilla/newtab-dev/contents/{+path}","compare_url":"https://api.github.com/repos/mozilla/newtab-dev/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mozilla/newtab-dev/merges","archive_url":"https://api.github.com/repos/mozilla/newtab-dev/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mozilla/newtab-dev/downloads","issues_url":"https://api.github.com/repos/mozilla/newtab-dev/issues{/number}","pulls_url":"https://api.github.com/repos/mozilla/newtab-dev/pulls{/number}","milestones_url":"https://api.github.com/repos/mozilla/newtab-dev/milestones{/number}","notifications_url":"https://api.github.com/repos/mozilla/newtab-dev/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mozilla/newtab-dev/labels{/name}","releases_url":"https://api.github.com/repos/mozilla/newtab-dev/releases{/id}","created_at":"2015-08-24T13:57:42Z","updated_at":"2015-08-24T15:48:21Z","pushed_at":"2015-08-28T20:11:34Z","git_url":"git://github.com/mozilla/newtab-dev.git","ssh_url":"git@github.com:mozilla/newtab-dev.git","clone_url":"https://github.com/mozilla/newtab-dev.git","svn_url":"https://github.com/mozilla/newtab-dev","homepage":"","size":2411376,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":6,"forks":1,"open_issues":6,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mozilla/newtab-dev/pulls/9"},"html":{"href":"https://github.com/mozilla/newtab-dev/pull/9"},"issue":{"href":"https://api.github.com/repos/mozilla/newtab-dev/issues/9"},"comments":{"href":"https://api.github.com/repos/mozilla/newtab-dev/issues/9/comments"},"review_comments":{"href":"https://api.github.com/repos/mozilla/newtab-dev/pulls/9/comments"},"review_comment":{"href":"https://api.github.com/repos/mozilla/newtab-dev/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mozilla/newtab-dev/pulls/9/commits"},"statuses":{"href":"https://api.github.com/repos/mozilla/newtab-dev/statuses/aa1595db069ecc961fd741a905e4afa3ef71fade"}}}}