diff options
author | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-13 19:02:24 +0000 |
---|---|---|
committer | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-13 19:02:24 +0000 |
commit | d4a75e37a73ddae7c855827838e2252bc60e99ef (patch) | |
tree | 369ec3da1c781184e97700984a1235130399d803 | |
parent | 624429c3f6490b11ef84911c96aaafc6f10a1dce (diff) | |
download | chromium_src-d4a75e37a73ddae7c855827838e2252bc60e99ef.zip chromium_src-d4a75e37a73ddae7c855827838e2252bc60e99ef.tar.gz chromium_src-d4a75e37a73ddae7c855827838e2252bc60e99ef.tar.bz2 |
Merge 282577 "kiosk: Retry failed app data fetch."
> kiosk: Retry failed app data fetch.
>
> - Add KioskAppManager::RetryFailedAppDataFetch that starts fetch for failed
> app data fetch (status == STATUS_ERROR);
> - RetryFailedAppDataFetch when kiosk app is added/removed (include policy refrech);
> - RetryFailedAppDataFetch on login screen when portal detection is passed;
> - Add max auto retry times for underlying URLFetcher's 5xx retry and
> ERR_NETWORK_CHANGED retry in WebstoreDataFetcher;
> - KioskAppData sets max retry times to 3 for its webstore data fetch;
>
> BUG=392670
>
> Review URL: https://codereview.chromium.org/386633003
TBR=xiyuan@chromium.org
Review URL: https://codereview.chromium.org/469853002
git-svn-id: svn://svn.chromium.org/chrome/branches/2062/src@289341 0039d316-1c4b-4281-b951-d872f2087c98
8 files changed, 53 insertions, 8 deletions
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_data.cc b/chrome/browser/chromeos/app_mode/kiosk_app_data.cc index 955a91d..51c9571 100644 --- a/chrome/browser/chromeos/app_mode/kiosk_app_data.cc +++ b/chrome/browser/chromeos/app_mode/kiosk_app_data.cc @@ -336,7 +336,7 @@ void KioskAppData::SetStatus(Status status) { case STATUS_ERROR: delegate_->OnKioskAppDataLoadFailure(app_id_); break; - }; + } } net::URLRequestContextGetter* KioskAppData::GetRequestContextGetter() { @@ -442,6 +442,7 @@ void KioskAppData::StartFetch() { GetRequestContextGetter(), GURL(), app_id_)); + webstore_fetcher_->set_max_auto_retries(3); webstore_fetcher_->Start(); } diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc b/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc index 3dff8f1..50df660 100644 --- a/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc +++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc @@ -356,6 +356,13 @@ void KioskAppManager::UpdateAppDataFromProfile( app_data->LoadFromInstalledApp(profile, app); } +void KioskAppManager::RetryFailedAppDataFetch() { + for (size_t i = 0; i < apps_.size(); ++i) { + if (apps_[i]->status() == KioskAppData::STATUS_ERROR) + apps_[i]->Load(); + } +} + void KioskAppManager::AddObserver(KioskAppManagerObserver* observer) { observers_.AddObserver(observer); } @@ -469,6 +476,8 @@ void KioskAppManager::UpdateAppData() { prefs->Set(apps_[i]->app_id(), new base::DictionaryValue); external_cache_->UpdateExtensionsList(prefs.Pass()); + RetryFailedAppDataFetch(); + FOR_EACH_OBSERVER(KioskAppManagerObserver, observers_, OnKioskAppsSettingsChanged()); } diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager.h b/chrome/browser/chromeos/app_mode/kiosk_app_manager.h index 7a9fe67..a26939e 100644 --- a/chrome/browser/chromeos/app_mode/kiosk_app_manager.h +++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager.h @@ -150,6 +150,8 @@ class KioskAppManager : public KioskAppDataDelegate, Profile* profile, const extensions::Extension* app); + void RetryFailedAppDataFetch(); + void AddObserver(KioskAppManagerObserver* observer); void RemoveObserver(KioskAppManagerObserver* observer); diff --git a/chrome/browser/extensions/webstore_data_fetcher.cc b/chrome/browser/extensions/webstore_data_fetcher.cc index 89d523b..d71fe01 100644 --- a/chrome/browser/extensions/webstore_data_fetcher.cc +++ b/chrome/browser/extensions/webstore_data_fetcher.cc @@ -29,7 +29,8 @@ WebstoreDataFetcher::WebstoreDataFetcher( : delegate_(delegate), request_context_(request_context), referrer_url_(referrer_url), - id_(webstore_item_id) { + id_(webstore_item_id), + max_auto_retries_(0) { } WebstoreDataFetcher::~WebstoreDataFetcher() {} @@ -43,6 +44,11 @@ void WebstoreDataFetcher::Start() { webstore_data_url_fetcher_->SetReferrer(referrer_url_.spec()); webstore_data_url_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES | net::LOAD_DISABLE_CACHE); + if (max_auto_retries_ > 0) { + webstore_data_url_fetcher_->SetMaxRetriesOn5xx(max_auto_retries_); + webstore_data_url_fetcher_->SetAutomaticallyRetryOnNetworkChanges( + max_auto_retries_); + } webstore_data_url_fetcher_->Start(); } diff --git a/chrome/browser/extensions/webstore_data_fetcher.h b/chrome/browser/extensions/webstore_data_fetcher.h index fb8aafd..b11ac97 100644 --- a/chrome/browser/extensions/webstore_data_fetcher.h +++ b/chrome/browser/extensions/webstore_data_fetcher.h @@ -38,6 +38,10 @@ class WebstoreDataFetcher : public base::SupportsWeakPtr<WebstoreDataFetcher>, void Start(); + void set_max_auto_retries(int max_retries) { + max_auto_retries_ = max_retries; + } + private: void OnJsonParseSuccess(scoped_ptr<base::Value> parsed_json); void OnJsonParseFailure(const std::string& error); @@ -53,6 +57,10 @@ class WebstoreDataFetcher : public base::SupportsWeakPtr<WebstoreDataFetcher>, // For fetching webstore JSON data. scoped_ptr<net::URLFetcher> webstore_data_url_fetcher_; + // Maximum auto retry times on server 5xx error or ERR_NETWORK_CHANGED. + // Default is 0 which means to use the URLFetcher default behavior. + int max_auto_retries_; + DISALLOW_COPY_AND_ASSIGN(WebstoreDataFetcher); }; diff --git a/chrome/browser/ui/webui/chromeos/login/kiosk_app_menu_handler.cc b/chrome/browser/ui/webui/chromeos/login/kiosk_app_menu_handler.cc index 50295aa..4ab1f18 100644 --- a/chrome/browser/ui/webui/chromeos/login/kiosk_app_menu_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/kiosk_app_menu_handler.cc @@ -37,14 +37,18 @@ const int kMaxAppIconSize = 160; } // namespace -KioskAppMenuHandler::KioskAppMenuHandler() +KioskAppMenuHandler::KioskAppMenuHandler( + const scoped_refptr<NetworkStateInformer>& network_state_informer) : weak_ptr_factory_(this), - is_webui_initialized_(false) { + is_webui_initialized_(false), + network_state_informer_(network_state_informer) { KioskAppManager::Get()->AddObserver(this); + network_state_informer_->AddObserver(this); } KioskAppMenuHandler::~KioskAppMenuHandler() { KioskAppManager::Get()->RemoveObserver(this); + network_state_informer_->RemoveObserver(this); } void KioskAppMenuHandler::GetLocalizedStrings( @@ -133,6 +137,7 @@ void KioskAppMenuHandler::HandleInitializeKioskApps( const base::ListValue* args) { is_webui_initialized_ = true; SendKioskApps(); + UpdateState(ErrorScreenActor::ERROR_REASON_UPDATE); } void KioskAppMenuHandler::HandleKioskAppsLoaded( @@ -165,4 +170,9 @@ void KioskAppMenuHandler::OnKioskAppDataChanged(const std::string& app_id) { SendKioskApps(); } +void KioskAppMenuHandler::UpdateState(ErrorScreenActor::ErrorReason reason) { + if (network_state_informer_->state() == NetworkStateInformer::ONLINE) + KioskAppManager::Get()->RetryFailedAppDataFetch(); +} + } // namespace chromeos diff --git a/chrome/browser/ui/webui/chromeos/login/kiosk_app_menu_handler.h b/chrome/browser/ui/webui/chromeos/login/kiosk_app_menu_handler.h index 2cd58ac..b1e887e 100644 --- a/chrome/browser/ui/webui/chromeos/login/kiosk_app_menu_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/kiosk_app_menu_handler.h @@ -12,6 +12,7 @@ #include "base/memory/weak_ptr.h" #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" #include "chrome/browser/chromeos/app_mode/kiosk_app_manager_observer.h" +#include "chrome/browser/ui/webui/chromeos/login/network_state_informer.h" #include "content/public/browser/web_ui_message_handler.h" namespace chromeos { @@ -19,10 +20,13 @@ namespace chromeos { // KioskAppMenuHandler supplies kiosk apps data to apps menu on sign-in // screen when app mode is enabled and handles "launchKioskApp" request // from the apps menu. -class KioskAppMenuHandler : public content::WebUIMessageHandler, - public KioskAppManagerObserver { +class KioskAppMenuHandler + : public content::WebUIMessageHandler, + public KioskAppManagerObserver, + public NetworkStateInformer::NetworkStateInformerObserver { public: - KioskAppMenuHandler(); + explicit KioskAppMenuHandler( + const scoped_refptr<NetworkStateInformer>& network_state_informer); virtual ~KioskAppMenuHandler(); void GetLocalizedStrings(base::DictionaryValue* localized_strings); @@ -46,11 +50,16 @@ class KioskAppMenuHandler : public content::WebUIMessageHandler, virtual void OnKioskAppsSettingsChanged() OVERRIDE; virtual void OnKioskAppDataChanged(const std::string& app_id) OVERRIDE; + // NetworkStateInformer::NetworkStateInformerObserver overrides: + virtual void UpdateState(ErrorScreenActor::ErrorReason reason) OVERRIDE; + base::WeakPtrFactory<KioskAppMenuHandler> weak_ptr_factory_; // True when WebUI is initialized. Otherwise don't allow calling JS functions. bool is_webui_initialized_; + scoped_refptr<NetworkStateInformer> network_state_informer_; + DISALLOW_COPY_AND_ASSIGN(KioskAppMenuHandler); }; diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc index 67dfa9a..8d55960 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc @@ -278,7 +278,7 @@ OobeUI::OobeUI(content::WebUI* web_ui, const GURL& url) app_launch_splash_screen_actor_ = app_launch_splash_screen_handler; // Initialize KioskAppMenuHandler. Note that it is NOT a screen handler. - kiosk_app_menu_handler_ = new KioskAppMenuHandler; + kiosk_app_menu_handler_ = new KioskAppMenuHandler(network_state_informer_); web_ui->AddMessageHandler(kiosk_app_menu_handler_); base::DictionaryValue localized_strings; |