1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/history/history_service_factory.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_constants.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_interstitial.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_navigation_observer.h" 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_service.h" 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_service_factory.h" 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_settings_service.h" 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_settings_service_factory.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/tabs/tab_strip_model_observer.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/infobars/core/confirm_infobar_delegate.h" 290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/infobars/core/infobar.h" 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/interstitial_page.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_controller.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_entry.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/test/browser_test_utils.h" 385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "testing/gmock/include/gmock/gmock.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::InterstitialPage; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::NavigationController; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::NavigationEntry; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::WebContents; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests the filter mode in which all sites are blocked by default. 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class SupervisedUserBlockModeTest : public InProcessBrowserTest { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Indicates whether the interstitial should proceed or not. 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum InterstitialAction { 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) INTERSTITIAL_PROCEED, 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) INTERSTITIAL_DONTPROCEED, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserBlockModeTest() : supervised_user_service_(NULL) {} 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~SupervisedUserBlockModeTest() {} 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CheckShownPageIsInterstitial(WebContents* tab) { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckShownPage(tab, content::PAGE_TYPE_INTERSTITIAL); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CheckShownPageIsNotInterstitial(WebContents* tab) { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckShownPage(tab, content::PAGE_TYPE_NORMAL); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Checks to see if the type of the current page is |page_type|. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CheckShownPage(WebContents* tab, content::PageType page_type) { 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(tab->IsCrashed()); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationEntry* entry = tab->GetController().GetActiveEntry(); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(entry); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(page_type, entry->GetPageType()); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SendAccessRequest(WebContents* tab) { 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InterstitialPage* interstitial_page = tab->GetInterstitialPage(); 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(interstitial_page); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Get the SupervisedUserInterstitial delegate. 8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::InterstitialPageDelegate* delegate = 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) interstitial_page->GetDelegateForTesting(); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Simulate the click on the "request" button. 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate->CommandReceived("\"request\""); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void GoBack(WebContents* tab) { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InterstitialPage* interstitial_page = tab->GetInterstitialPage(); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(interstitial_page); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Get the SupervisedUserInterstitial delegate. 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::InterstitialPageDelegate* delegate = 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) interstitial_page->GetDelegateForTesting(); 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Simulate the click on the "back" button. 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate->CommandReceived("\"back\""); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Set up the SupervisedUserNavigationObserver manually since the profile 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // was not supervised when the browser was created. 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::WebContents* web_contents = 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserNavigationObserver::CreateForWebContents(web_contents); 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = browser()->profile(); 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_service_ = 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserServiceFactory::GetForProfile(profile); 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsService* supervised_user_settings_service = 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsServiceFactory::GetForProfile(profile); 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_settings_service->SetLocalSettingForTesting( 113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_users::kContentPackDefaultFilteringBehavior, 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value>( 115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new base::FundamentalValue(SupervisedUserURLFilter::BLOCK))); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Enable the test server and remap all URLs to it. 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(test_server()->Start()); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string host_port = test_server()->host_port_pair().ToString(); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitchASCII(switches::kHostResolverRules, 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "MAP *.example.com " + host_port + "," + 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "MAP *.new-example.com " + host_port + "," + 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "MAP *.a.com " + host_port); 1268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kSupervisedUserId, "asdf"); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Acts like a synchronous call to history's QueryHistory. Modified from 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // history_querying_unittest.cc. 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void QueryHistory(HistoryService* history_service, 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& text_query, 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const history::QueryOptions& options, 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) history::QueryResults* results) { 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::RunLoop run_loop; 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CancelableTaskTracker history_task_tracker; 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) history_service->QueryHistory( 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(text_query), 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) options, 141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&SupervisedUserBlockModeTest::QueryHistoryComplete, 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this), 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) results, 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &run_loop), 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &history_task_tracker); 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) run_loop.Run(); // Will go until ...Complete calls Quit. 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void QueryHistoryComplete(history::QueryResults* new_results, 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::RunLoop* run_loop, 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) history::QueryResults* results) { 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) results->Swap(new_results); 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) run_loop->Quit(); // Will return out to QueryHistory. 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserService* supervised_user_service_; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass MockTabStripModelObserver : public TabStripModelObserver { 1605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public: 1615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu explicit MockTabStripModelObserver(TabStripModel* tab_strip) 1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu : tab_strip_(tab_strip) { 1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu tab_strip_->AddObserver(this); 1645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ~MockTabStripModelObserver() { 1675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu tab_strip_->RemoveObserver(this); 1685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 1695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MOCK_METHOD3(TabClosingAt, void(TabStripModel*, content::WebContents*, int)); 1715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private: 1735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu TabStripModel* tab_strip_; 1745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 1755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Navigates to a blocked URL. 177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SupervisedUserBlockModeTest, 17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendAccessRequestOnBlockedURL) { 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL test_url("http://www.example.com/files/simple.html"); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), test_url); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckShownPageIsInterstitial(tab); 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendAccessRequest(tab); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(sergiu): Properly check that the access request was sent here. 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GoBack(tab); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Make sure that the tab is still there. 1935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(tab, browser()->tab_strip_model()->GetActiveWebContents()); 1945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckShownPageIsNotInterstitial(tab); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Navigates to a blocked URL in a new tab. We expect the tab to be closed 1995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// automatically on pressing the "back" button on the interstitial. 200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SupervisedUserBlockModeTest, OpenBlockedURLInNewTab) { 2015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu TabStripModel* tab_strip = browser()->tab_strip_model(); 2025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebContents* prev_tab = tab_strip->GetActiveWebContents(); 2035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Open blocked URL in a new tab. 2055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GURL test_url("http://www.example.com/files/simple.html"); 2065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ui_test_utils::NavigateToURLWithDisposition( 2075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu browser(), test_url, NEW_FOREGROUND_TAB, 2085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 2095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Check that we got the interstitial. 2115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebContents* tab = tab_strip->GetActiveWebContents(); 2125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu CheckShownPageIsInterstitial(tab); 2135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // On pressing the "back" button, the new tab should be closed, and we should 2155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // get back to the previous active tab. 2165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MockTabStripModelObserver observer(tab_strip); 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::RunLoop run_loop; 2185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_CALL(observer, 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TabClosingAt(tab_strip, tab, tab_strip->active_index())) 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .WillOnce(testing::InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit)); 2215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu GoBack(tab); 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci run_loop.Run(); 2235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu EXPECT_EQ(prev_tab, tab_strip->GetActiveWebContents()); 2245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests whether a visit attempt adds a special history entry. 227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SupervisedUserBlockModeTest, 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HistoryVisitRecorded) { 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL allowed_url("http://www.example.com/files/simple.html"); 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Set the host as allowed. 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue); 2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dict->SetBooleanWithoutPathExpansion(allowed_url.host(), true); 234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsService* supervised_user_settings_service = 235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsServiceFactory::GetForProfile( 2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) browser()->profile()); 237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_settings_service->SetLocalSettingForTesting( 238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_users::kContentPackManualBehaviorHosts, 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dict.PassAs<base::Value>()); 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ( 241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserService::MANUAL_ALLOW, 242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_service_->GetManualBehaviorForHost(allowed_url.host())); 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), allowed_url); 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Navigate to it and check that we don't get an interstitial. 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CheckShownPageIsNotInterstitial(tab); 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Navigate to a blocked page and go back on the interstitial. 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GURL blocked_url("http://www.new-example.com/files/simple.html"); 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), blocked_url); 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tab = browser()->tab_strip_model()->GetActiveWebContents(); 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CheckShownPageIsInterstitial(tab); 25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GoBack(tab); 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check that we went back to the first URL and that the manual behaviors 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // have not changed. 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(allowed_url.spec(), tab->GetURL().spec()); 262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(SupervisedUserService::MANUAL_ALLOW, 263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_service_->GetManualBehaviorForHost( 264f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "www.example.com")); 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ( 266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserService::MANUAL_NONE, 267f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_service_->GetManualBehaviorForHost( 268f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "www.new-example.com")); 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Query the history entry. 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HistoryService* history_service = HistoryServiceFactory::GetForProfile( 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser()->profile(), Profile::EXPLICIT_ACCESS); 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) history::QueryOptions options; 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) history::QueryResults results; 275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QueryHistory(history_service, "", options, &results); 276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check that the entries have the correct blocked_visit value. 278d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_EQ(2u, results.size()); 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(blocked_url.spec(), results[0].url().spec()); 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(results[0].blocked_visit()); 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(allowed_url.spec(), results[1].url().spec()); 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(results[1].blocked_visit()); 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 285f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(SupervisedUserBlockModeTest, Unblock) { 28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GURL test_url("http://www.example.com/files/simple.html"); 28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), test_url); 28858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebContents* web_contents = 29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 29158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 29258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CheckShownPageIsInterstitial(web_contents); 29358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 29458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) content::WindowedNotificationObserver observer( 29558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) content::NOTIFICATION_LOAD_STOP, 29658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) content::NotificationService::AllSources()); 29758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Set the host as allowed. 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue); 30058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) dict->SetBooleanWithoutPathExpansion(test_url.host(), true); 301f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsService* supervised_user_settings_service = 302f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsServiceFactory::GetForProfile( 30358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) browser()->profile()); 304f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_settings_service->SetLocalSettingForTesting( 305f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_users::kContentPackManualBehaviorHosts, 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dict.PassAs<base::Value>()); 30758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ( 308f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserService::MANUAL_ALLOW, 309f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_service_->GetManualBehaviorForHost(test_url.host())); 31058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 31158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) observer.Wait(); 31258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(test_url, web_contents->GetURL()); 31358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 31458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 316