Exemplo n.º 1
0
      onInit: function(panel) {
        this._settings = navigator.mozSettings;
        this._wifiSectionVisible = true;
        this._scanPending = false;

        elements = {
          panel: panel,
          wifi: panel,
          wpsColumn: panel.querySelector('.wps-column'),
          wpsInfoBlock: panel.querySelector('.wps-column small'),
          wpsPbcLabelBlock: panel.querySelector('.wps-column a'),
          manageNetworksBtn: panel.querySelector('.manageNetworks'),
          wifiCheckbox: panel.querySelector('.wifi-enabled input'),
          manageCertificatesBtn: panel.querySelector('.manageCertificates'),
          wifiAvailableNetworks: panel.querySelector('.wifi-availableNetworks'),
        };

        elements.infoItem = elements.wifiAvailableNetworks.querySelector(
          'li[data-state="on"]');
        elements.scanItem = elements.wifiAvailableNetworks.querySelector(
          'li[data-state="ready"]');
        elements.wifiItem = elements.wifiAvailableNetworks.querySelector(
          'li:not([data-state])');

        elements.networklist = {
          infoItem: elements.infoItem,
          scanItem: elements.scanItem,
          wifiAvailableNetworks: elements.wifiAvailableNetworks
        };

        elements.wps = {
          wpsColumn: elements.wpsColumn,
          wpsInfoBlock: elements.wpsInfoBlock,
          wpsPbcLabelBlock: elements.wpsPbcLabelBlock
        };

        this._networkList = WifiNetworkList(elements.networklist);
        this._wps = WifiWps();
        this._wps.addEventListener('statusreset', function() {
          elements.wps.wpsPbcLabelBlock.setAttribute('data-l10n-id',
                                                     'wpsMessage');
          setTimeout(function resetWpsInfoBlock() {
            elements.wps.wpsPbcLabelBlock.setAttribute('data-l10n-id',
                                                       'wpsDescription2');
          }, 1500);
        });

        SettingsListener.observe('wifi.enabled', true, function(enabled) {
          this._setMozSettingsEnabled(enabled);
          if (enabled) {
            this._updateNetworkState();
            this._networkList.scan();
          }
        }.bind(this));

        // element related events
        elements.scanItem.addEventListener('click',
          this._onScanItemClick.bind(this));

        elements.wifiCheckbox.addEventListener('click',
          this._onWifiCheckboxClick.bind(this));

        elements.wpsColumn.addEventListener('click',
          this._onWpsColumnClick.bind(this));

        elements.manageCertificatesBtn.addEventListener('click', function() {
          SettingsUtils.openDialog('wifi-manageCertificates');
        });

        elements.manageNetworksBtn.addEventListener('click', function() {
          SettingsUtils.openDialog('wifi-manageNetworks');
        });

        // wifiContext related events
        WifiContext.addEventListener('wifiEnabled', function() {
          elements.wifiCheckbox.disabled = false;
          this._updateNetworkState();
          this._networkList.scan();
        }.bind(this));

        WifiContext.addEventListener('wifiDisabled', function() {
          elements.wifiCheckbox.disabled = false;
          // Re-enable UI toggle
          this._networkList.clear(false);
          this._networkList.autoscan = false;
        }.bind(this));

        WifiContext.addEventListener('wifiStatusChange', function(event) {
          var scanStates =
            new Set(['connected', 'connectingfailed', 'disconnected']);

          this._updateNetworkState();
          if (scanStates.has(event.status)) {
            if (this._wifiSectionVisible) {
              this._networkList.scan();
            } else {
              this._scanPending = true;
            }
          }
        }.bind(this));
      },
