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) {
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();
}
......
......@@ -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());
}
......
......@@ -150,6 +150,8 @@ class KioskAppManager : public KioskAppDataDelegate,
Profile* profile,
const extensions::Extension* app);
void RetryFailedAppDataFetch();
void AddObserver(KioskAppManagerObserver* observer);
void RemoveObserver(KioskAppManagerObserver* observer);
......
......@@ -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();
}
......
......@@ -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);
};
......
......@@ -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
......@@ -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);
};
......
......@@ -285,7 +285,7 @@ OobeUI::OobeUI(content::WebUI* web_ui, const GURL& url)
}
// 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;
......
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