Index: chrome/common/extensions/docs/templates/intros/networking_config.html |
diff --git a/chrome/common/extensions/docs/templates/intros/networking_config.html b/chrome/common/extensions/docs/templates/intros/networking_config.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..64248d6f8b592c76f89c7cd186f4bac0b2f2370d |
--- /dev/null |
+++ b/chrome/common/extensions/docs/templates/intros/networking_config.html |
@@ -0,0 +1,75 @@ |
+<h2 id="usage">Implementing a Captive Portal Authenticator</h2> |
+This API allows an Extension to implement an authenticator for captive portals. |
+The interaction between Extension, Chrome, and the user will be: |
+<ol> |
+ <li>Using $(ref:setNetworkFilter), the Extension registers for a list of Wi-Fi |
+ networks that it wants to handle captive portals on.</li> |
+ <li>If one of these networks is detected by Chrome, it will appear in the |
+ network list, badged with an icon to indicate that a captive portal handler is |
+ available.</li> |
+ <li>If the user selects such a network, but a captive portal is not detect, |
not at google - send to devlin
2015/03/17 14:35:11
detect -> detected
|
+ Chrome will connect as usual - the Extension will never be involved.</li> |
+ <li>Otherwise, if a captive portal is detected, the user is notified and asked |
+ to authenticate using the registered Extension or whether to visit the captive |
+ portal page.</li> |
+ <li>If the user selects the Extension, Chrome notifies the Extension through |
+ the $(ref:onCaptivePortalDetected) event.</li> |
+ <li>The Extension should now interact with the user if necessary and |
+ authenticate at the captive portal.</li> |
+ <li>Once the Extension finished the authentication, it notifies the API using |
+ $(ref:finishAuthentication) about its success or failure.</li> |
+</ol> |
+ |
+<p> |
+In the Extension, this can look similar to the following snippet: |
+</p> |
+ |
+<pre data-filename="background.js"> |
+var myNetworks = [ |
+ { Type: 'WiFi', SSID: 'MyHotSpot-1' }, |
+ { Type: 'WiFi', SSID: 'MyHotSpot-2' } |
+]; |
+ |
+chrome.networking.config.setNetworkFilter(myNetworks, function() { |
+ if (chrome.runtime.lastError) { |
+ // Handle Error |
+ } |
+}); |
+ |
+chrome.networking.config.onCaptivePortalDetected.addListener( |
+ function(networkInfo) { |
+ var guid = networkInfo.GUID; |
+ |
+ // Check at first whether we really care about this network. |
+ // This can look at additional network properties like BSSID that are not |
+ // supported in the filter. |
+ if (isBadNetwork(networkInfo)) { |
+ chrome.networking.config.finishAuthentication(guid, 'unhandled'); |
+ return; |
+ } |
+ checkForMyCaptivePortalServer(function(serverStatus) { |
+ if (serverStatus == 'not-detected') { |
+ chrome.networking.config.finishAuthentication(guid, 'unhandled'); |
+ return; |
+ } |
+ if (serverStatus == 'error') { |
+ chrome.networking.config.finishAuthentication(guid, 'failed'); |
+ return; |
+ } |
+ |
+ // If required, interact with the user, e.g. for registration on first |
+ // usage. Credentials can be cached for subsequent authentications. |
+ ShowUIToRegisterUser(continueAuthentication.bind(null, guid)); |
+ }); |
+}); |
+ |
+function continueAuthentication(guid, credentials) { |
+ if (!credentials) { |
+ chrome.networking.config.finishAuthentication(guid, 'failed'); |
+ } |
+ AuthenticateToMyCaptivePortalServer(credentials, function(success) { |
+ chrome.networking.config.finishAuthentication( |
+ guid, success ? 'succeeded' : 'rejected'); |
+ }); |
+} |
+</pre> |