blob: 72ec5139a22bf5976c6b24892d2184d5ee9fdbec [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*
*/
/*global module, require*/
var cordova = require('cordova'),
Connection = require('./Connection');
var DOCUMENT_EVENTS_CHECK_INTERVAL = 500; // ms
// Flag that indicates that ew need to re-fire online/offline events at document level
// (Workaround for Chrome, since it fires such events only for window object)
var NEED_FIRE_DOCUMENT_EVENT_MANUALLY = false;
function NetworkConnection() {
this.type = Connection.UNKNOWN;
}
/**
* Get connection info
*
* @param {Function} successCallback The function to call when the Connection data is available
*/
NetworkConnection.prototype.getInfo = function(successCallback) {
successCallback(this.type);
};
Object.defineProperty(NetworkConnection.prototype, 'type', {
get: function () {
// It is not possible to determine real connection type in browser
// so we always report Connection.UNKNOWN when online
return (window.navigator.onLine === false ? Connection.NONE : Connection.UNKNOWN);
},
configurable: true,
enumerable: true
});
// This function tries to detect if document online/offline events is being fired
// after corresponding window events, and if not, then fires them manually
// This is workaround for Chrome, which fires only window online/offline events
// and regarding to plugin spec we need these events at document object
var eventRedirectHandler = function (e) {
// NEED_FIRE_DOCUMENT_EVENT_MANUALLY flag is already set,
// just fire corresponding document event and return
if (NEED_FIRE_DOCUMENT_EVENT_MANUALLY) {
cordova.fireDocumentEvent(e.type);
return;
}
// Flag that indicates whether corresponding document even is fired
var documentStateEventFired = false;
var setDocumentStateEventFired = function() {
documentStateEventFired = true;
};
document.addEventListener(e.type, setDocumentStateEventFired);
setTimeout(function () {
// Remove unnecessary listener
document.removeEventListener(e.type, setDocumentStateEventFired);
// if document event hasn't been fired in specified interval (500 ms by default),
// then we're in chrome and need to fire it manually
if (!documentStateEventFired) {
NEED_FIRE_DOCUMENT_EVENT_MANUALLY = true;
cordova.fireDocumentEvent(e.type);
}
}, DOCUMENT_EVENTS_CHECK_INTERVAL);
};
// Subscribe to native online/offline events
window.addEventListener('online', eventRedirectHandler);
window.addEventListener('offline', eventRedirectHandler);
var me = new NetworkConnection();
require("cordova/exec/proxy").add("NetworkStatus", { getConnectionInfo: me.getConnectionInfo });
module.exports = me;