wifi_config_view.h revision 3551c9c881056c480085172ff9840cab31610854
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_OPTIONS_WIFI_CONFIG_VIEW_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_OPTIONS_WIFI_CONFIG_VIEW_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/memory/weak_ptr.h" 145e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string16.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/cros/cert_library.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/cros/network_property_ui_data.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/options/network_config_view.h" 18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chromeos/network/network_state_handler_observer.h" 19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "third_party/cros_system_api/dbus/service_constants.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/models/combobox_model.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/button.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/combobox/combobox_listener.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/textfield/textfield_controller.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Checkbox; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Label; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ToggleImageButton; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass NetworkState; 35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EAPMethodComboboxModel; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Phase2AuthComboboxModel; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SecurityComboboxModel; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ServerCACertComboboxModel; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UserCertComboboxModel; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A dialog box for showing a password textfield. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WifiConfigView : public ChildNetworkConfigView, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public views::TextfieldController, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public views::ButtonListener, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public views::ComboboxListener, 49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch public CertLibrary::Observer, 50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch public NetworkStateHandlerObserver { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch WifiConfigView(NetworkConfigView* parent, 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& service_path, 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool show_8021x); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WifiConfigView(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // views::TextfieldController 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ContentsChanged(views::Textfield* sender, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& new_contents) OVERRIDE; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool HandleKeyEvent(views::Textfield* sender, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::KeyEvent& key_event) OVERRIDE; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // views::ButtonListener 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ButtonPressed(views::Button* sender, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Event& event) OVERRIDE; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // views::ComboboxListener 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnSelectedIndexChanged(views::Combobox* combobox) OVERRIDE; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // CertLibrary::Observer 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnCertificatesLoaded(bool initial_load) OVERRIDE; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // ChildNetworkConfigView 7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual string16 GetTitle() const OVERRIDE; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual views::View* GetInitiallyFocusedView() OVERRIDE; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CanLogin() OVERRIDE; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Login() OVERRIDE; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Cancel() OVERRIDE; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InitFocus() OVERRIDE; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // NetworkStateHandlerObserver 82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void NetworkPropertiesUpdated(const NetworkState* network) OVERRIDE; 83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parses a WiFi UI |property| from the ONC associated with |network|. |key| 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is the property name within the ONC WiFi dictionary. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ParseWiFiUIProperty(NetworkPropertyUIData* property_ui_data, 87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const NetworkState* network, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parses a WiFi EAP UI |property| from the ONC associated with |network|. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |key| is the property name within the ONC WiFi.EAP dictionary. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ParseWiFiEAPUIProperty(NetworkPropertyUIData* property_ui_data, 93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const NetworkState* network, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& key); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializes UI. If |show_8021x| includes 802.1x config options. 98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void Init(bool show_8021x); 99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Callback to initialize fields from uncached network properties. 101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void InitFromProperties(bool show_8021x, 102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const std::string& service_path, 103ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::DictionaryValue& dictionary); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get input values. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetSsid() const; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetPassphrase() const; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetSaveCredentials() const; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetShareNetwork(bool share_default) const; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get various 802.1X EAP values from the widgets. 112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string GetEapMethod() const; 113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::string GetEapPhase2Auth() const; 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::string GetEapServerCaCertPEM() const; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetEapUseSystemCas() const; 1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string GetEapSubjectMatch() const; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetEapClientCertPkcs11Id() const; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetEapIdentity() const; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetEapAnonymousIdentity() const; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Fill in |properties| with the appropriate values. 122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void SetEapProperties(base::DictionaryValue* properties); 123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the EAP method requires a user certificate. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool UserCertRequired() const; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if at least one user certificate is installed. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HaveUserCerts() const; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if there is a selected user certificate and it is valid. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsUserCertValid() const; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the phase 2 auth is relevant. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Phase2AuthActive() const; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns whether the current configuration requires a passphrase. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool PassphraseActive() const; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if a user cert should be selected. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool UserCertActive() const; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if a CA cert selection should be allowed. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CaCertActive() const; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates state of the Login button. 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateDialogButtons(); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enable/Disable EAP fields as appropriate based on selected EAP method. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RefreshEapFields(); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enable/Disable "share this network" checkbox. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RefreshShareCheckbox(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates the error text label. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateErrorLabel(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkPropertyUIData eap_method_ui_data_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkPropertyUIData phase_2_auth_ui_data_; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkPropertyUIData user_cert_ui_data_; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkPropertyUIData server_ca_cert_ui_data_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkPropertyUIData identity_ui_data_; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkPropertyUIData identity_anonymous_ui_data_; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkPropertyUIData save_credentials_ui_data_; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetworkPropertyUIData passphrase_ui_data_; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Textfield* ssid_textfield_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<internal::EAPMethodComboboxModel> eap_method_combobox_model_; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Combobox* eap_method_combobox_; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* phase_2_auth_label_; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<internal::Phase2AuthComboboxModel> phase_2_auth_combobox_model_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Combobox* phase_2_auth_combobox_; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* user_cert_label_; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<internal::UserCertComboboxModel> user_cert_combobox_model_; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Combobox* user_cert_combobox_; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* server_ca_cert_label_; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<internal::ServerCACertComboboxModel> 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) server_ca_cert_combobox_model_; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Combobox* server_ca_cert_combobox_; 1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) views::Label* subject_match_label_; 1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) views::Textfield* subject_match_textfield_; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* identity_label_; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Textfield* identity_textfield_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* identity_anonymous_label_; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Textfield* identity_anonymous_textfield_; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Checkbox* save_credentials_checkbox_; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Checkbox* share_network_checkbox_; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* shared_network_label_; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<internal::SecurityComboboxModel> security_combobox_model_; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Combobox* security_combobox_; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* passphrase_label_; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Textfield* passphrase_textfield_; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::ToggleImageButton* passphrase_visible_button_; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* error_label_; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch base::WeakPtrFactory<WifiConfigView> weak_ptr_factory_; 196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WifiConfigView); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_CHROMEOS_OPTIONS_WIFI_CONFIG_VIEW_H_ 203