// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// The <code>chrome.networkingPrivate</code> API is used for configuring
// network connections (Cellular, Ethernet, VPN or WiFi). This private
// API is only valid if called from a browser or app associated with the
// primary user. See the Open Network Configuration (ONC) documentation for
// descriptions of properties:
// <a href="https://source.chromium.org/chromium/chromium/src/+/HEAD:components/onc/docs/onc_spec.md">
// src/components/onc/docs/onc_spec.html</a>, or the
// <a href="http://www.chromium.org/chromium-os/chromiumos-design-docs/open-network-configuration">
// Open Network Configuration</a> page at chromium.org.
// <br><br>
// NOTE: Most dictionary properties and enum values use UpperCamelCase to match
// the ONC spec instead of the JavaScript lowerCamelCase convention.
// <br><br>
// "State" properties describe just the ONC properties returned by
// $(ref:networkingPrivate.getState) and $(ref:networkingPrivate.getNetworks).
// <br><br>
// "Config" properties describe just the ONC properties that can be configured
// through this API. NOTE: Not all configuration properties are exposed at this
// time, only those currently required by the Chrome Settings UI.
// TODO(stevenjb): Provide all configuration properties and types,
// crbug.com/380937.
// <br><br>
// TODO(stevenjb/pneubeck): Merge the ONC documentation with this document and
// use it as the ONC specification.

namespace networkingPrivate {
  enum ActivationStateType {
    Activated, Activating, NotActivated, PartiallyActivated
  };

  enum CaptivePortalStatus {
    Unknown, Offline, Online, Portal, ProxyAuthRequired
  };

  enum ConnectionStateType {
    Connected, Connecting, NotConnected
  };

  enum DeviceStateType {
    // Device is available but not initialized.
    Uninitialized,
    // Device is initialized but not enabled.
    Disabled,
    // Enabled state has been requested but has not completed.
    Enabling,
    // Device is enabled.
    Enabled,
    // Device is prohibited.
    Prohibited
  };

  enum IPConfigType {
    DHCP, Static
  };

  enum NetworkType {
    All, Cellular, Ethernet, Tether, VPN, Wireless, WiFi
  };

  enum ProxySettingsType {
    Direct, Manual, PAC, WPAD
  };

  enum ApnType {
    Default, Attach, Tether
  };

  enum ApnSource {
    Modem, Modb, Ui, Admin
  };

  // Managed property types. These types all share a common structure:
  // Active: For properties that are translated from the configuration
  //     manager (e.g. Shill), the 'active' value currently in use by the
  //     configuration manager.
  // Effective: The effective source for the property: UserPolicy, DevicePolicy,
  //     UserSetting or SharedSetting.
  // UserPolicy: The value provided by the user policy.
  // DevicePolicy: The value provided by the device policy.
  // UserSetting: The value set by the logged in user. Only provided if
  //     UserEditable is true (i.e. no policy affects the property or the
  //     policy provided value is recommened only).
  // SharedSetting: The value set for all users of the device. Only provided if
  //     DeviceEditiable is true (i.e. no policy affects the property or the
  //     policy provided value is recommened only).
  // UserEditable: True if a UserPolicy exists and allows the property to be
  //     edited (i.e. is a recommended value). Defaults to False.
  // DeviceEditable: True if a DevicePolicy exists and allows the property to be
  //     edited (i.e. is a recommended value). Defaults to False.

  dictionary ManagedBoolean {
    boolean? Active;
    DOMString? Effective;
    boolean? UserPolicy;
    boolean? DevicePolicy;
    boolean? UserSetting;
    boolean? SharedSetting;
    boolean? UserEditable;
    boolean? DeviceEditable;
  };

  dictionary ManagedLong {
    long? Active;
    DOMString? Effective;
    long? UserPolicy;
    long? DevicePolicy;
    long? UserSetting;
    long? SharedSetting;
    boolean? UserEditable;
    boolean? DeviceEditable;
  };

  dictionary ManagedDOMString {
    DOMString? Active;
    DOMString? Effective;
    DOMString? UserPolicy;
    DOMString? DevicePolicy;
    DOMString? UserSetting;
    DOMString? SharedSetting;
    boolean? UserEditable;
    boolean? DeviceEditable;
  };

  dictionary ManagedDOMStringList {
    DOMString[]? Active;
    DOMString? Effective;
    DOMString[]? UserPolicy;
    DOMString[]? DevicePolicy;
    DOMString[]? UserSetting;
    DOMString[]? SharedSetting;
    boolean? UserEditable;
    boolean? DeviceEditable;
  };

  dictionary ManagedIPConfigType {
    IPConfigType? Active;
    DOMString? Effective;
    IPConfigType? UserPolicy;
    IPConfigType? DevicePolicy;
    IPConfigType? UserSetting;
    IPConfigType? SharedSetting;
    boolean? UserEditable;
    boolean? DeviceEditable;
  };

