CB-8185 Use `navigator.onLine` as connection information source on browser platform
* add support for `online`/`offline` events for browser
diff --git a/README.md b/README.md
index 09320cf..93b3e67 100644
--- a/README.md
+++ b/README.md
@@ -121,6 +121,11 @@
- Firefox OS can't detect the type of cellular network connection.
- `navigator.connection.type` is set to `Connection.CELL` for all cellular data.
+### Browser Quirks
+
+- Browser can't detect the type of network connection.
+`navigator.connection.type` is always set to `Connection.UNKNOWN` when online.
+
# Network-related Events
## offline
diff --git a/plugin.xml b/plugin.xml
index 56e8405..870056e 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -166,8 +166,9 @@
<!-- browser -->
<platform name="browser">
- <js-module src="src/browser/NetworkProxy.js" name="NetworkProxy">
- <runs />
+ <js-module src="www/browser/network.js" name="browserNetwork">
+ <clobbers target="navigator.connection" />
+ <clobbers target="navigator.network.connection" />
</js-module>
</platform>
</plugin>
diff --git a/src/browser/NetworkProxy.js b/src/browser/NetworkProxy.js
deleted file mode 100644
index efcf73f..0000000
--- a/src/browser/NetworkProxy.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *
- * 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.
- *
- */
-
-/*
- Network API overview: http://www.w3.org/TR/netinfo-api/
- and http://w3c.github.io/netinfo/
-*/
-
-var cordova = require('cordova'),
- Connection = require('./Connection')
-
-module.exports = {
- getConnectionInfo: function(successCallback, errorCallback) {
- window.navigator.connection.type = Connection.NONE;
-
- var xhr = new XMLHttpRequest();
- xhr.open('GET', 'http://www.google.com', true);
-
- xhr.onload = function() {
- if (xhr.readyState === 4 && xhr.status === 200) {
- window.navigator.connection.type = Connection.WIFI;
- } else {
- window.navigator.connection.type = Connection.NONE;
- }
- };
-
- xhr.send();
-
- setTimeout(function() {
- successCallback(window.navigator.connection.type);
- }, 0);
- }
-};
-
-require("cordova/exec/proxy").add("NetworkStatus", module.exports);
diff --git a/www/browser/network.js b/www/browser/network.js
new file mode 100644
index 0000000..72ec513
--- /dev/null
+++ b/www/browser/network.js
@@ -0,0 +1,92 @@
+/*
+ * 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;
diff --git a/www/network.js b/www/network.js
index 9ffb745..6896956 100644
--- a/www/network.js
+++ b/www/network.js
@@ -26,7 +26,9 @@
// Link the onLine property with the Cordova-supplied network info.
// This works because we clobber the navigator object with our own
// object in bootstrap.js.
-if (typeof navigator != 'undefined') {
+// Browser platform do not need to define this property, because
+// it is already supported by modern browsers
+if (cordova.platforId !== 'browser' && typeof navigator != 'undefined') {
utils.defineGetter(navigator, 'onLine', function() {
return this.connection.type != 'none';
});