141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// Copyright (c) 2012 The Chromium Authors. All rights reserved.
241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// Use of this source code is governed by a BSD-style license that can be
341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org// found in the LICENSE file.
441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgfunction validateLinks(links, callback) {
641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  var results = [];
741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  var pendingRequests = 0;
841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  function fetchLink(link) {
1041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    if (!/^http(s?):\/\//.test(link.href))
1141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      return;
1241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    var xhr = new XMLHttpRequest();
1341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xhr.open("HEAD", link.href, true);
1441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    xhr.onreadystatechange = function() {
1541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      if (xhr.readyState < xhr.HEADERS_RECEIVED || xhr.processed)
1641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        return;
1741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      if (!xhr.status || xhr.status >= 400) {
1841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        results.push({
1941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            href: link.href,
2041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            text: link.text,
2141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org            status: xhr.statusText
2241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        });
2341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      }
2441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      xhr.processed = true;
2541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      xhr.abort();
2641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      if (!--pendingRequests) {
2741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org        callback({ total: links.length, badlinks: results });
2841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      }
2941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
3041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    try {
3141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      xhr.send(null);
3241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      pendingRequests++;
3341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    } catch (e) {
3441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      console.error("XHR failed for " + link.href + ", " + e);
3541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    }
3641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  }
3741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
3841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  for (var i = 0; i < links.length; ++i)
3941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    fetchLink(links[i]);
4041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org}
4141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org
4241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.orgchrome.extension.onRequest.addListener(function(request, sender, callback) {
4341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  var tabId = request.tabId;
4441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  chrome.tabs.executeScript(tabId, { file: "content.js" }, function() {
4541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    chrome.tabs.sendRequest(tabId, {}, function(results) {
4641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org      validateLinks(results, callback);
4741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    });
4841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org  });
4941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org});
5041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org