  dictionary ManagedProxySettingsType {
    ProxySettingsType? Active;
    DOMString? Effective;
    ProxySettingsType? UserPolicy;
    ProxySettingsType? DevicePolicy;
    ProxySettingsType? UserSetting;
    ProxySettingsType? SharedSetting;
    boolean? UserEditable;
    boolean? DeviceEditable;
  };

  // Sub-dictionary types.

  dictionary APNProperties {
    DOMString AccessPointName;
    DOMString? Authentication;
    DOMString? Language;
    DOMString? LocalizedName;
    DOMString? Name;
    DOMString? Password;
    DOMString? Username;
    ApnType[]? ApnTypes;
    ApnSource? Source;
  };

  dictionary ManagedAPNProperties {
    ManagedDOMString AccessPointName;
    ManagedDOMString? Authentication;
    ManagedDOMString? Language;
    ManagedDOMString? LocalizedName;
    ManagedDOMString? Name;
    ManagedDOMString? Password;
    ManagedDOMString? Username;
  };

  dictionary ManagedAPNList {
    APNProperties[]? Active;
    DOMString? Effective;
    APNProperties[]? UserPolicy;
    APNProperties[]? DevicePolicy;
    APNProperties[]? UserSetting;
    APNProperties[]? SharedSetting;
    boolean? UserEditable;
    boolean? DeviceEditable;
  };

  dictionary CellularProviderProperties {
    DOMString Name;
    DOMString Code;
    DOMString? Country;
  };

  dictionary CellularSimState {
    // Whether or not a PIN should be required.
    boolean requirePin;

    // The current PIN (required for any change, even when the SIM is unlocked).
    DOMString currentPin;

    // If provided, change the PIN to |newPin|. |requirePin| must be true.
    DOMString? newPin;
  };

  dictionary IssuerSubjectPattern {
    DOMString? CommonName;
    DOMString? Locality;
    DOMString? Organization;
    DOMString? OrganizationalUnit;
  };

  dictionary ManagedIssuerSubjectPattern {
    ManagedDOMString? CommonName;
    ManagedDOMString? Locality;
    ManagedDOMString? Organization;
    ManagedDOMString? OrganizationalUnit;
  };

  dictionary CertificatePattern {
    DOMString[]? EnrollmentURI;
    IssuerSubjectPattern? Issuer;
    DOMString[]? IssuerCAPEMs;
    DOMString[]? IssuerCARef;
    IssuerSubjectPattern? Subject;
  };

  dictionary ManagedCertificatePattern {
    ManagedDOMStringList? EnrollmentURI;
    ManagedIssuerSubjectPattern? Issuer;
    ManagedDOMStringList? IssuerCARef;
    ManagedIssuerSubjectPattern? Subject;
  };

  dictionary EAPProperties {
    DOMString? AnonymousIdentity;
    CertificatePattern? ClientCertPattern;
    DOMString? ClientCertPKCS11Id;
    DOMString? ClientCertProvisioningProfileId;
    DOMString? ClientCertRef;
    DOMString? ClientCertType;
    DOMString? Identity;
    DOMString? Inner;
    // The outer EAP type. Required by ONC, but may not be provided when
    // translating from Shill.
    DOMString? Outer;
    DOMString? Password;
    boolean? SaveCredentials;
    DOMString[]? ServerCAPEMs;
    DOMString[]? ServerCARefs;
    DOMString? SubjectMatch;
    DOMString? TLSVersionMax;
    boolean? UseProactiveKeyCaching;
    boolean? UseSystemCAs;
  };

  dictionary ManagedEAPProperties {
    ManagedDOMString? AnonymousIdentity;
    ManagedCertificatePattern? ClientCertPattern;
    ManagedDOMString? ClientCertPKCS11Id;
    ManagedDOMString? ClientCertProvisioningProfileId;
    ManagedDOMString? ClientCertRef;
    ManagedDOMString? ClientCertType;
    ManagedDOMString? Identity;
    ManagedDOMString? Inner;
    // The outer EAP type. Required by ONC, but may not be provided when
    // translating from Shill.
    ManagedDOMString? Outer;
    ManagedDOMString? Password;
    ManagedBoolean? SaveCredentials;
    ManagedDOMStringList? ServerCAPEMs;
    ManagedDOMStringList? ServerCARefs;
    ManagedDOMString? SubjectMatch;
    ManagedDOMString? TLSVersionMax;
    ManagedBoolean? UseProactiveKeyCaching;
    ManagedBoolean? UseSystemCAs;
  };

  dictionary FoundNetworkProperties {
    DOMString Status;
    DOMString NetworkId;
    DOMString Technology;
    DOMString? ShortName;
    DOMString? LongName;
  };

  dictionary IPConfigProperties {
    DOMString? Gateway;
    DOMString? IPAddress;
    DOMString[]? ExcludedRoutes;
    DOMString[]? IncludedRoutes;
    DOMString[]? NameServers;
    DOMString[]? SearchDomains;
    long? RoutingPrefix;
    DOMString? Type;
    DOMString? WebProxyAutoDiscoveryUrl;
  };