Exemplo n.º 2
0
  var WifiNetworkList = function(elements) {
    var list = elements.wifiAvailableNetworks;

    var wifiNetworkList = {
      _scanRate: 5000, // 5s after last scan results
      _scanning: false,
      _autoscan: false,
      _index: {}, // index of all scanned networks
      _networks: {},
      _list: elements.wifiAvailableNetworks,
      clear: function(addScanningItem) {
        // clear the network list
        this._index = {};
        this._networks = {};

        // remove all items except the text expl.
        // and the "search again" button
        var wifiItems = list.querySelectorAll('li:not([data-state])');
        var len = wifiItems.length;
        for (var i = len - 1; i >= 0; i--) {
          list.removeChild(wifiItems[i]);
        }

        list.dataset.state = addScanningItem ? 'on' : 'off';
      },
      scan: function() {
        window.performance.measure('settingsPanelWifiVisible', 'wifiListStart');

        // scan wifi networks and display them in the list
        var self = this;
        if (this._scanning) {
          return;
        }

        // stop auto-scanning if wifi disabled or the app is hidden
        if (!wifiManager.enabled || document.hidden) {
          this._scanning = false;
          return;
        }

        this._scanning = true;
        var req = WifiHelper.getAvailableAndKnownNetworks();

        req.onsuccess = function onScanSuccess() {
          self.clear(false);
          var allNetworks = req.result;
          var network;

          for (var i = 0; i < allNetworks.length; ++i) {
            network = allNetworks[i];
            var key = WifiUtils.getNetworkKey(network);
            // keep connected network first, or select the highest strength
            if (!self._networks[key] || network.connected) {
              self._networks[key] = network;
            } else {
              if (!self._networks[key].connected &&
                network.relSignalStrength >
                  self._networks[key].relSignalStrength) {
                    self._networks[key] = network;
              }
            }
          }

          var networkKeys = Object.getOwnPropertyNames(self._networks);

          // display network list
          if (networkKeys.length) {
            // sort networks by name and signal strength
            networkKeys.sort(function(a, b) {
              let barDelta =
                WifiHelper.getSignalLevel(self._networks[b]) -
                WifiHelper.getSignalLevel(self._networks[a]);
              // If two networks have the same signal strength,
              // then sort by name.
              return (barDelta ? barDelta : a.localeCompare(b));
            });

            // add detected networks
            for (var j = 0; j < networkKeys.length; j++) {
              network = self._networks[networkKeys[j]];
              var listItem = WifiUtils.newListItem({
                network: network,
                onClick: self._toggleNetwork.bind(self),
                showNotInRange: true
              });
              // put connected network on top of list
              if (WifiHelper.isConnected(network)) {
                list.insertBefore(listItem,
                  elements.infoItem.nextSibling);
              } else {
                list.insertBefore(listItem, elements.scanItem);
              }
              // add composited key to index
              self._index[networkKeys[j]] = listItem;
            }
          } else {
            // display a "no networks found" message if necessary
            list.insertBefore(
              WifiUtils.newExplanationItem('noNetworksFound'),
                elements.scanItem);
          }

          // display the "Search Again" button
          list.dataset.state = 'ready';

          window.performance.measure('settingsPanelWifiReady', 'wifiListStart');

          // auto-rescan if requested
          if (self._autoscan) {
            window.setTimeout(self.scan.bind(self), self._scanRate);
          }

          self._scanning = false;
        };

        req.onerror = function onScanError(error) {
          // always try again.
          self._scanning = false;

          window.performance.measure('settingsPanelWifiReady', 'wifiListStart');

          window.setTimeout(self.scan.bind(self), self._scanRate);
        };
      },
      getWpsAvailableNetworks: function() {
        // get WPS available networks
        var ssids = Object.getOwnPropertyNames(this._networks);
        var wpsAvailableNetworks = [];
        for (var i = 0; i < ssids.length; i++) {
          var network = this._networks[ssids[i]];
          if (WifiHelper.isWpsAvailable(network)) {
            wpsAvailableNetworks.push(network);
          }
        }
        return wpsAvailableNetworks;
      },
      set autoscan(value) {
        this._autoscan = value;
      },
      get autoscan() {
        return this._autoscan;
      },
      get scanning() {
        return this._scanning;
      },
      _toggleNetwork: function(network) {
        var self = this;

        var keys = WifiHelper.getSecurity(network);
        var security = (keys && keys.length) ? keys.join(', ') : '';
        var sl = WifiHelper.getSignalLevel(network);

        if (WifiHelper.isConnected(network)) {
          // online: show status + offer to disconnect
          DialogService.show('wifi-status', {
            sl: sl,
            network: network,
            security: security,
          }).then(function(result) {
            var type = result.type;
            if (type === 'submit') {
              WifiContext.forgetNetwork(network, function() {
                self.scan();
              });
            }
          });
        } else if (network.password && (network.password == '*')) {
          // offline, known network (hence the '*' password value):
          // no further authentication required.
          WifiHelper.setPassword(network);
          WifiContext.associateNetwork(network);
        } else {
          // offline, unknown network: propose to connect
          var key = WifiHelper.getKeyManagement(network);
          switch (key) {
            case 'WEP':
            case 'WPA-PSK':
            case 'WPA-EAP':
              DialogService.show('wifi-auth', {
                sl: sl,
                security: security,
                network: network,
              }).then(function(result) {
                var type = result.type;
                var authOptions = result.value;
                if (type === 'submit') {
                  WifiHelper.setPassword(
                    network,
                    authOptions.password,
                    authOptions.identity,
                    authOptions.eap,
                    authOptions.authPhase2,
                    authOptions.certificate
                  );
                  WifiContext.associateNetwork(network);
                }
              });
              break;
            default:
              WifiContext.associateNetwork(network);
              break;
          }
        }
      }
    };

    // networkStatus has one of the following values:
    // connecting, associated, connected, connectingfailed, disconnected.
    WifiContext.addEventListener('wifiEnabled', function(event) {
      WifiUtils.updateListItemStatus({
        listItems: wifiNetworkList._index,
        activeItemDOM: list.querySelector('.active'),
        network: event.network,
        networkStatus: event.status
      });
    });

    WifiContext.addEventListener('wifiStatusChange', function(event) {
      WifiUtils.updateListItemStatus({
        listItems: wifiNetworkList._index,
        activeItemDOM: list.querySelector('.active'),
        network: event.network,
        networkStatus: event.status
      });
    });

    WifiContext.addEventListener('wifiConnectionInfoUpdate', function(event) {
      WifiUtils.updateNetworkSignal(event.network, event.relSignalStrength);
    });

    WifiContext.addEventListener('wifiNetworkForgotten', event => {
      var networkKey = WifiUtils.getNetworkKey(event.network);
      var forgottenNetwork = wifiNetworkList._networks[networkKey];
      if (forgottenNetwork) {
        forgottenNetwork.password = '';
      }
    });

    return wifiNetworkList;
  };
