diff options
author | nkostylev@google.com <nkostylev@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-02 15:00:00 +0000 |
---|---|---|
committer | nkostylev@google.com <nkostylev@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-02 15:00:00 +0000 |
commit | 809311cb9e8e70dfe137c5d8bdb084a56587bbdd (patch) | |
tree | f3efeba4ce22efe20925536ac82008ab58b7cbe5 | |
parent | 14aab33b970082e517fdd9654de0e9d32392cc54 (diff) | |
download | chromium_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.cc | 17 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/account_screen.h | 4 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/web_page_screen.cc | 35 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/web_page_screen.h | 19 |
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); }; |