  dictionary ManagedIPConfigProperties {
    ManagedDOMString? Gateway;
    ManagedDOMString? IPAddress;
    ManagedDOMStringList? NameServers;
    ManagedLong? RoutingPrefix;
    ManagedDOMString? Type;
    ManagedDOMString? WebProxyAutoDiscoveryUrl;
  };

  dictionary XAUTHProperties {
    DOMString? Password;
    boolean? SaveCredentials;
    DOMString? Username;
  };

  dictionary ManagedXAUTHProperties {
    ManagedDOMString? Password;
    ManagedBoolean? SaveCredentials;
    ManagedDOMString? Username;
  };

  dictionary IPSecProperties {
    DOMString AuthenticationType;
    CertificatePattern? ClientCertPattern;
    DOMString? ClientCertPKCS11Id;
    DOMString? ClientCertProvisioningProfileId;
    DOMString? ClientCertRef;
    DOMString? ClientCertType;
    EAPProperties? EAP;
    DOMString? Group;
    long? IKEVersion;
    DOMString? LocalIdentity;
    DOMString? PSK;
    DOMString? RemoteIdentity;
    boolean? SaveCredentials;
    DOMString[]? ServerCAPEMs;
    DOMString[]? ServerCARefs;
    XAUTHProperties? XAUTH;
  };

  dictionary ManagedIPSecProperties {
    ManagedDOMString AuthenticationType;
    ManagedCertificatePattern? ClientCertPattern;
    ManagedDOMString? ClientCertPKCS11Id;
    ManagedDOMString? ClientCertProvisioningProfileId;
    ManagedDOMString? ClientCertRef;
    ManagedDOMString? ClientCertType;
    ManagedEAPProperties? EAP;
    ManagedDOMString? Group;
    ManagedLong? IKEVersion;
    ManagedDOMString? PSK;
    ManagedBoolean? SaveCredentials;
    ManagedDOMStringList? ServerCAPEMs;
    ManagedDOMStringList? ServerCARefs;
    ManagedXAUTHProperties? XAUTH;
  };

  dictionary L2TPProperties {
    boolean? LcpEchoDisabled;
    DOMString? Password;
    boolean? SaveCredentials;
    DOMString? Username;
  };

  dictionary ManagedL2TPProperties {
    ManagedBoolean? LcpEchoDisabled;
    ManagedDOMString? Password;
    ManagedBoolean? SaveCredentials;
    ManagedDOMString? Username;
  };

  dictionary PaymentPortal {
    DOMString Method;
    DOMString? PostData;
    DOMString? Url;
  };

  dictionary ProxyLocation {
    DOMString Host;
    long Port;
  };

  dictionary ManagedProxyLocation {
    ManagedDOMString Host;
    ManagedLong Port;
  };

  dictionary ManualProxySettings {
    ProxyLocation? HTTPProxy;
    ProxyLocation? SecureHTTPProxy;
    ProxyLocation? FTPProxy;
    ProxyLocation? SOCKS;
  };

  dictionary ManagedManualProxySettings {
    ManagedProxyLocation? HTTPProxy;
    ManagedProxyLocation? SecureHTTPProxy;
    ManagedProxyLocation? FTPProxy;
    ManagedProxyLocation? SOCKS;
  };

  dictionary ProxySettings {
    ProxySettingsType Type;
    ManualProxySettings? Manual;
    DOMString[]? ExcludeDomains;
    DOMString? PAC;
  };

  dictionary ManagedProxySettings {
    ManagedProxySettingsType Type;
    ManagedManualProxySettings? Manual;
    ManagedDOMStringList? ExcludeDomains;
    ManagedDOMString? PAC;
  };

  dictionary VerifyX509 {
    DOMString? Name;
    DOMString? Type;
  };

  dictionary ManagedVerifyX509 {
    ManagedDOMString? Name;
    ManagedDOMString? Type;
  };

  dictionary OpenVPNProperties {
    DOMString? Auth;
    DOMString? AuthRetry;
    boolean? AuthNoCache;
    DOMString? Cipher;
    DOMString? ClientCertPKCS11Id;
    CertificatePattern? ClientCertPattern;
    DOMString? ClientCertProvisioningProfileId;
    DOMString? ClientCertRef;
    DOMString? ClientCertType;
    DOMString? CompLZO;
    boolean? CompNoAdapt;
    DOMString[]? ExtraHosts;
    boolean? IgnoreDefaultRoute;
    DOMString? KeyDirection;
    DOMString? NsCertType;
    DOMString? OTP;
    DOMString? Password;
    long? Port;
    DOMString? Proto;
    boolean? PushPeerInfo;
    DOMString? RemoteCertEKU;
    DOMString[]? RemoteCertKU;
    DOMString? RemoteCertTLS;
    long? RenegSec;
    boolean? SaveCredentials;
    DOMString[]? ServerCAPEMs;
    DOMString[]? ServerCARefs;
    DOMString? ServerCertRef;
    long? ServerPollTimeout;
    long? Shaper;
    DOMString? StaticChallenge;
    DOMString? TLSAuthContents;
    DOMString? TLSRemote;
    DOMString? TLSVersionMin;
    DOMString? UserAuthenticationType;
    DOMString? Username;
    DOMString? Verb;
    DOMString? VerifyHash;
    VerifyX509? VerifyX509;
  };

