Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Side by Side Diff: chromeos/network/managed_network_configuration_handler.cc

Issue 14729017: Add NetworkHandler to own network handlers in src/chromeos/network (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase + Add NetworkConnectionHandler to NetworkHandler Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chromeos/network/managed_network_configuration_handler.h" 5 #include "chromeos/network/managed_network_configuration_handler.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 const base::DictionaryValue& shill_properties) { 289 const base::DictionaryValue& shill_properties) {
290 scoped_ptr<base::DictionaryValue> onc_network( 290 scoped_ptr<base::DictionaryValue> onc_network(
291 onc::TranslateShillServiceToONCPart( 291 onc::TranslateShillServiceToONCPart(
292 shill_properties, 292 shill_properties,
293 &onc::kNetworkWithStateSignature)); 293 &onc::kNetworkWithStateSignature));
294 callback.Run(service_path, *onc_network); 294 callback.Run(service_path, *onc_network);
295 } 295 }
296 296
297 } // namespace 297 } // namespace
298 298
299 static ManagedNetworkConfigurationHandler*
300 g_configuration_handler_instance = NULL;
301
302 // static
303 void ManagedNetworkConfigurationHandler::Initialize(
304 NetworkProfileHandler* profile_handler) {
305 CHECK(!g_configuration_handler_instance);
306 g_configuration_handler_instance =
307 new ManagedNetworkConfigurationHandler(profile_handler);
308 }
309
310 // static
311 bool ManagedNetworkConfigurationHandler::IsInitialized() {
312 return g_configuration_handler_instance;
313 }
314
315 // static
316 void ManagedNetworkConfigurationHandler::Shutdown() {
317 CHECK(g_configuration_handler_instance);
318 delete g_configuration_handler_instance;
319 g_configuration_handler_instance = NULL;
320 }
321
322 // static
323 ManagedNetworkConfigurationHandler* ManagedNetworkConfigurationHandler::Get() {
324 CHECK(g_configuration_handler_instance);
325 return g_configuration_handler_instance;
326 }
327 299
328 // static 300 // static
329 scoped_ptr<NetworkUIData> ManagedNetworkConfigurationHandler::GetUIData( 301 scoped_ptr<NetworkUIData> ManagedNetworkConfigurationHandler::GetUIData(
330 const base::DictionaryValue& shill_dictionary) { 302 const base::DictionaryValue& shill_dictionary) {
331 std::string ui_data_blob; 303 std::string ui_data_blob;
332 if (shill_dictionary.GetStringWithoutPathExpansion( 304 if (shill_dictionary.GetStringWithoutPathExpansion(
333 flimflam::kUIDataProperty, 305 flimflam::kUIDataProperty,
334 &ui_data_blob) && 306 &ui_data_blob) &&
335 !ui_data_blob.empty()) { 307 !ui_data_blob.empty()) {
336 scoped_ptr<base::DictionaryValue> ui_data_dict = 308 scoped_ptr<base::DictionaryValue> ui_data_dict =
(...skipping 12 matching lines...) Expand all
349 const std::string& service_path, 321 const std::string& service_path,
350 const network_handler::DictionaryResultCallback& callback, 322 const network_handler::DictionaryResultCallback& callback,
351 const network_handler::ErrorCallback& error_callback) { 323 const network_handler::ErrorCallback& error_callback) {
352 if (!GetPoliciesForUser(userhash) || !GetPoliciesForUser(std::string())) { 324 if (!GetPoliciesForUser(userhash) || !GetPoliciesForUser(std::string())) {
353 RunErrorCallback(service_path, 325 RunErrorCallback(service_path,
354 kPoliciesNotInitialized, 326 kPoliciesNotInitialized,
355 kPoliciesNotInitializedMessage, 327 kPoliciesNotInitializedMessage,
356 error_callback); 328 error_callback);
357 return; 329 return;
358 } 330 }
359 NetworkConfigurationHandler::Get()->GetProperties( 331 network_configuration_handler_->GetProperties(
360 service_path, 332 service_path,
361 base::Bind( 333 base::Bind(
362 &ManagedNetworkConfigurationHandler::GetManagedPropertiesCallback, 334 &ManagedNetworkConfigurationHandler::GetManagedPropertiesCallback,
363 weak_ptr_factory_.GetWeakPtr(), 335 weak_ptr_factory_.GetWeakPtr(),
364 callback, 336 callback,
365 error_callback), 337 error_callback),
366 error_callback); 338 error_callback);
367 } 339 }
368 340
369 void ManagedNetworkConfigurationHandler::GetManagedPropertiesCallback( 341 void ManagedNetworkConfigurationHandler::GetManagedPropertiesCallback(
370 const network_handler::DictionaryResultCallback& callback, 342 const network_handler::DictionaryResultCallback& callback,
371 const network_handler::ErrorCallback& error_callback, 343 const network_handler::ErrorCallback& error_callback,
372 const std::string& service_path, 344 const std::string& service_path,
373 const base::DictionaryValue& shill_properties) { 345 const base::DictionaryValue& shill_properties) {
374 std::string profile_path; 346 std::string profile_path;
375 shill_properties.GetStringWithoutPathExpansion(flimflam::kProfileProperty, 347 shill_properties.GetStringWithoutPathExpansion(flimflam::kProfileProperty,
376 &profile_path); 348 &profile_path);
377 const NetworkProfile* profile = 349 const NetworkProfile* profile =
378 profile_handler_->GetProfileForPath(profile_path); 350 network_profile_handler_->GetProfileForPath(profile_path);
379 if (!profile) { 351 if (!profile) {
380 VLOG(1) << "No or no known profile received for service " 352 VLOG(1) << "No or no known profile received for service "
381 << service_path << "."; 353 << service_path << ".";
382 } 354 }
383 355
384 scoped_ptr<NetworkUIData> ui_data = GetUIData(shill_properties); 356 scoped_ptr<NetworkUIData> ui_data = GetUIData(shill_properties);
385 357
386 const base::DictionaryValue* user_settings = NULL; 358 const base::DictionaryValue* user_settings = NULL;
387 const base::DictionaryValue* shared_settings = NULL; 359 const base::DictionaryValue* shared_settings = NULL;
388 360
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 user_settings, 411 user_settings,
440 shared_settings, 412 shared_settings,
441 active_settings.get()); 413 active_settings.get());
442 callback.Run(service_path, *augmented_properties); 414 callback.Run(service_path, *augmented_properties);
443 } 415 }
444 416
445 void ManagedNetworkConfigurationHandler::GetProperties( 417 void ManagedNetworkConfigurationHandler::GetProperties(
446 const std::string& service_path, 418 const std::string& service_path,
447 const network_handler::DictionaryResultCallback& callback, 419 const network_handler::DictionaryResultCallback& callback,
448 const network_handler::ErrorCallback& error_callback) const { 420 const network_handler::ErrorCallback& error_callback) const {
449 NetworkConfigurationHandler::Get()->GetProperties( 421 network_configuration_handler_->GetProperties(
450 service_path, 422 service_path,
451 base::Bind(&TranslatePropertiesToOncAndRunCallback, callback), 423 base::Bind(&TranslatePropertiesToOncAndRunCallback, callback),
452 error_callback); 424 error_callback);
453 } 425 }
454 426
455 void ManagedNetworkConfigurationHandler::SetProperties( 427 void ManagedNetworkConfigurationHandler::SetProperties(
456 const std::string& service_path, 428 const std::string& service_path,
457 const base::DictionaryValue& user_settings, 429 const base::DictionaryValue& user_settings,
458 const base::Closure& callback, 430 const base::Closure& callback,
459 const network_handler::ErrorCallback& error_callback) const { 431 const network_handler::ErrorCallback& error_callback) const {
460 const NetworkState* state = 432 const NetworkState* state =
461 NetworkStateHandler::Get()->GetNetworkState(service_path); 433 network_state_handler_->GetNetworkState(service_path);
462 434
463 if (!state) { 435 if (!state) {
464 RunErrorCallback(service_path, 436 RunErrorCallback(service_path,
465 kUnknownServicePath, 437 kUnknownServicePath,
466 kUnknownServicePathMessage, 438 kUnknownServicePathMessage,
467 error_callback); 439 error_callback);
468 return; 440 return;
469 } 441 }
470 442
471 std::string guid = state->guid(); 443 std::string guid = state->guid();
472 if (guid.empty()) { 444 if (guid.empty()) {
473 // TODO(pneubeck): create an initial configuration in this case. As for 445 // TODO(pneubeck): create an initial configuration in this case. As for
474 // CreateConfiguration, user settings from older ChromeOS versions have to 446 // CreateConfiguration, user settings from older ChromeOS versions have to
475 // determined here. 447 // determined here.
476 RunErrorCallback(service_path, 448 RunErrorCallback(service_path,
477 kSetOnUnconfiguredNetwork, 449 kSetOnUnconfiguredNetwork,
478 kSetOnUnconfiguredNetworkMessage, 450 kSetOnUnconfiguredNetworkMessage,
479 error_callback); 451 error_callback);
480 return; 452 return;
481 } 453 }
482 454
483 const std::string& profile_path = state->profile_path(); 455 const std::string& profile_path = state->profile_path();
484 const NetworkProfile *profile = 456 const NetworkProfile *profile =
485 profile_handler_->GetProfileForPath(profile_path); 457 network_profile_handler_->GetProfileForPath(profile_path);
486 if (!profile) { 458 if (!profile) {
487 RunErrorCallback(service_path, 459 RunErrorCallback(service_path,
488 kUnknownProfilePath, 460 kUnknownProfilePath,
489 kUnknownProfilePathMessage, 461 kUnknownProfilePathMessage,
490 error_callback); 462 error_callback);
491 return; 463 return;
492 } 464 }
493 465
494 VLOG(2) << "SetProperties: Found GUID " << guid << " and profile " 466 VLOG(2) << "SetProperties: Found GUID " << guid << " and profile "
495 << profile->ToDebugString(); 467 << profile->ToDebugString();
(...skipping 30 matching lines...) Expand all
526 } 498 }
527 if (validation_result == onc::Validator::VALID_WITH_WARNINGS) 499 if (validation_result == onc::Validator::VALID_WITH_WARNINGS)
528 LOG(WARNING) << "Validation of ONC user settings produced warnings."; 500 LOG(WARNING) << "Validation of ONC user settings produced warnings.";
529 501
530 const base::DictionaryValue* policy = GetByGUID(*policies, guid); 502 const base::DictionaryValue* policy = GetByGUID(*policies, guid);
531 VLOG(2) << "This configuration is " << (policy ? "" : "not ") << "managed."; 503 VLOG(2) << "This configuration is " << (policy ? "" : "not ") << "managed.";
532 504
533 scoped_ptr<base::DictionaryValue> shill_dictionary( 505 scoped_ptr<base::DictionaryValue> shill_dictionary(
534 CreateShillConfiguration(*profile, guid, policy, &user_settings)); 506 CreateShillConfiguration(*profile, guid, policy, &user_settings));
535 507
536 NetworkConfigurationHandler::Get()->SetProperties(service_path, 508 network_configuration_handler_->SetProperties(
537 *shill_dictionary, 509 service_path, *shill_dictionary, callback, error_callback);
538 callback,
539 error_callback);
540 } 510 }
541 511
542 void ManagedNetworkConfigurationHandler::CreateConfiguration( 512 void ManagedNetworkConfigurationHandler::CreateConfiguration(
543 const std::string& userhash, 513 const std::string& userhash,
544 const base::DictionaryValue& properties, 514 const base::DictionaryValue& properties,
545 const network_handler::StringResultCallback& callback, 515 const network_handler::StringResultCallback& callback,
546 const network_handler::ErrorCallback& error_callback) const { 516 const network_handler::ErrorCallback& error_callback) const {
547 const GuidToPolicyMap* policies = GetPoliciesForUser(userhash); 517 const GuidToPolicyMap* policies = GetPoliciesForUser(userhash);
548 if (!policies) { 518 if (!policies) {
549 RunErrorCallback("", 519 RunErrorCallback("",
550 kPoliciesNotInitialized, 520 kPoliciesNotInitialized,
551 kPoliciesNotInitializedMessage, 521 kPoliciesNotInitializedMessage,
552 error_callback); 522 error_callback);
553 return; 523 return;
554 } 524 }
555 525
556 if (FindMatchingPolicy(*policies, properties)) { 526 if (FindMatchingPolicy(*policies, properties)) {
557 RunErrorCallback("", 527 RunErrorCallback("",
558 kNetworkAlreadyConfigured, 528 kNetworkAlreadyConfigured,
559 kNetworkAlreadyConfiguredMessage, 529 kNetworkAlreadyConfiguredMessage,
560 error_callback); 530 error_callback);
561 } 531 }
562 532
563 const NetworkProfile* profile = 533 const NetworkProfile* profile =
564 profile_handler_->GetProfileForUserhash(userhash); 534 network_profile_handler_->GetProfileForUserhash(userhash);
565 if (!profile) { 535 if (!profile) {
566 RunErrorCallback("", 536 RunErrorCallback("",
567 kProfileNotInitialized, 537 kProfileNotInitialized,
568 kProfileNotInitializedMessage, 538 kProfileNotInitializedMessage,
569 error_callback); 539 error_callback);
570 } 540 }
571 541
572 // TODO(pneubeck): In case of WiFi, check that no other configuration for the 542 // TODO(pneubeck): In case of WiFi, check that no other configuration for the
573 // same {SSID, mode, security} exists. We don't support such multiple 543 // same {SSID, mode, security} exists. We don't support such multiple
574 // configurations, yet. 544 // configurations, yet.
575 545
576 // Generate a new GUID for this configuration. Ignore the maybe provided GUID 546 // Generate a new GUID for this configuration. Ignore the maybe provided GUID
577 // in |properties| as it is not our own and from an untrusted source. 547 // in |properties| as it is not our own and from an untrusted source.
578 std::string guid = base::GenerateGUID(); 548 std::string guid = base::GenerateGUID();
579 scoped_ptr<base::DictionaryValue> shill_dictionary( 549 scoped_ptr<base::DictionaryValue> shill_dictionary(
580 CreateShillConfiguration(*profile, guid, NULL /*no policy*/, 550 CreateShillConfiguration(*profile, guid, NULL /*no policy*/,
581 &properties)); 551 &properties));
582 552
583 NetworkConfigurationHandler::Get()->CreateConfiguration(*shill_dictionary, 553 network_configuration_handler_->CreateConfiguration(
584 callback, 554 *shill_dictionary, callback, error_callback);
585 error_callback);
586 } 555 }
587 556
588 void ManagedNetworkConfigurationHandler::RemoveConfiguration( 557 void ManagedNetworkConfigurationHandler::RemoveConfiguration(
589 const std::string& service_path, 558 const std::string& service_path,
590 const base::Closure& callback, 559 const base::Closure& callback,
591 const network_handler::ErrorCallback& error_callback) const { 560 const network_handler::ErrorCallback& error_callback) const {
592 NetworkConfigurationHandler::Get()->RemoveConfiguration(service_path, 561 network_configuration_handler_->RemoveConfiguration(
593 callback, 562 service_path, callback, error_callback);
594 error_callback);
595 } 563 }
596 564
597 // This class compares (entry point is Run()) |modified_policies| with the 565 // This class compares (entry point is Run()) |modified_policies| with the
598 // existing entries in the provided Shill profile |profile|. It fetches all 566 // existing entries in the provided Shill profile |profile|. It fetches all
599 // entries in parallel (GetProfileProperties), compares each entry with the 567 // entries in parallel (GetProfileProperties), compares each entry with the
600 // current policies (GetEntry) and adds all missing policies 568 // current policies (GetEntry) and adds all missing policies
601 // (~PolicyApplicator). 569 // (~PolicyApplicator).
602 class ManagedNetworkConfigurationHandler::PolicyApplicator 570 class ManagedNetworkConfigurationHandler::PolicyApplicator
603 : public base::RefCounted<PolicyApplicator> { 571 : public base::RefCounted<PolicyApplicator> {
604 public: 572 public:
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
731 } else { 699 } else {
732 VLOG_IF(1, old_guid == new_guid) 700 VLOG_IF(1, old_guid == new_guid)
733 << "Updating previously managed configuration with the updated " 701 << "Updating previously managed configuration with the updated "
734 << "policy " << new_guid << "."; 702 << "policy " << new_guid << ".";
735 703
736 // Update the existing configuration with the maybe changed 704 // Update the existing configuration with the maybe changed
737 // policy. Thereby the GUID might change. 705 // policy. Thereby the GUID might change.
738 scoped_ptr<base::DictionaryValue> shill_dictionary = 706 scoped_ptr<base::DictionaryValue> shill_dictionary =
739 CreateShillConfiguration(profile_, new_guid, new_policy, 707 CreateShillConfiguration(profile_, new_guid, new_policy,
740 ui_data->user_settings()); 708 ui_data->user_settings());
741 NetworkConfigurationHandler::Get()->CreateConfiguration( 709 handler_->network_configuration_handler()->
742 *shill_dictionary, 710 CreateConfiguration(*shill_dictionary,
743 base::Bind(&IgnoreString), 711 base::Bind(&IgnoreString),
744 base::Bind(&LogErrorWithDict, FROM_HERE)); 712 base::Bind(&LogErrorWithDict, FROM_HERE));
745 remaining_policies_.erase(new_guid); 713 remaining_policies_.erase(new_guid);
746 } 714 }
747 } else if (was_managed) { 715 } else if (was_managed) {
748 VLOG(1) << "Removing configuration previously managed by policy " 716 VLOG(1) << "Removing configuration previously managed by policy "
749 << old_guid << ", because the policy was removed."; 717 << old_guid << ", because the policy was removed.";
750 718
751 // Remove the entry, because the network was managed but isn't anymore. 719 // Remove the entry, because the network was managed but isn't anymore.
752 // Note: An alternative might be to preserve the user settings, but it's 720 // Note: An alternative might be to preserve the user settings, but it's
753 // unclear which values originating the policy should be removed. 721 // unclear which values originating the policy should be removed.
754 DeleteEntry(entry); 722 DeleteEntry(entry);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 LOG(ERROR) << "Policy " << *it << " doesn't exist anymore."; 764 LOG(ERROR) << "Policy " << *it << " doesn't exist anymore.";
797 continue; 765 continue;
798 } 766 }
799 767
800 VLOG(1) << "Creating new configuration managed by policy " << *it 768 VLOG(1) << "Creating new configuration managed by policy " << *it
801 << " in profile " << profile_.ToDebugString() << "."; 769 << " in profile " << profile_.ToDebugString() << ".";
802 770
803 scoped_ptr<base::DictionaryValue> shill_dictionary = 771 scoped_ptr<base::DictionaryValue> shill_dictionary =
804 CreateShillConfiguration(profile_, *it, policy, 772 CreateShillConfiguration(profile_, *it, policy,
805 NULL /* no user settings */); 773 NULL /* no user settings */);
806 NetworkConfigurationHandler::Get()->CreateConfiguration( 774 handler_->network_configuration_handler()->CreateConfiguration(
807 *shill_dictionary, 775 *shill_dictionary,
808 base::Bind(&IgnoreString), 776 base::Bind(&IgnoreString),
809 base::Bind(&LogErrorWithDict, FROM_HERE)); 777 base::Bind(&LogErrorWithDict, FROM_HERE));
810 } 778 }
811 } 779 }
812 780
813 std::set<std::string> remaining_policies_; 781 std::set<std::string> remaining_policies_;
814 base::WeakPtr<ManagedNetworkConfigurationHandler> handler_; 782 base::WeakPtr<ManagedNetworkConfigurationHandler> handler_;
815 NetworkProfile profile_; 783 NetworkProfile profile_;
816 784
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
855 policies[guid] = new_entry; 823 policies[guid] = new_entry;
856 824
857 const base::DictionaryValue* old_entry = old_policies[guid]; 825 const base::DictionaryValue* old_entry = old_policies[guid];
858 if (!old_entry || !old_entry->Equals(new_entry)) 826 if (!old_entry || !old_entry->Equals(new_entry))
859 modified_policies.insert(guid); 827 modified_policies.insert(guid);
860 } 828 }
861 829
862 STLDeleteValues(&old_policies); 830 STLDeleteValues(&old_policies);
863 831
864 const NetworkProfile* profile = 832 const NetworkProfile* profile =
865 profile_handler_->GetProfileForUserhash(userhash); 833 network_profile_handler_->GetProfileForUserhash(userhash);
866 if (!profile) { 834 if (!profile) {
867 VLOG(1) << "The relevant Shill profile isn't initialized yet, postponing " 835 VLOG(1) << "The relevant Shill profile isn't initialized yet, postponing "
868 << "policy application."; 836 << "policy application.";
869 return; 837 return;
870 } 838 }
871 839
872 scoped_refptr<PolicyApplicator> applicator = new PolicyApplicator( 840 scoped_refptr<PolicyApplicator> applicator = new PolicyApplicator(
873 weak_ptr_factory_.GetWeakPtr(), 841 weak_ptr_factory_.GetWeakPtr(),
874 *profile, 842 *profile,
875 &modified_policies); 843 &modified_policies);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
915 } 883 }
916 884
917 const ManagedNetworkConfigurationHandler::GuidToPolicyMap* 885 const ManagedNetworkConfigurationHandler::GuidToPolicyMap*
918 ManagedNetworkConfigurationHandler::GetPoliciesForProfile( 886 ManagedNetworkConfigurationHandler::GetPoliciesForProfile(
919 const NetworkProfile& profile) const { 887 const NetworkProfile& profile) const {
920 DCHECK(profile.type() != NetworkProfile::TYPE_SHARED || 888 DCHECK(profile.type() != NetworkProfile::TYPE_SHARED ||
921 profile.userhash.empty()); 889 profile.userhash.empty());
922 return GetPoliciesForUser(profile.userhash); 890 return GetPoliciesForUser(profile.userhash);
923 } 891 }
924 892
925 ManagedNetworkConfigurationHandler::ManagedNetworkConfigurationHandler( 893 ManagedNetworkConfigurationHandler::ManagedNetworkConfigurationHandler()
926 NetworkProfileHandler* profile_handler) 894 : network_state_handler_(NULL),
927 : profile_handler_(profile_handler), 895 network_profile_handler_(NULL),
896 network_configuration_handler_(NULL),
928 weak_ptr_factory_(this) { 897 weak_ptr_factory_(this) {
929 profile_handler_->AddObserver(this);
930 } 898 }
931 899
932 ManagedNetworkConfigurationHandler::~ManagedNetworkConfigurationHandler() { 900 ManagedNetworkConfigurationHandler::~ManagedNetworkConfigurationHandler() {
933 profile_handler_->RemoveObserver(this); 901 network_profile_handler_->RemoveObserver(this);
934 for (UserToPoliciesMap::iterator it = policies_by_user_.begin(); 902 for (UserToPoliciesMap::iterator it = policies_by_user_.begin();
935 it != policies_by_user_.end(); ++it) { 903 it != policies_by_user_.end(); ++it) {
936 STLDeleteValues(&it->second); 904 STLDeleteValues(&it->second);
937 } 905 }
938 } 906 }
939 907
908 void ManagedNetworkConfigurationHandler::Init(
909 NetworkStateHandler* network_state_handler,
910 NetworkProfileHandler* network_profile_handler,
911 NetworkConfigurationHandler* network_configuration_handler) {
912 network_state_handler_ = network_state_handler;
913 network_profile_handler_ = network_profile_handler;
914 network_configuration_handler_ = network_configuration_handler;
915 network_profile_handler_->AddObserver(this);
916 }
917
940 } // namespace chromeos 918 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698