Exemplo n.º 3
0
      onInit: function(panel) {
        this._settings = navigator.mozSettings;
        this._wifiSectionVisible = true;
        this._scanPending = false;
        this._networkListPromise = null;
        this._initialized = false;

        elements = {
          panel: panel,
          wifi: panel,
          wpsColumn: panel.querySelector('.wps-column'),
          wpsInfoBlock: panel.querySelector('.wps-column small'),
          wpsPbcLabelBlock: panel.querySelector('.wps-column span'),
          wifiCheckbox: panel.querySelector('.wifi-enabled input'),
          wifiAvailableNetworks: panel.querySelector('.wifi-availableNetworks'),
          dialogElement: panel.querySelector('.wifi-bad-credentials-dialog'),
          okBtn: panel.querySelector('.wifi-bad-credentials-confirm'),
          cancelBtn: panel.querySelector('.wifi-bad-credentials-cancel')
        };

        elements.infoItem = elements.wifiAvailableNetworks.querySelector(
          'li[data-state="on"]');
        elements.scanItem = elements.wifiAvailableNetworks.querySelector(
          'li[data-state="ready"]');
        elements.wifiItem = elements.wifiAvailableNetworks.querySelector(
          'li:not([data-state])');

        elements.networklist = {
          infoItem: elements.infoItem,
          scanItem: elements.scanItem,
          wifiAvailableNetworks: elements.wifiAvailableNetworks
        };

        elements.wps = {
          wpsColumn: elements.wpsColumn,
          wpsInfoBlock: elements.wpsInfoBlock,
          wpsPbcLabelBlock: elements.wpsPbcLabelBlock
        };

        this._wps = WifiWps();
        this._wps.addEventListener('statusreset', function() {
          elements.wps.wpsPbcLabelBlock.setAttribute('data-l10n-id',
            'wpsMessage');
          setTimeout(function resetWpsInfoBlock() {
            elements.wps.wpsPbcLabelBlock.setAttribute('data-l10n-id',
              'wpsDescription2');
          }, 1500);
        });

        // element related events
        elements.scanItem.addEventListener('click',
          this._onScanItemClick.bind(this));

        elements.wifiCheckbox.addEventListener('click',
          this._onWifiCheckboxClick.bind(this));

        elements.wpsColumn.addEventListener('click',
          this._onWpsColumnClick.bind(this));

        // wifiContext related events
        WifiContext.addEventListener('wifiEnabled', function() {
          elements.wifiCheckbox.disabled = false;
          this._updateNetworkState();
          this._networkList().then((networkList) => {
            networkList.scan();
          });
        }.bind(this));

        WifiContext.addEventListener('wifiDisabled', function() {
          elements.wifiCheckbox.disabled = false;
          // Re-enable UI toggle
          this._networkList().then((networkList) => {
            networkList.clear(false);
            networkList.autoscan = false;
          });
        }.bind(this));

        WifiContext.addEventListener('wifiStatusChange', function(event) {
          var scanStates =
            new Set(['connected', 'connectingfailed', 'disconnected']);
          this._updateNetworkState();
          if (scanStates.has(event.status)) {
            if (this._wifiSectionVisible) {
              this._networkList().then((networkList) => {
                networkList.scan();
              });
            } else {
              this._scanPending = true;
            }
          }
        }.bind(this));

        WifiContext.addEventListener('wifiWrongPassword', function(event) {
          var currentNetwork = WifiContext.currentNetwork;
          if (currentNetwork.known === false) {
            this._openBadCredentialsDialog(currentNetwork);
          }
        }.bind(this));
      },