  dictionary ManagedOpenVPNProperties {
    ManagedDOMString? Auth;
    ManagedDOMString? AuthRetry;
    ManagedBoolean? AuthNoCache;
    ManagedDOMString? Cipher;
    ManagedDOMString? ClientCertPKCS11Id;
    ManagedCertificatePattern? ClientCertPattern;
    ManagedDOMString? ClientCertProvisioningProfileId;
    ManagedDOMString? ClientCertRef;
    ManagedDOMString? ClientCertType;
    ManagedDOMString? CompLZO;
    ManagedBoolean? CompNoAdapt;
    ManagedDOMStringList? ExtraHosts;
    ManagedBoolean? IgnoreDefaultRoute;
    ManagedDOMString? KeyDirection;
    ManagedDOMString? NsCertType;
    ManagedDOMString? OTP;
    ManagedDOMString? Password;
    ManagedLong? Port;
    ManagedDOMString? Proto;
    ManagedBoolean? PushPeerInfo;
    ManagedDOMString? RemoteCertEKU;
    ManagedDOMStringList? RemoteCertKU;
    ManagedDOMString? RemoteCertTLS;
    ManagedLong? RenegSec;
    ManagedBoolean? SaveCredentials;
    ManagedDOMStringList? ServerCAPEMs;
    ManagedDOMStringList? ServerCARefs;
    ManagedDOMString? ServerCertRef;
    ManagedLong? ServerPollTimeout;
    ManagedLong? Shaper;
    ManagedDOMString? StaticChallenge;
    ManagedDOMString? TLSAuthContents;
    ManagedDOMString? TLSRemote;
    ManagedDOMString? TLSVersionMin;
    ManagedDOMString? UserAuthenticationType;
    ManagedDOMString? Username;
    ManagedDOMString? Verb;
    ManagedDOMString? VerifyHash;
    ManagedVerifyX509? VerifyX509;
  };

  dictionary SIMLockStatus {
    DOMString LockType;  // sim-pin, sim-puk, or ''
    boolean LockEnabled;
    long? RetriesLeft;
  };

  dictionary ThirdPartyVPNProperties {
    DOMString ExtensionID;
    DOMString? ProviderName;
  };

  dictionary ManagedThirdPartyVPNProperties {
    ManagedDOMString ExtensionID;
    DOMString? ProviderName;
  };

  // Network type dictionary types.

  dictionary CellularProperties {
    boolean? AutoConnect;
    APNProperties? APN;
    APNProperties[]? APNList;
    DOMString? ActivationType;
    ActivationStateType? ActivationState;
    boolean? AllowRoaming;
    DOMString? ESN;
    DOMString? Family;
    DOMString? FirmwareRevision;
    FoundNetworkProperties[]? FoundNetworks;
    DOMString? HardwareRevision;
    CellularProviderProperties? HomeProvider;
    DOMString? ICCID;
    DOMString? IMEI;
    APNProperties? LastGoodAPN;
    DOMString? Manufacturer;
    DOMString? MDN;
    DOMString? MEID;
    DOMString? MIN;
    DOMString? ModelID;
    DOMString? NetworkTechnology;
    PaymentPortal? PaymentPortal;
    DOMString? RoamingState;
    boolean? Scanning;
    CellularProviderProperties? ServingOperator;
    SIMLockStatus? SIMLockStatus;
    boolean? SIMPresent;
    long? SignalStrength;
    boolean? SupportNetworkScan;
  };

  dictionary ManagedCellularProperties {
    ManagedBoolean? AutoConnect;
    ManagedAPNProperties? APN;
    ManagedAPNList? APNList;
    DOMString? ActivationType;
    ActivationStateType? ActivationState;
    boolean? AllowRoaming;
    DOMString? ESN;
    DOMString? Family;
    DOMString? FirmwareRevision;
    FoundNetworkProperties[]? FoundNetworks;
    DOMString? HardwareRevision;
    CellularProviderProperties? HomeProvider;
    DOMString? ICCID;
    DOMString? IMEI;
    APNProperties? LastGoodAPN;
    DOMString? Manufacturer;
    DOMString? MDN;
    DOMString? MEID;
    DOMString? MIN;
    DOMString? ModelID;
    DOMString? NetworkTechnology;
    PaymentPortal? PaymentPortal;
    DOMString? RoamingState;
    boolean? Scanning;
    CellularProviderProperties? ServingOperator;
    SIMLockStatus? SIMLockStatus;
    boolean? SIMPresent;
    long? SignalStrength;
    boolean? SupportNetworkScan;
  };

