summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-08-13 19:02:24 +0000
committerxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-08-13 19:02:24 +0000
commitd4a75e37a73ddae7c855827838e2252bc60e99ef (patch)
tree369ec3da1c781184e97700984a1235130399d803
parent624429c3f6490b11ef84911c96aaafc6f10a1dce (diff)
downloadchromium_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
-rw-r--r--chrome/browser/chromeos/app_mode/kiosk_app_data.cc3
-rw-r--r--chrome/browser/chromeos/app_mode/kiosk_app_manager.cc9
-rw-r--r--chrome/browser/chromeos/app_mode/kiosk_app_manager.h2
-rw-r--r--chrome/browser/extensions/webstore_data_fetcher.cc8
-rw-r--r--chrome/browser/extensions/webstore_data_fetcher.h8
-rw-r--r--chrome/browser/ui/webui/chromeos/login/kiosk_app_menu_handler.cc14
-rw-r--r--chrome/browser/ui/webui/chromeos/login/kiosk_app_menu_handler.h15
-rw-r--r--chrome/browser/ui/webui/chromeos/login/oobe_ui.cc2
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;