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