  dictionary CellularStateProperties {
    ActivationStateType? ActivationState;
    DOMString? EID;
    DOMString? ICCID;
    DOMString? NetworkTechnology;
    DOMString? RoamingState;
    boolean? Scanning;
    boolean? SIMPresent;
    long? SignalStrength;
  };

  dictionary EAPStateProperties {
    DOMString? Outer;
  };

  dictionary EthernetProperties {
    boolean? AutoConnect;
    DOMString? Authentication;
    EAPProperties? EAP;
  };

  dictionary ManagedEthernetProperties {
    ManagedBoolean? AutoConnect;
    ManagedDOMString? Authentication;
    ManagedEAPProperties? EAP;
  };

  dictionary EthernetStateProperties {
    DOMString Authentication;
  };

  dictionary TetherProperties {
    long? BatteryPercentage;
    DOMString? Carrier;
    boolean HasConnectedToHost;
    long? SignalStrength;
  };

  dictionary VPNProperties {
    boolean? AutoConnect;
    DOMString? Host;
    IPSecProperties? IPsec;
    L2TPProperties? L2TP;
    OpenVPNProperties? OpenVPN;
    ThirdPartyVPNProperties? ThirdPartyVPN;
    // The VPN type. This cannot be an enum because of 'L2TP-IPSec'.
    // This is optional for NetworkConfigProperties which is passed to
    // setProperties which may be used to set only specific properties.
    DOMString? Type;
  };

  dictionary ManagedVPNProperties {
    ManagedBoolean? AutoConnect;
    ManagedDOMString? Host;
    ManagedIPSecProperties? IPsec;
    ManagedL2TPProperties? L2TP;
    ManagedOpenVPNProperties? OpenVPN;
    ManagedThirdPartyVPNProperties? ThirdPartyVPN;
    ManagedDOMString? Type;
  };

  dictionary VPNStateProperties {
    DOMString Type;
    IPSecProperties? IPsec;
    ThirdPartyVPNProperties? ThirdPartyVPN;
  };

  dictionary WiFiProperties {
    boolean? AllowGatewayARPPolling;
    boolean? AutoConnect;
    DOMString? BSSID;
    EAPProperties? EAP;
    long? Frequency;
    long[]? FrequencyList;
    DOMString? HexSSID;
    boolean? HiddenSSID;
    DOMString? Passphrase;
    DOMString? SSID;
    DOMString? Security;
    long? SignalStrength;
  };

  dictionary ManagedWiFiProperties {
    ManagedBoolean? AllowGatewayARPPolling;
    ManagedBoolean? AutoConnect;
    DOMString? BSSID;
    ManagedEAPProperties? EAP;
    long? Frequency;
    long[]? FrequencyList;
    ManagedDOMString? HexSSID;
    ManagedBoolean? HiddenSSID;
    ManagedDOMString? Passphrase;
    ManagedDOMString? SSID;
    ManagedDOMString Security;
    long? SignalStrength;
  };

  dictionary WiFiStateProperties {
    DOMString? BSSID;
    EAPStateProperties? EAP;
    long? Frequency;
    DOMString? HexSSID;
    DOMString Security;
    long? SignalStrength;
    DOMString? SSID;
  };

  dictionary NetworkConfigProperties {
    CellularProperties? Cellular;
    EthernetProperties? Ethernet;
    DOMString? GUID;
    IPConfigType? IPAddressConfigType;
    DOMString? Name;
    IPConfigType? NameServersConfigType;
    long? Priority;
    ProxySettings? ProxySettings;
    IPConfigProperties? StaticIPConfig;
    NetworkType? Type;
    VPNProperties? VPN;
    WiFiProperties? WiFi;
  };

  dictionary NetworkProperties {
    CellularProperties? Cellular;
    boolean? Connectable;
    ConnectionStateType? ConnectionState;
    DOMString? ErrorState;
    EthernetProperties? Ethernet;
    DOMString GUID;
    IPConfigType? IPAddressConfigType;
    IPConfigProperties[]? IPConfigs;
    DOMString? MacAddress;
    boolean? Metered;
    DOMString? Name;
    IPConfigType? NameServersConfigType;
    long? Priority;
    ProxySettings? ProxySettings;
    boolean? RestrictedConnectivity;
    IPConfigProperties? StaticIPConfig;
    IPConfigProperties? SavedIPConfig;
    // Indicates whether and how the network is configured.
    // 'Source' can be Device, DevicePolicy, User, UserPolicy or None.
    // 'None' conflicts with extension code generation so we must use a string
    // for 'Source' instead of a SourceType enum.
    DOMString? Source;
    TetherProperties? Tether;
    double? TrafficCounterResetTime;
    NetworkType Type;
    VPNProperties? VPN;
    WiFiProperties? WiFi;
  };

