| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/browser/chromeos/proxy_config_service_impl.h" | 5 #include "chrome/browser/chromeos/proxy_config_service_impl.h" |
| 6 | 6 |
| 7 #include <ostream> | 7 #include <ostream> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| 11 #include "base/task.h" | 11 #include "base/task.h" |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 DictionaryValue* proxy_dict; | 384 DictionaryValue* proxy_dict; |
| 385 if (!dict->GetDictionary(key_name, &proxy_dict)) | 385 if (!dict->GetDictionary(key_name, &proxy_dict)) |
| 386 return ok_if_absent; | 386 return ok_if_absent; |
| 387 return manual_proxy->Decode(proxy_dict, scheme); | 387 return manual_proxy->Decode(proxy_dict, scheme); |
| 388 } | 388 } |
| 389 | 389 |
| 390 //------------------- ProxyConfigServiceImpl: public methods ------------------- | 390 //------------------- ProxyConfigServiceImpl: public methods ------------------- |
| 391 | 391 |
| 392 ProxyConfigServiceImpl::ProxyConfigServiceImpl() | 392 ProxyConfigServiceImpl::ProxyConfigServiceImpl() |
| 393 : can_post_task_(false), | 393 : can_post_task_(false), |
| 394 has_config_(false), | 394 config_availability_(net::ProxyConfigService::CONFIG_PENDING), |
| 395 persist_to_device_(true), | 395 persist_to_device_(true), |
| 396 persist_to_device_pending_(false) { | 396 persist_to_device_pending_(false) { |
| 397 // Start async fetch of proxy config from settings persisted on device. | 397 // Start async fetch of proxy config from settings persisted on device. |
| 398 // TODO(kuan): retrieve config from policy and owner and merge them | 398 // TODO(kuan): retrieve config from policy and owner and merge them |
| 399 bool use_default = true; | 399 bool use_default = true; |
| 400 if (CrosLibrary::Get()->EnsureLoaded()) { | 400 if (CrosLibrary::Get()->EnsureLoaded()) { |
| 401 retrieve_property_op_ = SignedSettings::CreateRetrievePropertyOp( | 401 retrieve_property_op_ = SignedSettings::CreateRetrievePropertyOp( |
| 402 kSettingProxyEverywhere, this); | 402 kSettingProxyEverywhere, this); |
| 403 if (retrieve_property_op_) { | 403 if (retrieve_property_op_) { |
| 404 retrieve_property_op_->Execute(); | 404 retrieve_property_op_->Execute(); |
| 405 VLOG(1) << "Start retrieving proxy setting from device"; | 405 VLOG(1) << "Start retrieving proxy setting from device"; |
| 406 use_default = false; | 406 use_default = false; |
| 407 } else { | 407 } else { |
| 408 VLOG(1) << "Fail to retrieve proxy setting from device"; | 408 VLOG(1) << "Fail to retrieve proxy setting from device"; |
| 409 } | 409 } |
| 410 } | 410 } |
| 411 if (use_default) | 411 if (use_default) |
| 412 InitConfigToDefault(false); | 412 config_availability_ = net::ProxyConfigService::CONFIG_UNSET; |
| 413 can_post_task_ = true; | 413 can_post_task_ = true; |
| 414 } | 414 } |
| 415 | 415 |
| 416 ProxyConfigServiceImpl::ProxyConfigServiceImpl(const ProxyConfig& init_config) | 416 ProxyConfigServiceImpl::ProxyConfigServiceImpl(const ProxyConfig& init_config) |
| 417 : can_post_task_(true), | 417 : can_post_task_(true), |
| 418 has_config_(true), | 418 config_availability_(net::ProxyConfigService::CONFIG_VALID), |
| 419 persist_to_device_(false), | 419 persist_to_device_(false), |
| 420 persist_to_device_pending_(false) { | 420 persist_to_device_pending_(false) { |
| 421 reference_config_ = init_config; | 421 reference_config_ = init_config; |
| 422 // Update the IO-accessible copy in |cached_config_| as well. | 422 // Update the IO-accessible copy in |cached_config_| as well. |
| 423 cached_config_ = reference_config_; | 423 cached_config_ = reference_config_; |
| 424 } | 424 } |
| 425 | 425 |
| 426 ProxyConfigServiceImpl::~ProxyConfigServiceImpl() { | 426 ProxyConfigServiceImpl::~ProxyConfigServiceImpl() { |
| 427 } | 427 } |
| 428 | 428 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 507 observers_.AddObserver(observer); | 507 observers_.AddObserver(observer); |
| 508 } | 508 } |
| 509 | 509 |
| 510 void ProxyConfigServiceImpl::RemoveObserver( | 510 void ProxyConfigServiceImpl::RemoveObserver( |
| 511 net::ProxyConfigService::Observer* observer) { | 511 net::ProxyConfigService::Observer* observer) { |
| 512 // Should be called from IO thread. | 512 // Should be called from IO thread. |
| 513 CheckCurrentlyOnIOThread(); | 513 CheckCurrentlyOnIOThread(); |
| 514 observers_.RemoveObserver(observer); | 514 observers_.RemoveObserver(observer); |
| 515 } | 515 } |
| 516 | 516 |
| 517 bool ProxyConfigServiceImpl::IOGetProxyConfig(net::ProxyConfig* net_config) { | 517 net::ProxyConfigService::ConfigAvailability |
| 518 ProxyConfigServiceImpl::IOGetProxyConfig(net::ProxyConfig* net_config) { |
| 518 // Should be called from IO thread. | 519 // Should be called from IO thread. |
| 519 CheckCurrentlyOnIOThread(); | 520 CheckCurrentlyOnIOThread(); |
| 520 if (has_config_) { | 521 if (config_availability_ == net::ProxyConfigService::CONFIG_VALID) |
| 521 // Simply return the last cached proxy configuration. | |
| 522 cached_config_.ToNetProxyConfig(net_config); | 522 cached_config_.ToNetProxyConfig(net_config); |
| 523 return true; | 523 |
| 524 } | 524 return config_availability_; |
| 525 return false; | |
| 526 } | 525 } |
| 527 | 526 |
| 528 void ProxyConfigServiceImpl::OnSettingsOpCompleted( | 527 void ProxyConfigServiceImpl::OnSettingsOpCompleted( |
| 529 SignedSettings::ReturnCode code, | 528 SignedSettings::ReturnCode code, |
| 530 bool value) { | 529 bool value) { |
| 531 if (SignedSettings::SUCCESS == code) | 530 if (SignedSettings::SUCCESS == code) |
| 532 VLOG(1) << "Stored proxy setting to device"; | 531 VLOG(1) << "Stored proxy setting to device"; |
| 533 else | 532 else |
| 534 LOG(WARNING) << "Error storing proxy setting to device"; | 533 LOG(WARNING) << "Error storing proxy setting to device"; |
| 535 store_property_op_ = NULL; | 534 store_property_op_ = NULL; |
| 536 if (persist_to_device_pending_) | 535 if (persist_to_device_pending_) |
| 537 PersistConfigToDevice(); | 536 PersistConfigToDevice(); |
| 538 } | 537 } |
| 539 | 538 |
| 540 void ProxyConfigServiceImpl::OnSettingsOpCompleted( | 539 void ProxyConfigServiceImpl::OnSettingsOpCompleted( |
| 541 SignedSettings::ReturnCode code, | 540 SignedSettings::ReturnCode code, |
| 542 std::string value) { | 541 std::string value) { |
| 542 retrieve_property_op_ = NULL; |
| 543 if (SignedSettings::SUCCESS == code) { | 543 if (SignedSettings::SUCCESS == code) { |
| 544 VLOG(1) << "Retrieved proxy setting from device, value=[" << value << "]"; | 544 VLOG(1) << "Retrieved proxy setting from device, value=[" << value << "]"; |
| 545 if (reference_config_.Deserialize(value)) { | 545 if (reference_config_.Deserialize(value)) { |
| 546 OnUISetProxyConfig(false); | 546 IOSetProxyConfig(reference_config_, |
| 547 net::ProxyConfigService::CONFIG_VALID); |
| 548 return; |
| 547 } else { | 549 } else { |
| 548 LOG(WARNING) << "Error deserializing device's proxy setting"; | 550 LOG(WARNING) << "Error deserializing device's proxy setting"; |
| 549 InitConfigToDefault(true); | |
| 550 } | 551 } |
| 551 } else { | 552 } else { |
| 552 LOG(WARNING) << "Error retrieving proxy setting from device"; | 553 LOG(WARNING) << "Error retrieving proxy setting from device"; |
| 553 InitConfigToDefault(true); | |
| 554 } | 554 } |
| 555 retrieve_property_op_ = NULL; | 555 |
| 556 // Update the configuration state on the IO thread. |
| 557 IOSetProxyConfig(reference_config_, net::ProxyConfigService::CONFIG_UNSET); |
| 556 } | 558 } |
| 557 | 559 |
| 558 //------------------ ProxyConfigServiceImpl: private methods ------------------- | 560 //------------------ ProxyConfigServiceImpl: private methods ------------------- |
| 559 | 561 |
| 560 void ProxyConfigServiceImpl::InitConfigToDefault(bool post_to_io_thread) { | |
| 561 VLOG(1) << "Using default proxy config: auto-detect"; | |
| 562 reference_config_.mode = ProxyConfig::MODE_AUTO_DETECT; | |
| 563 reference_config_.automatic_proxy.source = ProxyConfig::SOURCE_OWNER; | |
| 564 if (post_to_io_thread && can_post_task_) { | |
| 565 OnUISetProxyConfig(false); | |
| 566 } else { | |
| 567 // Update the IO-accessible copy in |cached_config_| as well. | |
| 568 cached_config_ = reference_config_; | |
| 569 has_config_ = true; | |
| 570 } | |
| 571 } | |
| 572 | |
| 573 void ProxyConfigServiceImpl::PersistConfigToDevice() { | 562 void ProxyConfigServiceImpl::PersistConfigToDevice() { |
| 574 DCHECK(!store_property_op_); | 563 DCHECK(!store_property_op_); |
| 575 persist_to_device_pending_ = false; | 564 persist_to_device_pending_ = false; |
| 576 std::string value; | 565 std::string value; |
| 577 if (!reference_config_.Serialize(&value)) { | 566 if (!reference_config_.Serialize(&value)) { |
| 578 LOG(WARNING) << "Error serializing proxy config"; | 567 LOG(WARNING) << "Error serializing proxy config"; |
| 579 return; | 568 return; |
| 580 } | 569 } |
| 581 store_property_op_ = SignedSettings::CreateStorePropertyOp( | 570 store_property_op_ = SignedSettings::CreateStorePropertyOp( |
| 582 kSettingProxyEverywhere, value, this); | 571 kSettingProxyEverywhere, value, this); |
| 583 store_property_op_->Execute(); | 572 store_property_op_->Execute(); |
| 584 VLOG(1) << "Start storing proxy setting to device, value=" << value; | 573 VLOG(1) << "Start storing proxy setting to device, value=" << value; |
| 585 } | 574 } |
| 586 | 575 |
| 587 void ProxyConfigServiceImpl::OnUISetProxyConfig(bool persist_to_device) { | 576 void ProxyConfigServiceImpl::OnUISetProxyConfig(bool persist_to_device) { |
| 588 // Posts a task to IO thread with the new config, so it can update | 577 IOSetProxyConfig(reference_config_, net::ProxyConfigService::CONFIG_VALID); |
| 589 // |cached_config_|. | |
| 590 Task* task = NewRunnableMethod(this, | |
| 591 &ProxyConfigServiceImpl::IOSetProxyConfig, reference_config_); | |
| 592 if (!BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, task)) { | |
| 593 VLOG(1) << "Couldn't post task to IO thread to set new proxy config"; | |
| 594 delete task; | |
| 595 } | |
| 596 | |
| 597 if (persist_to_device && CrosLibrary::Get()->EnsureLoaded()) { | 578 if (persist_to_device && CrosLibrary::Get()->EnsureLoaded()) { |
| 598 if (store_property_op_) { | 579 if (store_property_op_) { |
| 599 persist_to_device_pending_ = true; | 580 persist_to_device_pending_ = true; |
| 600 VLOG(1) << "Pending persisting proxy setting to device"; | 581 VLOG(1) << "Pending persisting proxy setting to device"; |
| 601 } else { | 582 } else { |
| 602 PersistConfigToDevice(); | 583 PersistConfigToDevice(); |
| 603 } | 584 } |
| 604 } | 585 } |
| 605 } | 586 } |
| 606 | 587 |
| 588 void ProxyConfigServiceImpl::IOSetProxyConfig( |
| 589 const ProxyConfig& new_config, |
| 590 net::ProxyConfigService::ConfigAvailability new_availability) { |
| 591 if (!BrowserThread::CurrentlyOn(BrowserThread::IO) && can_post_task_) { |
| 592 // Posts a task to IO thread with the new config, so it can update |
| 593 // |cached_config_|. |
| 594 Task* task = NewRunnableMethod(this, |
| 595 &ProxyConfigServiceImpl::IOSetProxyConfig, |
| 596 new_config, |
| 597 new_availability); |
| 598 if (!BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, task)) |
| 599 VLOG(1) << "Couldn't post task to IO thread to set new proxy config"; |
| 600 return; |
| 601 } |
| 602 |
| 603 // Now guaranteed to be on the correct thread. |
| 604 VLOG(1) << "Proxy configuration changed"; |
| 605 cached_config_ = new_config; |
| 606 config_availability_ = new_availability; |
| 607 // Notify observers of new proxy config. |
| 608 net::ProxyConfig net_config; |
| 609 cached_config_.ToNetProxyConfig(&net_config); |
| 610 FOR_EACH_OBSERVER(net::ProxyConfigService::Observer, observers_, |
| 611 OnProxyConfigChanged(net_config, config_availability_)); |
| 612 } |
| 613 |
| 607 void ProxyConfigServiceImpl::CheckCurrentlyOnIOThread() { | 614 void ProxyConfigServiceImpl::CheckCurrentlyOnIOThread() { |
| 608 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 615 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 609 } | 616 } |
| 610 | 617 |
| 611 void ProxyConfigServiceImpl::CheckCurrentlyOnUIThread() { | 618 void ProxyConfigServiceImpl::CheckCurrentlyOnUIThread() { |
| 612 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 619 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 613 } | 620 } |
| 614 | 621 |
| 615 void ProxyConfigServiceImpl::IOSetProxyConfig(const ProxyConfig& new_config) { | |
| 616 // This is called on the IO thread (posted from UI thread). | |
| 617 CheckCurrentlyOnIOThread(); | |
| 618 VLOG(1) << "Proxy configuration changed"; | |
| 619 has_config_ = true; | |
| 620 cached_config_ = new_config; | |
| 621 // Notify observers of new proxy config. | |
| 622 net::ProxyConfig net_config; | |
| 623 cached_config_.ToNetProxyConfig(&net_config); | |
| 624 FOR_EACH_OBSERVER(net::ProxyConfigService::Observer, observers_, | |
| 625 OnProxyConfigChanged(net_config)); | |
| 626 } | |
| 627 | |
| 628 } // namespace chromeos | 622 } // namespace chromeos |
| OLD | NEW |