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