summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornkostylev@google.com <nkostylev@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-02 15:00:00 +0000
committernkostylev@google.com <nkostylev@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-02 15:00:00 +0000
commit809311cb9e8e70dfe137c5d8bdb084a56587bbdd (patch)
treef3efeba4ce22efe20925536ac82008ab58b7cbe5
parent14aab33b970082e517fdd9654de0e9d32392cc54 (diff)
downloadchromium_src-809311cb9e8e70dfe137c5d8bdb084a56587bbdd.zip
chromium_src-809311cb9e8e70dfe137c5d8bdb084a56587bbdd.tar.gz
chromium_src-809311cb9e8e70dfe137c5d8bdb084a56587bbdd.tar.bz2
Add network timeout when loading account creation page.
BUG= http://crosbug.com/3289 TEST=Connect to the network that requires web base login and open "Create account". It should timeout after 10 secs or earlier. Review URL: http://codereview.chromium.org/2465001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@48721 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/chromeos/login/account_screen.cc17
-rw-r--r--chrome/browser/chromeos/login/account_screen.h4
-rw-r--r--chrome/browser/chromeos/login/web_page_screen.cc35
-rw-r--r--chrome/browser/chromeos/login/web_page_screen.h19
4 files changed, 63 insertions, 12 deletions
diff --git a/chrome/browser/chromeos/login/account_screen.cc b/chrome/browser/chromeos/login/account_screen.cc
index 468c884..c8145a36 100644
--- a/chrome/browser/chromeos/login/account_screen.cc
+++ b/chrome/browser/chromeos/login/account_screen.cc
@@ -89,6 +89,7 @@ void AccountScreen::CreateView() {
}
void AccountScreen::Refresh() {
+ StartTimeoutTimer();
GURL url(*new_account_page_url_);
Profile* profile = ProfileManager::GetDefaultProfile();
view()->InitDOM(profile,
@@ -107,11 +108,11 @@ void AccountScreen::LoadingStateChanged(TabContents* source) {
std::string url = source->GetURL().spec();
if (url == kCreateAccountDoneUrl) {
source->Stop();
- delegate()->GetObserver(this)->OnExit(ScreenObserver::ACCOUNT_CREATED);
+ CloseScreen(ScreenObserver::ACCOUNT_CREATED);
} else if (url == kCreateAccountBackUrl) {
- delegate()->GetObserver(this)->OnExit(ScreenObserver::ACCOUNT_CREATE_BACK);
+ CloseScreen(ScreenObserver::ACCOUNT_CREATE_BACK);
} else if (check_for_https_ && !source->GetURL().SchemeIsSecure()) {
- delegate()->GetObserver(this)->OnExit(ScreenObserver::CONNECTION_FAILED);
+ CloseScreen(ScreenObserver::CONNECTION_FAILED);
}
}
@@ -128,11 +129,12 @@ void AccountScreen::NavigationStateChanged(const TabContents* source,
///////////////////////////////////////////////////////////////////////////////
// AccountScreen, WebPageDelegate implementation:
void AccountScreen::OnPageLoaded() {
+ StopTimeoutTimer();
view()->ShowPageContent();
}
void AccountScreen::OnPageLoadFailed(const std::string& url) {
- delegate()->GetObserver(this)->OnExit(ScreenObserver::CONNECTION_FAILED);
+ CloseScreen(ScreenObserver::CONNECTION_FAILED);
}
///////////////////////////////////////////////////////////////////////////////
@@ -142,4 +144,11 @@ void AccountScreen::OnUserCreated(const std::string& username,
delegate()->GetObserver(this)->OnSetUserNamePassword(username, password);
}
+///////////////////////////////////////////////////////////////////////////////
+// AccountScreen, private:
+void AccountScreen::CloseScreen(ScreenObserver::ExitCodes code) {
+ StopTimeoutTimer();
+ delegate()->GetObserver(this)->OnExit(code);
+}
+
} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/account_screen.h b/chrome/browser/chromeos/login/account_screen.h
index cbc2e9d..ec9173c 100644
--- a/chrome/browser/chromeos/login/account_screen.h
+++ b/chrome/browser/chromeos/login/account_screen.h
@@ -9,6 +9,7 @@
#include "base/scoped_ptr.h"
#include "chrome/browser/chromeos/login/account_creation_view.h"
+#include "chrome/browser/chromeos/login/screen_observer.h"
#include "chrome/browser/chromeos/login/view_screen.h"
#include "chrome/browser/chromeos/login/web_page_screen.h"
#include "chrome/browser/chromeos/login/web_page_view.h"
@@ -52,6 +53,9 @@ class AccountScreen : public ViewScreen<AccountCreationView>,
unsigned changed_flags);
virtual void LoadingStateChanged(TabContents* source);
+ // WebPageScreen implementation:
+ virtual void CloseScreen(ScreenObserver::ExitCodes code);
+
// Url of account creation page. Overriden by tests.
static scoped_ptr<GURL> new_account_page_url_;
// Indicates if we should check for HTTPS scheme. Overriden by tests.
diff --git a/chrome/browser/chromeos/login/web_page_screen.cc b/chrome/browser/chromeos/login/web_page_screen.cc
index ccc1784..5d0bd90 100644
--- a/chrome/browser/chromeos/login/web_page_screen.cc
+++ b/chrome/browser/chromeos/login/web_page_screen.cc
@@ -4,16 +4,18 @@
#include "chrome/browser/chromeos/login/web_page_screen.h"
+#include "base/time.h"
+
+using base::TimeDelta;
+
namespace chromeos {
-///////////////////////////////////////////////////////////////////////////////
-// WebPageScreen, public:
+namespace {
-WebPageScreen::WebPageScreen() {
-}
+// Time in seconds after page load is considered timed out.
+const int kNetworkTimeoutSec = 10;
-WebPageScreen::~WebPageScreen() {
-}
+} // namespace
///////////////////////////////////////////////////////////////////////////////
// WebPageScreen, TabContentsDelegate implementation:
@@ -23,4 +25,25 @@ bool WebPageScreen::HandleContextMenu(const ContextMenuParams& params) {
return true;
}
+///////////////////////////////////////////////////////////////////////////////
+// WebPageScreen, protected:
+
+void WebPageScreen::OnNetworkTimeout() {
+ // TODO(nkostylev): Add better detection for limited connectivity.
+ // http://crosbug.com/3690
+ CloseScreen(ScreenObserver::CONNECTION_FAILED);
+}
+
+void WebPageScreen::StartTimeoutTimer() {
+ StopTimeoutTimer();
+ timeout_timer_.Start(TimeDelta::FromSeconds(kNetworkTimeoutSec),
+ this,
+ &WebPageScreen::OnNetworkTimeout);
+}
+
+void WebPageScreen::StopTimeoutTimer() {
+ if (timeout_timer_.IsRunning())
+ timeout_timer_.Stop();
+}
+
} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/web_page_screen.h b/chrome/browser/chromeos/login/web_page_screen.h
index 4269900..5c9bc17 100644
--- a/chrome/browser/chromeos/login/web_page_screen.h
+++ b/chrome/browser/chromeos/login/web_page_screen.h
@@ -6,6 +6,8 @@
#define CHROME_BROWSER_CHROMEOS_LOGIN_WEB_PAGE_SCREEN_H_
#include "base/scoped_ptr.h"
+#include "base/timer.h"
+#include "chrome/browser/chromeos/login/screen_observer.h"
#include "chrome/browser/tab_contents/tab_contents_delegate.h"
class GURL;
@@ -15,8 +17,11 @@ namespace chromeos {
// Base class for wizard screen that holds web page.
class WebPageScreen : public TabContentsDelegate {
public:
- explicit WebPageScreen();
- virtual ~WebPageScreen();
+ explicit WebPageScreen() {}
+ virtual ~WebPageScreen() {}
+
+ // Exits from the screen with the specified exit code.
+ virtual void CloseScreen(ScreenObserver::ExitCodes code) = 0;
protected:
// TabContentsDelegate implementation:
@@ -42,7 +47,17 @@ class WebPageScreen : public TabContentsDelegate {
virtual void ToolbarSizeChanged(TabContents* source, bool is_animating) {}
virtual bool HandleContextMenu(const ContextMenuParams& params);
+ // Called by |timeout_timer_|. Stops page fetching and closes screen.
+ void OnNetworkTimeout();
+
+ // Start/stop timeout timer.
+ void StartTimeoutTimer();
+ void StopTimeoutTimer();
+
private:
+ // Timer used for network response timeout.
+ base::OneShotTimer<WebPageScreen> timeout_timer_;
+
DISALLOW_COPY_AND_ASSIGN(WebPageScreen);
};