  dictionary ManagedProperties {
    ManagedCellularProperties? Cellular;
    boolean? Connectable;
    ConnectionStateType? ConnectionState;
    DOMString? ErrorState;
    ManagedEthernetProperties? Ethernet;
    DOMString GUID;
    ManagedIPConfigType? IPAddressConfigType;
    IPConfigProperties[]? IPConfigs;
    DOMString? MacAddress;
    ManagedBoolean? Metered;
    ManagedDOMString? Name;
    ManagedIPConfigType? NameServersConfigType;
    ManagedLong? Priority;
    ManagedProxySettings? ProxySettings;
    boolean? RestrictedConnectivity;
    ManagedIPConfigProperties? StaticIPConfig;
    IPConfigProperties? SavedIPConfig;
    // See $(ref:NetworkProperties.Source).
    DOMString? Source;
    TetherProperties? Tether;
    double? TrafficCounterResetTime;
    NetworkType Type;
    ManagedVPNProperties? VPN;
    ManagedWiFiProperties? WiFi;
  };

  dictionary NetworkStateProperties {
    CellularStateProperties? Cellular;
    boolean? Connectable;
    ConnectionStateType? ConnectionState;
    EthernetStateProperties? Ethernet;
    DOMString? ErrorState;
    DOMString GUID;
    DOMString? Name;
    long? Priority;
    // See $(ref:NetworkProperties.Source).
    DOMString? Source;
    TetherProperties? Tether;
    NetworkType Type;
    VPNStateProperties? VPN;
    WiFiStateProperties? WiFi;
  };

  dictionary DeviceStateProperties {
    // Set if the device is enabled. True if the device is currently scanning.
    boolean? Scanning;

    // The SIM lock status if Type = Cellular and SIMPresent = True.
    SIMLockStatus? SIMLockStatus;

    // Set to the SIM present state if the device type is Cellular.
    boolean? SIMPresent;

    // The current state of the device.
    DeviceStateType State;

    // The network type associated with the device (Cellular, Ethernet or WiFi).
    NetworkType Type;

    // Whether or not any managed networks are available/visible.
    boolean? ManagedNetworkAvailable;
  };

  dictionary NetworkFilter {
    // The type of networks to return.
    NetworkType networkType;

    // If true, only include visible (physically connected or in-range)
    // networks. Defaults to 'false'.
    boolean? visible;

    // If true, only include configured (saved) networks. Defaults to 'false'.
    boolean? configured;

    // Maximum number of networks to return. Defaults to 1000 if unspecified.
    // Use 0 for no limit.
    long? limit;
  };

  dictionary GlobalPolicy {
    // If true, only policy networks may auto connect. Defaults to false.
    boolean? AllowOnlyPolicyNetworksToAutoconnect;

    // If true, only policy networks may be connected to and no new networks may
    // be added or configured. Defaults to false.
    boolean? AllowOnlyPolicyNetworksToConnect;

    // If true and a managed network is available in the visible network list,
    // only policy networks may be connected to and no new networks may be added
    // or configured. Defaults to false.
    boolean? AllowOnlyPolicyNetworksToConnectIfAvailable;

    // List of blocked networks. Connections to blocked networks are
    // prohibited. Networks can be allowed again by specifying an explicit
    // network configuration. Defaults to an empty list.
    DOMString[]? BlockedHexSSIDs;
  };

  dictionary Certificate {
    // Unique hash for the certificate.
    DOMString hash;

    // Certificate issuer common name.
    DOMString issuedBy;

    // Certificate name or nickname.
    DOMString issuedTo;

    // PEM for server CA certificates.
    DOMString? pem;

    // PKCS#11 id for user certificates.
    DOMString? PKCS11Id;

    // Whether or not the certificate is hardware backed.
    boolean hardwareBacked;

    // Whether or not the certificate is device wide.
    boolean deviceWide;
  };

  dictionary CertificateLists {
    // List of avaliable server CA certificates.
    Certificate[] serverCaCertificates;

    // List of available user certificates.
    Certificate[] userCertificates;
  };

  callback VoidCallback = void();
  callback BooleanCallback = void(boolean result);
  callback StringCallback = void(DOMString result);
  // TODO(stevenjb): Use NetworkProperties for |result| once defined.
  callback GetPropertiesCallback = void(NetworkProperties result);
  // TODO(stevenjb): Use ManagedNetworkProperties for |result| once defined.
  callback GetManagedPropertiesCallback = void(ManagedProperties result);
  callback GetStatePropertiesCallback = void(NetworkStateProperties result);
  callback GetNetworksCallback = void(NetworkStateProperties[] result);
  callback GetDeviceStatesCallback = void(DeviceStateProperties[] result);
  callback GetEnabledNetworkTypesCallback = void(NetworkType[] result);
  callback CaptivePortalStatusCallback = void(CaptivePortalStatus result);
  callback GetGlobalPolicyCallback = void(GlobalPolicy result);
  callback GetCertificateListsCallback = void(CertificateLists result);

