15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/offline/offline_load_page.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/chrome_render_view_host_test_harness.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/web_contents_tester.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::InterstitialPage;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContentsTester;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kURL1 = "http://www.google.com/";
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char* kURL2 = "http://www.gmail.com/";
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OfflineLoadPageTest;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An OfflineLoadPage class that does not create windows.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestOfflineLoadPage :  public chromeos::OfflineLoadPage {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestOfflineLoadPage(WebContents* web_contents,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      const GURL& url,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      OfflineLoadPageTest* test_page)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : chromeos::OfflineLoadPage(web_contents, url, CompletionCallback()),
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_page_(test_page) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_->DontCreateViewForTesting();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // chromeos::OfflineLoadPage override.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void NotifyBlockingPageComplete(bool proceed) OVERRIDE;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OfflineLoadPageTest* test_page_;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestOfflineLoadPage);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OfflineLoadPageTest : public ChromeRenderViewHostTestHarness {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The decision the user made.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum UserResponse {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PENDING,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OK,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CANCEL
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeRenderViewHostTestHarness::SetUp();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user_response_ = PENDING;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnBlockingPageComplete(bool proceed) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (proceed)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      user_response_ = OK;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      user_response_ = CANCEL;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Navigate(const char* url, int page_id) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsTester::For(web_contents())->TestDidNavigate(
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        web_contents()->GetMainFrame(), page_id, GURL(url),
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ui::PAGE_TRANSITION_TYPED);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowInterstitial(const char* url) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (new TestOfflineLoadPage(web_contents(), GURL(url), this))->Show();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the OfflineLoadPage currently showing or NULL if none is
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // showing.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterstitialPage* GetOfflineLoadPage() {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return InterstitialPage::GetInterstitialPage(web_contents());
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserResponse user_response() const { return user_response_; }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  friend class TestOfflineLoadPage;
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UserResponse user_response_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestOfflineLoadPage::NotifyBlockingPageComplete(bool proceed) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_page_->OnBlockingPageComplete(proceed);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(OfflineLoadPageTest, OfflinePageProceed) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a load.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Navigate(kURL1, 1);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load next page.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller().LoadURL(GURL(kURL2), content::Referrer(),
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       ui::PAGE_TRANSITION_TYPED, std::string());
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the load causing an offline browsing interstitial page
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to be shown.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowInterstitial(kURL2);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterstitialPage* interstitial = GetOfflineLoadPage();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(interstitial);
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user clicking "proceed".
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interstitial->Proceed();
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, user_response());
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The URL remains to be URL2.
113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(kURL2, web_contents()->GetVisibleURL().spec());
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Commit navigation and the interstitial page is gone.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Navigate(kURL2, 2);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetOfflineLoadPage());
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests showing an offline page and not proceeding.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(OfflineLoadPageTest, OfflinePageDontProceed) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start a load.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Navigate(kURL1, 1);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller().LoadURL(GURL(kURL2), content::Referrer(),
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       ui::PAGE_TRANSITION_TYPED, std::string());
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the load causing an offline interstitial page to be shown.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowInterstitial(kURL2);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterstitialPage* interstitial = GetOfflineLoadPage();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(interstitial);
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user clicking "don't proceed".
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interstitial->DontProceed();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The interstitial should be gone.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CANCEL, user_response());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(GetOfflineLoadPage());
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We did not proceed, the pending entry should be gone.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(controller().GetPendingEntry());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the URL is set back to kURL1.
142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(kURL1, web_contents()->GetLastCommittedURL().spec());
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
146