summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/parent/ext-networkStatus.js
blob: 7379d746f504e5ebf188fa590b711a17c3e93ac5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";

XPCOMUtils.defineLazyServiceGetter(
  this,
  "gNetworkLinkService",
  "@mozilla.org/network/network-link-service;1",
  "nsINetworkLinkService"
);

function getLinkType() {
  switch (gNetworkLinkService.linkType) {
    case gNetworkLinkService.LINK_TYPE_UNKNOWN:
      return "unknown";
    case gNetworkLinkService.LINK_TYPE_ETHERNET:
      return "ethernet";
    case gNetworkLinkService.LINK_TYPE_USB:
      return "usb";
    case gNetworkLinkService.LINK_TYPE_WIFI:
      return "wifi";
    case gNetworkLinkService.LINK_TYPE_WIMAX:
      return "wimax";
    case gNetworkLinkService.LINK_TYPE_MOBILE:
      return "mobile";
    default:
      return "unknown";
  }
}

function getLinkStatus() {
  if (!gNetworkLinkService.linkStatusKnown) {
    return "unknown";
  }
  return gNetworkLinkService.isLinkUp ? "up" : "down";
}

function getLinkInfo() {
  return {
    id: gNetworkLinkService.networkID || undefined,
    status: getLinkStatus(),
    type: getLinkType(),
  };
}

this.networkStatus = class extends ExtensionAPI {
  getAPI(context) {
    return {
      networkStatus: {
        getLinkInfo,
        onConnectionChanged: new EventManager({
          context,
          name: "networkStatus.onConnectionChanged",
          register: fire => {
            let observerStatus = (subject, topic, data) => {
              fire.async(getLinkInfo());
            };

            Services.obs.addObserver(
              observerStatus,
              "network:link-status-changed"
            );
            Services.obs.addObserver(
              observerStatus,
              "network:link-type-changed"
            );
            return () => {
              Services.obs.removeObserver(
                observerStatus,
                "network:link-status-changed"
              );
              Services.obs.removeObserver(
                observerStatus,
                "network:link-type-changed"
              );
            };
          },
        }).api(),
      },
    };
  }
};