  // These functions all report failures either via $(ref:runtime.lastError)
  // when using callbacks or passed to the rejection handler when using
  // promises.
  interface Functions {
    // Gets all the properties of the network with id networkGuid. Includes all
    // properties of the network (read-only and read/write values).
    // |networkGuid|: The GUID of the network to get properties for.
    // |callback|: Called with the network properties when received.
    static void getProperties(
        DOMString networkGuid,
        GetPropertiesCallback callback);

    // Gets the merged properties of the network with id networkGuid from the
    // sources: User settings, shared settings, user policy, device policy and
    // the currently active settings.
    // |networkGuid|: The GUID of the network to get properties for.
    // |callback|: Called with the managed network properties when received.
    static void getManagedProperties(
        DOMString networkGuid,
        GetManagedPropertiesCallback callback);

    // Gets the cached read-only properties of the network with id networkGuid.
    // This is meant to be a higher performance function than
    // $(ref:getProperties), which requires a round trip to query the networking
    // subsystem. The following properties are returned for all networks: GUID,
    // Type, Name, WiFi.Security. Additional properties are provided for visible
    // networks: ConnectionState, ErrorState, WiFi.SignalStrength,
    // Cellular.NetworkTechnology, Cellular.ActivationState,
    // Cellular.RoamingState.
    // |networkGuid|: The GUID of the network to get properties for.
    // |callback|: Called immediately with the network state properties.
    static void getState(
        DOMString networkGuid,
        GetStatePropertiesCallback callback);

    // Sets the properties of the network with id |networkGuid|. This is only
    // valid for configured networks (Source != None). Unconfigured visible
    // networks should use createNetwork instead.
    // |networkGuid|: The GUID of the network to set properties for.
    // |properties|: The properties to set.
    // |callback|: Called when the operation has completed.
    static void setProperties(
        DOMString networkGuid,
        NetworkConfigProperties properties,
        optional VoidCallback callback);

    // Creates a new network configuration from properties. If a matching
    // configured network already exists, this will fail. Otherwise returns the
    // guid of the new network.
    // |shared|: If true, share this network configuration with other users.
    // |properties|: The properties to configure the new network with.
    // |callback|: Called with the GUID for the new network configuration once
    //     the network has been created.
    static void createNetwork(
        boolean shared,
        NetworkConfigProperties properties,
        optional StringCallback callback);

    // Forgets a network configuration by clearing any configured properties for
    // the network with GUID 'networkGuid'. This may also include any other
    // networks with matching identifiers (e.g. WiFi SSID and Security). If no
    // such configuration exists, an error will be set and the operation will
    // fail.
    // |networkGuid|: The GUID of the network to forget.
    // |callback|: Called when the operation has completed.
    static void forgetNetwork(
        DOMString networkGuid,
        optional VoidCallback callback);

    // Returns a list of network objects with the same properties provided by
    // $(ref:networkingPrivate.getState). A filter is provided to specify the
    // type of networks returned and to limit the number of networks. Networks
    // are ordered by the system based on their priority, with connected or
    // connecting networks listed first.
    // |filter|: Describes which networks to return.
    // |callback|: Called with a dictionary of networks and their state
    //     properties when received.
    static void getNetworks(
        NetworkFilter filter,
        GetNetworksCallback callback);

    // Deprecated. Please use $(ref:networkingPrivate.getNetworks) with
    // filter.visible = true instead.
    [deprecated="Use getNetworks."] static void getVisibleNetworks(
        NetworkType networkType,
        GetNetworksCallback callback);

    // Deprecated. Please use $(ref:networkingPrivate.getDeviceStates) instead.
    [deprecated="Use getDeviceStates."] static void getEnabledNetworkTypes(
        GetEnabledNetworkTypesCallback callback);

    // Returns a list of $(ref:networkingPrivate.DeviceStateProperties) objects.
    // |callback|: Called with a list of devices and their state.
    static void getDeviceStates(
        GetDeviceStatesCallback callback);

    // Enables any devices matching the specified network type. Note, the type
    // might represent multiple network types (e.g. 'Wireless').
    // |networkType|: The type of network to enable.
    static void enableNetworkType(NetworkType networkType);

    // Disables any devices matching the specified network type. See note for
    // $(ref:networkingPrivate.enableNetworkType).
    // |networkType|: The type of network to disable.
    static void disableNetworkType(NetworkType networkType);

    // Requests that the networking subsystem scan for new networks and
    // update the list returned by $(ref:getVisibleNetworks). This is only a
    // request: the network subsystem can choose to ignore it.  If the list
    // is updated, then the $(ref:onNetworkListChanged) event will be fired.
    // |networkType|: If provided, requests a scan specific to the type.
    //     For Cellular a mobile network scan will be requested if supported.
    static void requestNetworkScan(optional NetworkType networkType);

