Commit 270dccca authored by xiyuan@chromium.org's avatar xiyuan@chromium.org

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@282577 0039d316-1c4b-4281-b951-d872f2087c98
parent 4ff6c31e
...@@ -336,7 +336,7 @@ void KioskAppData::SetStatus(Status status) { ...@@ -336,7 +336,7 @@ void KioskAppData::SetStatus(Status status) {
case STATUS_ERROR: case STATUS_ERROR:
delegate_->OnKioskAppDataLoadFailure(app_id_); delegate_->OnKioskAppDataLoadFailure(app_id_);
break; break;
}; }
} }
net::URLRequestContextGetter* KioskAppData::GetRequestContextGetter() { net::URLRequestContextGetter* KioskAppData::GetRequestContextGetter() {
...@@ -442,6 +442,7 @@ void KioskAppData::StartFetch() { ...@@ -442,6 +442,7 @@ void KioskAppData::StartFetch() {
GetRequestContextGetter(), GetRequestContextGetter(),
GURL(), GURL(),
app_id_)); app_id_));
webstore_fetcher_->set_max_auto_retries(3);
webstore_fetcher_->Start(); webstore_fetcher_->Start();
} }
......
...@@ -356,6 +356,13 @@ void KioskAppManager::UpdateAppDataFromProfile( ...@@ -356,6 +356,13 @@ void KioskAppManager::UpdateAppDataFromProfile(
app_data->LoadFromInstalledApp(profile, app); 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) { void KioskAppManager::AddObserver(KioskAppManagerObserver* observer) {
observers_.AddObserver(observer); observers_.AddObserver(observer);
} }
...@@ -469,6 +476,8 @@ void KioskAppManager::UpdateAppData() { ...@@ -469,6 +476,8 @@ void KioskAppManager::UpdateAppData() {
prefs->Set(apps_[i]->app_id(), new base::DictionaryValue); prefs->Set(apps_[i]->app_id(), new base::DictionaryValue);
external_cache_->UpdateExtensionsList(prefs.Pass()); external_cache_->UpdateExtensionsList(prefs.Pass());
RetryFailedAppDataFetch();
FOR_EACH_OBSERVER(KioskAppManagerObserver, observers_, FOR_EACH_OBSERVER(KioskAppManagerObserver, observers_,
OnKioskAppsSettingsChanged()); OnKioskAppsSettingsChanged());
} }
......
...@@ -150,6 +150,8 @@ class KioskAppManager : public KioskAppDataDelegate, ...@@ -150,6 +150,8 @@ class KioskAppManager : public KioskAppDataDelegate,
Profile* profile, Profile* profile,
const extensions::Extension* app); const extensions::Extension* app);
void RetryFailedAppDataFetch();
void AddObserver(KioskAppManagerObserver* observer); void AddObserver(KioskAppManagerObserver* observer);
void RemoveObserver(KioskAppManagerObserver* observer); void RemoveObserver(KioskAppManagerObserver* observer);
......
...@@ -29,7 +29,8 @@ WebstoreDataFetcher::WebstoreDataFetcher( ...@@ -29,7 +29,8 @@ WebstoreDataFetcher::WebstoreDataFetcher(
: delegate_(delegate), : delegate_(delegate),
request_context_(request_context), request_context_(request_context),
referrer_url_(referrer_url), referrer_url_(referrer_url),
id_(webstore_item_id) { id_(webstore_item_id),
max_auto_retries_(0) {
} }
WebstoreDataFetcher::~WebstoreDataFetcher() {} WebstoreDataFetcher::~WebstoreDataFetcher() {}
...@@ -43,6 +44,11 @@ void WebstoreDataFetcher::Start() { ...@@ -43,6 +44,11 @@ void WebstoreDataFetcher::Start() {
webstore_data_url_fetcher_->SetReferrer(referrer_url_.spec()); webstore_data_url_fetcher_->SetReferrer(referrer_url_.spec());
webstore_data_url_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES | webstore_data_url_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES |
net::LOAD_DISABLE_CACHE); 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(); webstore_data_url_fetcher_->Start();
} }
......
...@@ -38,6 +38,10 @@ class WebstoreDataFetcher : public base::SupportsWeakPtr<WebstoreDataFetcher>, ...@@ -38,6 +38,10 @@ class WebstoreDataFetcher : public base::SupportsWeakPtr<WebstoreDataFetcher>,
void Start(); void Start();
void set_max_auto_retries(int max_retries) {
max_auto_retries_ = max_retries;
}
private: private:
void OnJsonParseSuccess(scoped_ptr<base::Value> parsed_json); void OnJsonParseSuccess(scoped_ptr<base::Value> parsed_json);
void OnJsonParseFailure(const std::string& error); void OnJsonParseFailure(const std::string& error);
...@@ -53,6 +57,10 @@ class WebstoreDataFetcher : public base::SupportsWeakPtr<WebstoreDataFetcher>, ...@@ -53,6 +57,10 @@ class WebstoreDataFetcher : public base::SupportsWeakPtr<WebstoreDataFetcher>,
// For fetching webstore JSON data. // For fetching webstore JSON data.
scoped_ptr<net::URLFetcher> webstore_data_url_fetcher_; 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); DISALLOW_COPY_AND_ASSIGN(WebstoreDataFetcher);
}; };
......
...@@ -37,14 +37,18 @@ const int kMaxAppIconSize = 160; ...@@ -37,14 +37,18 @@ const int kMaxAppIconSize = 160;
} // namespace } // namespace
KioskAppMenuHandler::KioskAppMenuHandler() KioskAppMenuHandler::KioskAppMenuHandler(
const scoped_refptr<NetworkStateInformer>& network_state_informer)
: weak_ptr_factory_(this), : weak_ptr_factory_(this),
is_webui_initialized_(false) { is_webui_initialized_(false),
network_state_informer_(network_state_informer) {
KioskAppManager::Get()->AddObserver(this); KioskAppManager::Get()->AddObserver(this);
network_state_informer_->AddObserver(this);
} }
KioskAppMenuHandler::~KioskAppMenuHandler() { KioskAppMenuHandler::~KioskAppMenuHandler() {
KioskAppManager::Get()->RemoveObserver(this); KioskAppManager::Get()->RemoveObserver(this);
network_state_informer_->RemoveObserver(this);
} }
void KioskAppMenuHandler::GetLocalizedStrings( void KioskAppMenuHandler::GetLocalizedStrings(
...@@ -133,6 +137,7 @@ void KioskAppMenuHandler::HandleInitializeKioskApps( ...@@ -133,6 +137,7 @@ void KioskAppMenuHandler::HandleInitializeKioskApps(
const base::ListValue* args) { const base::ListValue* args) {
is_webui_initialized_ = true; is_webui_initialized_ = true;
SendKioskApps(); SendKioskApps();
UpdateState(ErrorScreenActor::ERROR_REASON_UPDATE);
} }
void KioskAppMenuHandler::HandleKioskAppsLoaded( void KioskAppMenuHandler::HandleKioskAppsLoaded(
...@@ -165,4 +170,9 @@ void KioskAppMenuHandler::OnKioskAppDataChanged(const std::string& app_id) { ...@@ -165,4 +170,9 @@ void KioskAppMenuHandler::OnKioskAppDataChanged(const std::string& app_id) {
SendKioskApps(); SendKioskApps();
} }
void KioskAppMenuHandler::UpdateState(ErrorScreenActor::ErrorReason reason) {
if (network_state_informer_->state() == NetworkStateInformer::ONLINE)
KioskAppManager::Get()->RetryFailedAppDataFetch();
}
} // namespace chromeos } // namespace chromeos
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "base/memory/weak_ptr.h" #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.h"
#include "chrome/browser/chromeos/app_mode/kiosk_app_manager_observer.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" #include "content/public/browser/web_ui_message_handler.h"
namespace chromeos { namespace chromeos {
...@@ -19,10 +20,13 @@ namespace chromeos { ...@@ -19,10 +20,13 @@ namespace chromeos {
// KioskAppMenuHandler supplies kiosk apps data to apps menu on sign-in // KioskAppMenuHandler supplies kiosk apps data to apps menu on sign-in
// screen when app mode is enabled and handles "launchKioskApp" request // screen when app mode is enabled and handles "launchKioskApp" request
// from the apps menu. // from the apps menu.
class KioskAppMenuHandler : public content::WebUIMessageHandler, class KioskAppMenuHandler
public KioskAppManagerObserver { : public content::WebUIMessageHandler,
public KioskAppManagerObserver,
public NetworkStateInformer::NetworkStateInformerObserver {
public: public:
KioskAppMenuHandler(); explicit KioskAppMenuHandler(
const scoped_refptr<NetworkStateInformer>& network_state_informer);
virtual ~KioskAppMenuHandler(); virtual ~KioskAppMenuHandler();
void GetLocalizedStrings(base::DictionaryValue* localized_strings); void GetLocalizedStrings(base::DictionaryValue* localized_strings);
...@@ -46,11 +50,16 @@ class KioskAppMenuHandler : public content::WebUIMessageHandler, ...@@ -46,11 +50,16 @@ class KioskAppMenuHandler : public content::WebUIMessageHandler,
virtual void OnKioskAppsSettingsChanged() OVERRIDE; virtual void OnKioskAppsSettingsChanged() OVERRIDE;
virtual void OnKioskAppDataChanged(const std::string& app_id) 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_; base::WeakPtrFactory<KioskAppMenuHandler> weak_ptr_factory_;
// True when WebUI is initialized. Otherwise don't allow calling JS functions. // True when WebUI is initialized. Otherwise don't allow calling JS functions.
bool is_webui_initialized_; bool is_webui_initialized_;
scoped_refptr<NetworkStateInformer> network_state_informer_;
DISALLOW_COPY_AND_ASSIGN(KioskAppMenuHandler); DISALLOW_COPY_AND_ASSIGN(KioskAppMenuHandler);
}; };
......
...@@ -285,7 +285,7 @@ OobeUI::OobeUI(content::WebUI* web_ui, const GURL& url) ...@@ -285,7 +285,7 @@ OobeUI::OobeUI(content::WebUI* web_ui, const GURL& url)
} }
// Initialize KioskAppMenuHandler. Note that it is NOT a 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_); web_ui->AddMessageHandler(kiosk_app_menu_handler_);
base::DictionaryValue localized_strings; base::DictionaryValue localized_strings;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment