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