123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- // Copyright 2013 The Closure Library Authors. All Rights Reserved.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS-IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- /**
- * @fileoverview Utility functions for managing networking, such as
- * testing network connectivity.
- *
- * @visibility {:internal}
- */
- goog.provide('goog.labs.net.webChannel.netUtils');
- goog.require('goog.Uri');
- goog.require('goog.labs.net.webChannel.WebChannelDebug');
- goog.scope(function() {
- var netUtils = goog.labs.net.webChannel.netUtils;
- var WebChannelDebug = goog.labs.net.webChannel.WebChannelDebug;
- /**
- * Default timeout to allow for URI pings.
- * @type {number}
- */
- netUtils.NETWORK_TIMEOUT = 10000;
- /**
- * Pings the network with an image URI to check if an error is a server error
- * or user's network error.
- *
- * The caller needs to add a 'rand' parameter to make sure the response is
- * not fulfilled by browser cache.
- *
- * @param {function(boolean)} callback The function to call back with results.
- * @param {goog.Uri=} opt_imageUri The URI (of an image) to use for the network
- * test.
- */
- netUtils.testNetwork = function(callback, opt_imageUri) {
- var uri = opt_imageUri;
- if (!uri) {
- // default google.com image
- uri = new goog.Uri('//www.google.com/images/cleardot.gif');
- if (!(goog.global.location && goog.global.location.protocol == 'http')) {
- uri.setScheme('https'); // e.g. chrome-extension
- }
- uri.makeUnique();
- }
- netUtils.testLoadImage(uri.toString(), netUtils.NETWORK_TIMEOUT, callback);
- };
- /**
- * Test loading the given image, retrying if necessary.
- * @param {string} url URL to the image.
- * @param {number} timeout Milliseconds before giving up.
- * @param {function(boolean)} callback Function to call with results.
- * @param {number} retries The number of times to retry.
- * @param {number=} opt_pauseBetweenRetriesMS Optional number of milliseconds
- * between retries - defaults to 0.
- */
- netUtils.testLoadImageWithRetries = function(
- url, timeout, callback, retries, opt_pauseBetweenRetriesMS) {
- var channelDebug = new WebChannelDebug();
- channelDebug.debug('TestLoadImageWithRetries: ' + opt_pauseBetweenRetriesMS);
- if (retries == 0) {
- // no more retries, give up
- callback(false);
- return;
- }
- var pauseBetweenRetries = opt_pauseBetweenRetriesMS || 0;
- retries--;
- netUtils.testLoadImage(url, timeout, function(succeeded) {
- if (succeeded) {
- callback(true);
- } else {
- // try again
- goog.global.setTimeout(function() {
- netUtils.testLoadImageWithRetries(
- url, timeout, callback, retries, pauseBetweenRetries);
- }, pauseBetweenRetries);
- }
- });
- };
- /**
- * Test loading the given image.
- * @param {string} url URL to the image.
- * @param {number} timeout Milliseconds before giving up.
- * @param {function(boolean)} callback Function to call with results.
- */
- netUtils.testLoadImage = function(url, timeout, callback) {
- var channelDebug = new WebChannelDebug();
- channelDebug.debug('TestLoadImage: loading ' + url);
- var img = new Image();
- img.onload = goog.partial(
- netUtils.imageCallback_, channelDebug, img, 'TestLoadImage: loaded', true,
- callback);
- img.onerror = goog.partial(
- netUtils.imageCallback_, channelDebug, img, 'TestLoadImage: error', false,
- callback);
- img.onabort = goog.partial(
- netUtils.imageCallback_, channelDebug, img, 'TestLoadImage: abort', false,
- callback);
- img.ontimeout = goog.partial(
- netUtils.imageCallback_, channelDebug, img, 'TestLoadImage: timeout',
- false, callback);
- goog.global.setTimeout(function() {
- if (img.ontimeout) {
- img.ontimeout();
- }
- }, timeout);
- img.src = url;
- };
- /**
- * Wrap the image callback with debug and cleanup logic.
- * @param {!WebChannelDebug} channelDebug The WebChannelDebug object.
- * @param {!Image} img The image element.
- * @param {string} debugText The debug text.
- * @param {boolean} result The result of image loading.
- * @param {function(boolean)} callback The image callback.
- * @private
- */
- netUtils.imageCallback_ = function(
- channelDebug, img, debugText, result, callback) {
- try {
- channelDebug.debug(debugText);
- netUtils.clearImageCallbacks_(img);
- callback(result);
- } catch (e) {
- channelDebug.dumpException(e);
- }
- };
- /**
- * Clears handlers to avoid memory leaks.
- * @param {Image} img The image to clear handlers from.
- * @private
- */
- netUtils.clearImageCallbacks_ = function(img) {
- img.onload = null;
- img.onerror = null;
- img.onabort = null;
- img.ontimeout = null;
- };
- }); // goog.scope
|