• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Event listner for clicks on links in a browser action popup.
2// Open the link in a new tab of the current window.
3function onAnchorClick(event) {
4  chrome.tabs.create({
5    selected: true,
6    url: event.srcElement.href
7  });
8  return false;
9}
10
11// Given an array of URLs, build a DOM list of those URLs in the
12// browser action popup.
13function buildPopupDom(divName, data) {
14  var popupDiv = document.getElementById(divName);
15
16  var ul = document.createElement('ul');
17  popupDiv.appendChild(ul);
18
19  for (var i = 0, ie = data.length; i < ie; ++i) {
20    var a = document.createElement('a');
21    a.href = data[i];
22    a.appendChild(document.createTextNode(data[i]));
23    a.addEventListener('click', onAnchorClick);
24
25    var li = document.createElement('li');
26    li.appendChild(a);
27
28    ul.appendChild(li);
29  }
30}
31
32// Search history to find up to ten links that a user has typed in,
33// and show those links in a popup.
34function buildTypedUrlList(divName) {
35  // To look for history items visited in the last week,
36  // subtract a week of microseconds from the current time.
37  var microsecondsPerWeek = 1000 * 60 * 60 * 24 * 7;
38  var oneWeekAgo = (new Date).getTime() - microsecondsPerWeek;
39
40  // Track the number of callbacks from chrome.history.getVisits()
41  // that we expect to get.  When it reaches zero, we have all results.
42  var numRequestsOutstanding = 0;
43
44  chrome.history.search({
45      'text': '',              // Return every history item....
46      'startTime': oneWeekAgo  // that was accessed less than one week ago.
47    },
48    function(historyItems) {
49      // For each history item, get details on all visits.
50      for (var i = 0; i < historyItems.length; ++i) {
51        var url = historyItems[i].url;
52        var processVisitsWithUrl = function(url) {
53          // We need the url of the visited item to process the visit.
54          // Use a closure to bind the  url into the callback's args.
55          return function(visitItems) {
56            processVisits(url, visitItems);
57          };
58        };
59        chrome.history.getVisits({url: url}, processVisitsWithUrl(url));
60        numRequestsOutstanding++;
61      }
62      if (!numRequestsOutstanding) {
63        onAllVisitsProcessed();
64      }
65    });
66
67
68  // Maps URLs to a count of the number of times the user typed that URL into
69  // the omnibox.
70  var urlToCount = {};
71
72  // Callback for chrome.history.getVisits().  Counts the number of
73  // times a user visited a URL by typing the address.
74  var processVisits = function(url, visitItems) {
75    for (var i = 0, ie = visitItems.length; i < ie; ++i) {
76      // Ignore items unless the user typed the URL.
77      if (visitItems[i].transition != 'typed') {
78        continue;
79      }
80
81      if (!urlToCount[url]) {
82        urlToCount[url] = 0;
83      }
84
85      urlToCount[url]++;
86    }
87
88    // If this is the final outstanding call to processVisits(),
89    // then we have the final results.  Use them to build the list
90    // of URLs to show in the popup.
91    if (!--numRequestsOutstanding) {
92      onAllVisitsProcessed();
93    }
94  };
95
96  // This function is called when we have the final list of URls to display.
97  var onAllVisitsProcessed = function() {
98    // Get the top scorring urls.
99    urlArray = [];
100    for (var url in urlToCount) {
101      urlArray.push(url);
102    }
103
104    // Sort the URLs by the number of times the user typed them.
105    urlArray.sort(function(a, b) {
106      return urlToCount[b] - urlToCount[a];
107    });
108
109    buildPopupDom(divName, urlArray.slice(0, 10));
110  };
111}
112
113
114