Exemplo n.º 4
0
  var WifiNetworkList = function(elements) {
    var list = elements.wifiAvailableNetworks;

    var wifiNetworkList = {
      _scanRate: 5000, // 5s after last scan results
      _scanning: false,
      _autoscan: false,
      _index: [], // index of all scanned networks
      _networks: {},
      _list: elements.wifiAvailableNetworks,
      clear: function(addScanningItem) {
        // clear the network list
        this._index = [];
        this._networks = {};

        // remove all items except the text expl.
        // and the "search again" button
        var wifiItems = list.querySelectorAll('li:not([data-state])');
        var len = wifiItems.length;
        for (var i = len - 1; i >= 0; i--) {
          list.removeChild(wifiItems[i]);
        }

        list.dataset.state = addScanningItem ? 'on' : 'off';
      },
      display: function(event) {
        var network = event ? event.network : null;
        var networkStatus = event ? event.status : null;

        // display a message on the network item matching the ssid
        if (!network) {
          return;
        }

        var key = this._getNetworkKey(network);
        var listItem = this._index[key];
        var active = list.querySelector('.active');

        if (active && active != listItem) {
          active.classList.remove('active');
          active.querySelector('small').
            setAttribute('data-l10n-id', 'shortStatus-disconnected');
          active.querySelector('aside').classList.remove('connecting');
          active.querySelector('aside').classList.remove('connected');
        }
        if (listItem) {
          listItem.classList.add('active');
          listItem.querySelector('small').
            setAttribute('data-l10n-id', 'shortStatus-' + networkStatus);
          if (networkStatus === 'connecting') {
            listItem.querySelector('aside').classList.add('connecting');
          }
          if (networkStatus === 'connected') {
            listItem.querySelector('aside').classList.remove('connecting');
          }
        }
      },
      scan: function() {
        window.performance.measure('settingPanelWifiVisible', 'wifiListStart');
        PerformanceTestingHelper.dispatch('settings-panel-wifi-visible');

        // scan wifi networks and display them in the list
        var self = this;
        if (this._scanning) {
          return;
        }

        // stop auto-scanning if wifi disabled or the app is hidden
        if (!wifiManager.enabled || document.hidden) {
          this._scanning = false;
          return;
        }

        this._scanning = true;
        var req = WifiHelper.getAvailableAndKnownNetworks();

        req.onsuccess = function onScanSuccess() {
          self.clear(false);
          var allNetworks = req.result;
          var network;

          for (var i = 0; i < allNetworks.length; ++i) {
            network = allNetworks[i];
            var key = self._getNetworkKey(network);
            // keep connected network first, or select the highest strength
            if (!self._networks[key] || network.connected) {
              self._networks[key] = network;
            } else {
              if (!self._networks[key].connected &&
                network.relSignalStrength >
                  self._networks[key].relSignalStrength) {
                    self._networks[key] = network;
              }
            }
          }

          var networkKeys = Object.getOwnPropertyNames(self._networks);

          // display network list
          if (networkKeys.length) {
            // sort networks by signal strength
            networkKeys.sort(function(a, b) {
              return self._networks[b].relSignalStrength -
                self._networks[a].relSignalStrength;
            });

            // add detected networks
            for (var j = 0; j < networkKeys.length; j++) {
              network = self._networks[networkKeys[j]];
              var listItem = WifiUtils.newListItem(network,
                self._toggleNetwork.bind(self));
              // put connected network on top of list
              if (WifiHelper.isConnected(network)) {
                list.insertBefore(listItem,
                  elements.infoItem.nextSibling);
              } else {
                list.insertBefore(listItem, elements.scanItem);
              }
              // add composited key to index
              self._index[networkKeys[j]] = listItem;
            }
          } else {
            // display a "no networks found" message if necessary
            list.insertBefore(
              WifiUtils.newExplanationItem('noNetworksFound'),
                elements.scanItem);
          }

          // display the "Search Again" button
          list.dataset.state = 'ready';

          window.performance.measure('settingsPanelWifiReady', 'wifiListStart');
          PerformanceTestingHelper.dispatch('settings-panel-wifi-ready');

          // auto-rescan if requested
          if (self._autoscan) {
            window.setTimeout(self.scan.bind(self), self._scanRate);
          }

          self._scanning = false;
        };

        req.onerror = function onScanError(error) {
          // always try again.
          self._scanning = false;

          window.performance.measure('settingsPanelWifiReady', 'wifiListStart');
          PerformanceTestingHelper.dispatch('settings-panel-wifi-ready');

          window.setTimeout(self.scan.bind(self), self._scanRate);
        };
      },
      getWpsAvailableNetworks: function() {
        // get WPS available networks
        var ssids = Object.getOwnPropertyNames(this._networks);
        var wpsAvailableNetworks = [];
        for (var i = 0; i < ssids.length; i++) {
          var network = this._networks[ssids[i]];
          if (WifiHelper.isWpsAvailable(network)) {
            wpsAvailableNetworks.push(network);
          }
        }
        return wpsAvailableNetworks;
      },
      set autoscan(value) {
        this._autoscan = value;
      },
      get autoscan() {
        return this._autoscan;
      },
      get scanning() {
        return this._scanning;
      },
      // use ssid + security as a composited key
      _getNetworkKey: function(network) {
        var key = network.ssid + '+' +
          WifiHelper.getSecurity(network).join('+');
        return key;
      },
      _toggleNetwork: function(network) {
        var self = this;

        var keys = WifiHelper.getSecurity(network);
        var security = (keys && keys.length) ? keys.join(', ') : '';
        var sl = Math.min(Math.floor(network.relSignalStrength / 20), 4);

        if (WifiHelper.isConnected(network)) {
          // online: show status + offer to disconnect
          SettingsUtils.openDialog('wifi-status', {
            sl: sl,
            network: network,
            security: security,
            onSubmit: function(network) {
              // disconnect first, then rescan
              WifiContext.forgetNetwork(network, function() {
                self.scan();
              });
            }.bind({}, network),
          });
        } else if (network.password && (network.password == '*')) {
          // offline, known network (hence the '*' password value):
          // no further authentication required.
          WifiHelper.setPassword(network);
          WifiContext.associateNetwork(network);
        } else {
          // offline, unknown network: propose to connect
          var key = WifiHelper.getKeyManagement(network);
          switch (key) {
            case 'WEP':
            case 'WPA-PSK':
            case 'WPA-EAP':
              DialogService.show('wifi-auth', {
                sl: sl,
                security: security,
                network: network,
              }).then(function(result) {
                var type = result.type;
                var authOptions = result.value;
                if (type === 'submit') {
                  WifiHelper.setPassword(
                    network,
                    authOptions.password,
                    authOptions.identity,
                    authOptions.eap,
                    authOptions.authPhase2,
                    authOptions.certificate
                  );
                  WifiContext.associateNetwork(network);
                }
              });
              break;
            default:
              WifiContext.associateNetwork(network);
              break;
          }
        }
      }
    };

    // networkStatus has one of the following values:
    // connecting, associated, connected, connectingfailed, disconnected.
    WifiContext.addEventListener('wifiEnabled',
      wifiNetworkList.display.bind(wifiNetworkList));
    WifiContext.addEventListener('wifiStatusChange',
      wifiNetworkList.display.bind(wifiNetworkList));
    WifiContext.addEventListener('wifiConnectionInfoUpdate', function(event) {
      WifiUtils.updateNetworkSignal(event.network, event.relSignalStrength);
    });

    return wifiNetworkList;
  };