// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/offline/offline_load_page.h"
#include "content/browser/browser_thread.h"
#include "content/browser/renderer_host/test_render_view_host.h"
#include "content/browser/tab_contents/navigation_entry.h"
#include "content/browser/tab_contents/test_tab_contents.h"
#include "content/common/view_messages.h"
static const char* kURL1 = "http://www.google.com/";
static const char* kURL2 = "http://www.gmail.com/";
namespace {
// An OfflineLoadPage class that does not create windows.
class TestOfflineLoadPage : public chromeos::OfflineLoadPage {
public:
TestOfflineLoadPage(TabContents* tab_contents,
const GURL& url,
Delegate* delegate)
: chromeos::OfflineLoadPage(tab_contents, url, delegate) {
EnableTest();
}
// Overriden from InterstitialPage. Don't create a view.
virtual TabContentsView* CreateTabContentsView() {
return NULL;
}
};
} // namespace
namespace chromeos {
class OfflineLoadPageTest : public RenderViewHostTestHarness,
public OfflineLoadPage::Delegate {
public:
// The decision the user made.
enum UserResponse {
PENDING,
OK,
CANCEL
};
OfflineLoadPageTest()
: ui_thread_(BrowserThread::UI, MessageLoop::current()),
io_thread_(BrowserThread::IO, MessageLoop::current()) {
}
virtual void SetUp() {
RenderViewHostTestHarness::SetUp();
user_response_ = PENDING;
}
// OfflineLoadPage::Delegate implementation.
virtual void OnBlockingPageComplete(bool proceed) {
if (proceed)
user_response_ = OK;
else
user_response_ = CANCEL;
}
void Navigate(const char* url, int page_id) {
ViewHostMsg_FrameNavigate_Params params;
InitNavigateParams(¶ms, page_id, GURL(url), PageTransition::TYPED);
contents()->TestDidNavigate(contents()->render_view_host(), params);
}
void ShowInterstitial(const char* url) {
(new TestOfflineLoadPage(contents(), GURL(url), this))->Show();
}
// Returns the OfflineLoadPage currently showing or NULL if none is
// showing.
InterstitialPage* GetOfflineLoadPage() {
return InterstitialPage::GetInterstitialPage(contents());
}
UserResponse user_response() const { return user_response_; }
private:
UserResponse user_response_;
BrowserThread ui_thread_;
BrowserThread io_thread_;
};
TEST_F(OfflineLoadPageTest, OfflinePaeProceed) {
// Start a load.
Navigate(kURL1, 1);
// Load next page.
controller().LoadURL(GURL(kURL2), GURL(), PageTransition::TYPED);
// Simulate the load causing an offline browsing interstitial page
// to be shown.
ShowInterstitial(kURL2);
InterstitialPage* interstitial = GetOfflineLoadPage();
ASSERT_TRUE(interstitial);
MessageLoop::current()->RunAllPending();
// Simulate the user clicking "proceed".
interstitial->Proceed();
MessageLoop::current()->RunAllPending();
EXPECT_EQ(OK, user_response());
// The URL remains to be URL2.
EXPECT_EQ(kURL2, contents()->GetURL().spec());
// Commit navigation and the interstitial page is gone.
Navigate(kURL2, 2);
EXPECT_FALSE(GetOfflineLoadPage());
}
// Tests showing an offline page and not proceeding.
TEST_F(OfflineLoadPageTest, OfflinePageDontProceed) {
// Start a load.
Navigate(kURL1, 1);
controller().LoadURL(GURL(kURL2), GURL(), PageTransition::TYPED);
// Simulate the load causing an offline interstitial page to be shown.
ShowInterstitial(kURL2);
InterstitialPage* interstitial = GetOfflineLoadPage();
ASSERT_TRUE(interstitial);
MessageLoop::current()->RunAllPending();
// Simulate the user clicking "don't proceed".
interstitial->DontProceed();
// The interstitial should be gone.
EXPECT_EQ(CANCEL, user_response());
EXPECT_FALSE(GetOfflineLoadPage());
// We did not proceed, the pending entry should be gone.
EXPECT_FALSE(controller().pending_entry());
// the URL is set back to kURL1.
EXPECT_EQ(kURL1, contents()->GetURL().spec());
}
} // namespace chromeos