    // Starts a connection to the network with networkGuid.
    // |networkGuid|: The GUID of the network to connect to.
    // |callback|: Called when the connect request has been sent. Note: the
    //     connection may not have completed. Observe $(ref:onNetworksChanged)
    //     to be notified when a network state changes. If the connect request
    //     immediately failed (e.g. the network is unconfigured),
    //     $(ref:runtime.lastError) will be set with a failure reason.
    static void startConnect(
        DOMString networkGuid,
        optional VoidCallback callback);

    // Starts a disconnect from the network with networkGuid.
    // |networkGuid|: The GUID of the network to disconnect from.
    // |callback|: Called when the disconnect request has been sent. See note
    //     for $(ref:startConnect).
    static void startDisconnect(
        DOMString networkGuid,
        optional VoidCallback callback);

    // Starts activation of the Cellular network with networkGuid. If called
    // for a network that is already activated, or for a network with a carrier
    // that can not be directly activated, this will show the account details
    // page for the carrier if possible.
    // |networkGuid|: The GUID of the Cellular network to activate.
    // |carrier|: Optional name of carrier to activate.
    // |callback|: Called when the activation request has been sent. See note
    //     for $(ref:startConnect).
    static void startActivate(
        DOMString networkGuid,
        optional DOMString carrier,
        optional VoidCallback callback);

    // Returns captive portal status for the network matching 'networkGuid'.
    // |networkGuid|: The GUID of the network to get captive portal status for.
    // |callback|: A callback function that returns the results of the query for
    //     network captive portal status.
    static void getCaptivePortalStatus(
        DOMString networkGuid,
        CaptivePortalStatusCallback callback);

    // Unlocks a Cellular SIM card.
    // * If the SIM is PIN locked, |pin| will be used to unlock the SIM and
    //   the |puk| argument will be ignored if provided.
    // * If the SIM is PUK locked, |puk| and |pin| must be provided. If the
    //   operation succeeds (|puk| is valid), the PIN will be set to |pin|.
    //   (If |pin| is empty or invalid the operation will fail).
    // |networkGuid|: The GUID of the cellular network to unlock.
    //     If empty, the default cellular device will be used.
    // |pin|: The current SIM PIN, or the new PIN if PUK is provided.
    // |puk|: The operator provided PUK for unblocking a blocked SIM.
    // |callback|: Called when the operation has completed.
    static void unlockCellularSim(
        DOMString networkGuid,
        DOMString pin,
        optional DOMString puk,
        optional VoidCallback callback);

    // Sets whether or not SIM locking is enabled (i.e a PIN will be required
    // when the device is powered) and changes the PIN if a new PIN is
    // specified. If the new PIN is provided but not valid (e.g. too short)
    // the operation will fail. This will not lock the SIM; that is handled
    // automatically by the device. NOTE: If the SIM is locked, it must first be
    // unlocked with unlockCellularSim() before this can be called (otherwise it
    // will fail and $(ref:runtime.lastError) will be set to Error.SimLocked).
    // |networkGuid|: The GUID of the cellular network to set the SIM state of.
    //     If empty, the default cellular device will be used.
    // |simState|: The SIM state to set.
    // |callback|: Called when the operation has completed.
    static void setCellularSimState(
        DOMString networkGuid,
        CellularSimState simState,
        optional VoidCallback callback);

    // Selects which Cellular Mobile Network to use. |networkId| must be the
    // NetworkId property of a member of Cellular.FoundNetworks from the
    // network properties for the specified Cellular network.
    // |networkGuid|: The GUID of the cellular network to select the network
    //     for. If empty, the default cellular device will be used.
    // |networkId|: The networkId to select.
    // |callback|: Called when the operation has completed.
    static void selectCellularMobileNetwork(
        DOMString networkGuid,
        DOMString networkId,
        optional VoidCallback callback);

    // Gets the global policy properties. These properties are not expected to
    // change during a session.
    static void getGlobalPolicy(
        GetGlobalPolicyCallback callback);

    // Gets the lists of certificates available for network configuration.
    static void getCertificateLists(
        GetCertificateListsCallback callback);
  };

  interface Events {
    // Fired when the properties change on any of the networks.  Sends a list of
    // GUIDs for networks whose properties have changed.
    static void onNetworksChanged(DOMString[] changes);

    // Fired when the list of networks has changed.  Sends a complete list of
    // GUIDs for all the current networks.
    static void onNetworkListChanged(DOMString[] changes);

    // Fired when the list of devices has changed or any device state properties
    // have changed.
    static void onDeviceStateListChanged();

    // Fired when a portal detection for a network completes. Sends the guid of
    // the network and the corresponding captive portal status.
    static void onPortalDetectionCompleted(DOMString networkGuid,
                                           CaptivePortalStatus status);

    // Fired when any certificate list has changed.
    static void onCertificateListsChanged();
  };
};
