blob: 5e04dd2c9e9bf3b2117366e44c95480a9bfa90b8 [file] [log] [blame]
[email protected]cce15bb2014-06-17 13:43:511// Copyright 2014 The Chromium Authors. All rights reserved.
[email protected]a09159a2012-11-29 12:51:482// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]cce15bb2014-06-17 13:43:515#include "chrome/browser/supervised_user/supervised_user_interstitial.h"
[email protected]a09159a2012-11-29 12:51:486
avi664c07b2015-12-26 02:18:317#include <stddef.h>
8
treibe7ccb7e2014-09-09 19:21:459#include "base/memory/weak_ptr.h"
[email protected]2c145422013-01-24 18:15:4010#include "base/metrics/histogram.h"
[email protected]95c47d02014-08-19 09:17:5011#include "base/strings/string_number_conversions.h"
khannansf3b27192015-01-09 17:28:1712#include "base/strings/stringprintf.h"
[email protected]112158af2013-06-07 23:46:1813#include "base/strings/utf_string_conversions.h"
[email protected]59f21562013-05-23 16:19:3014#include "base/values.h"
avi664c07b2015-12-26 02:18:3115#include "build/build_config.h"
dbeam622e9f32015-01-28 21:22:4516#include "chrome/browser/browser_process.h"
[email protected]93c23212013-09-19 14:22:3817#include "chrome/browser/infobars/infobar_service.h"
[email protected]a09159a2012-11-29 12:51:4818#include "chrome/browser/profiles/profile.h"
[email protected]cce15bb2014-06-17 13:43:5119#include "chrome/browser/supervised_user/supervised_user_service.h"
20#include "chrome/browser/supervised_user/supervised_user_service_factory.h"
sievers2f1e8112015-12-04 18:43:5621#include "chrome/common/features.h"
[email protected]a09159a2012-11-29 12:51:4822#include "chrome/common/pref_names.h"
[email protected]af39f002014-08-22 10:18:1823#include "chrome/grit/generated_resources.h"
[email protected]051655ad2014-04-18 15:09:4124#include "components/infobars/core/infobar.h"
25#include "components/infobars/core/infobar_delegate.h"
brettwb1fc1b82016-02-02 00:19:0826#include "components/prefs/pref_service.h"
[email protected]a09159a2012-11-29 12:51:4827#include "content/public/browser/browser_thread.h"
28#include "content/public/browser/interstitial_page.h"
[email protected]93c23212013-09-19 14:22:3829#include "content/public/browser/navigation_controller.h"
30#include "content/public/browser/navigation_details.h"
31#include "content/public/browser/navigation_entry.h"
khannansf3b27192015-01-09 17:28:1732#include "content/public/browser/render_frame_host.h"
33#include "content/public/browser/render_view_host.h"
[email protected]a09159a2012-11-29 12:51:4834#include "content/public/browser/web_contents.h"
treibe7ccb7e2014-09-09 19:21:4535#include "content/public/browser/web_contents_user_data.h"
[email protected]59f21562013-05-23 16:19:3036#include "content/public/browser/web_ui.h"
[email protected]a09159a2012-11-29 12:51:4837#include "grit/browser_resources.h"
[email protected]a09159a2012-11-29 12:51:4838#include "ui/base/l10n/l10n_util.h"
39#include "ui/base/resource/resource_bundle.h"
[email protected]cd67ed52013-10-15 01:22:1340#include "ui/base/webui/jstemplate_builder.h"
41#include "ui/base/webui/web_ui_util.h"
[email protected]a09159a2012-11-29 12:51:4842
sievers2f1e8112015-12-04 18:43:5643#if BUILDFLAG(ANDROID_JAVA_UI)
treib9dbb9302015-01-08 14:42:3944#include "chrome/browser/supervised_user/child_accounts/child_account_feedback_reporter_android.h"
sievers2f1e8112015-12-04 18:43:5645#elif !defined(OS_ANDROID)
treibe7ccb7e2014-09-09 19:21:4546#include "chrome/browser/ui/browser_finder.h"
treib5dd8daf32014-12-18 17:36:3747#include "chrome/browser/ui/chrome_pages.h"
treibe7ccb7e2014-09-09 19:21:4548#include "chrome/browser/ui/tabs/tab_strip_model.h"
49#endif
50
[email protected]a09159a2012-11-29 12:51:4851using content::BrowserThread;
treibe7ccb7e2014-09-09 19:21:4552using content::WebContents;
[email protected]a09159a2012-11-29 12:51:4853
[email protected]95c47d02014-08-19 09:17:5054namespace {
55
56static const int kAvatarSize1x = 45;
57static const int kAvatarSize2x = 90;
58
treib885fee12014-08-29 08:07:5859std::string BuildAvatarImageUrl(const std::string& url, int size) {
[email protected]95c47d02014-08-19 09:17:5060 std::string result = url;
61 size_t slash = result.rfind('/');
62 if (slash != std::string::npos)
63 result.insert(slash, "/s" + base::IntToString(size));
treib885fee12014-08-29 08:07:5864 return result;
[email protected]95c47d02014-08-19 09:17:5065}
66
treibe7ccb7e2014-09-09 19:21:4567class TabCloser : public content::WebContentsUserData<TabCloser> {
bauerb34f34c5f2015-10-21 15:38:3268 public:
69 static void MaybeClose(WebContents* web_contents) {
70 // Close the tab if there is no history entry to go back to and there is a
71 // browser for the tab (which is not the case for example in a <webview>).
72 if (!web_contents->GetController().IsInitialBlankNavigation())
73 return;
74
75#if !defined(OS_ANDROID)
76 if (!chrome::FindBrowserWithWebContents(web_contents))
77 return;
78#endif
79 TabCloser::CreateForWebContents(web_contents);
80 }
81
treibe7ccb7e2014-09-09 19:21:4582 private:
83 friend class content::WebContentsUserData<TabCloser>;
84
85 explicit TabCloser(WebContents* web_contents)
86 : web_contents_(web_contents), weak_ptr_factory_(this) {
87 BrowserThread::PostTask(
88 BrowserThread::UI,
89 FROM_HERE,
90 base::Bind(&TabCloser::CloseTabImpl, weak_ptr_factory_.GetWeakPtr()));
91 }
dchengc072fff2014-10-21 11:39:0592 ~TabCloser() override {}
treibe7ccb7e2014-09-09 19:21:4593
94 void CloseTabImpl() {
95 // On Android, FindBrowserWithWebContents and TabStripModel don't exist.
96#if !defined(OS_ANDROID)
97 Browser* browser = chrome::FindBrowserWithWebContents(web_contents_);
98 DCHECK(browser);
99 TabStripModel* tab_strip = browser->tab_strip_model();
100 DCHECK_NE(TabStripModel::kNoTab,
101 tab_strip->GetIndexOfWebContents(web_contents_));
102 if (tab_strip->count() <= 1) {
103 // Don't close the last tab in the window.
104 web_contents_->RemoveUserData(UserDataKey());
105 return;
106 }
107#endif
108 web_contents_->Close();
109 }
110
111 WebContents* web_contents_;
112 base::WeakPtrFactory<TabCloser> weak_ptr_factory_;
113};
114
115} // namespace
116
117DEFINE_WEB_CONTENTS_USER_DATA_KEY(TabCloser);
[email protected]95c47d02014-08-19 09:17:50118
meacerfc55bd52015-03-05 19:12:00119content::InterstitialPageDelegate::TypeID
120 SupervisedUserInterstitial::kTypeForTesting =
121 &SupervisedUserInterstitial::kTypeForTesting;
122
[email protected]b8af2d12014-04-29 07:30:42123// static
[email protected]95c47d02014-08-19 09:17:50124void SupervisedUserInterstitial::Show(
treibe7ccb7e2014-09-09 19:21:45125 WebContents* web_contents,
[email protected]95c47d02014-08-19 09:17:50126 const GURL& url,
treib170c3f82014-12-10 19:13:25127 SupervisedUserURLFilter::FilteringBehaviorReason reason,
[email protected]95c47d02014-08-19 09:17:50128 const base::Callback<void(bool)>& callback) {
[email protected]cce15bb2014-06-17 13:43:51129 SupervisedUserInterstitial* interstitial =
treib170c3f82014-12-10 19:13:25130 new SupervisedUserInterstitial(web_contents, url, reason, callback);
[email protected]b8af2d12014-04-29 07:30:42131
132 // If Init() does not complete fully, immediately delete the interstitial.
133 if (!interstitial->Init())
134 delete interstitial;
135 // Otherwise |interstitial_page_| is responsible for deleting it.
136}
137
[email protected]cce15bb2014-06-17 13:43:51138SupervisedUserInterstitial::SupervisedUserInterstitial(
treibe7ccb7e2014-09-09 19:21:45139 WebContents* web_contents,
[email protected]a09159a2012-11-29 12:51:48140 const GURL& url,
treib170c3f82014-12-10 19:13:25141 SupervisedUserURLFilter::FilteringBehaviorReason reason,
[email protected]a09159a2012-11-29 12:51:48142 const base::Callback<void(bool)>& callback)
143 : web_contents_(web_contents),
treibab0a39e2014-09-24 14:48:28144 profile_(Profile::FromBrowserContext(web_contents->GetBrowserContext())),
[email protected]61f5da22013-09-05 15:52:10145 interstitial_page_(NULL),
[email protected]a09159a2012-11-29 12:51:48146 url_(url),
treib170c3f82014-12-10 19:13:25147 reason_(reason),
bauerb646019b12014-10-16 16:23:09148 callback_(callback),
149 weak_ptr_factory_(this) {}
[email protected]b8af2d12014-04-29 07:30:42150
treibab0a39e2014-09-24 14:48:28151SupervisedUserInterstitial::~SupervisedUserInterstitial() {
152 DCHECK(!web_contents_);
153}
[email protected]b8af2d12014-04-29 07:30:42154
[email protected]cce15bb2014-06-17 13:43:51155bool SupervisedUserInterstitial::Init() {
[email protected]61f5da22013-09-05 15:52:10156 if (ShouldProceed()) {
157 // It can happen that the site was only allowed very recently and the URL
158 // filter on the IO thread had not been updated yet. Proceed with the
159 // request without showing the interstitial.
160 DispatchContinueRequest(true);
[email protected]b8af2d12014-04-29 07:30:42161 return false;
[email protected]61f5da22013-09-05 15:52:10162 }
163
[email protected]b8af2d12014-04-29 07:30:42164 InfoBarService* service = InfoBarService::FromWebContents(web_contents_);
[email protected]93c23212013-09-19 14:22:38165 if (service) {
[email protected]b8af2d12014-04-29 07:30:42166 // Remove all the infobars which are attached to |web_contents_| and for
[email protected]93c23212013-09-19 14:22:38167 // which ShouldExpire() returns true.
168 content::LoadCommittedDetails details;
169 // |details.is_in_page| is default false, and |details.is_main_frame| is
170 // default true. This results in is_navigation_to_different_page() returning
171 // true.
172 DCHECK(details.is_navigation_to_different_page());
173 const content::NavigationController& controller =
[email protected]b8af2d12014-04-29 07:30:42174 web_contents_->GetController();
[email protected]93c23212013-09-19 14:22:38175 details.entry = controller.GetActiveEntry();
176 if (controller.GetLastCommittedEntry()) {
177 details.previous_entry_index = controller.GetLastCommittedEntryIndex();
178 details.previous_url = controller.GetLastCommittedEntry()->GetURL();
179 }
180 details.type = content::NAVIGATION_TYPE_NEW_PAGE;
[email protected]b44f1d32014-04-10 13:53:26181 for (int i = service->infobar_count() - 1; i >= 0; --i) {
[email protected]051655ad2014-04-18 15:09:41182 infobars::InfoBar* infobar = service->infobar_at(i);
[email protected]5daf1d92014-04-04 15:52:13183 if (infobar->delegate()->ShouldExpire(
184 InfoBarService::NavigationDetailsFromLoadCommittedDetails(
185 details)))
[email protected]b44f1d32014-04-10 13:53:26186 service->RemoveInfoBar(infobar);
[email protected]93c23212013-09-19 14:22:38187 }
188 }
189
treibab0a39e2014-09-24 14:48:28190 SupervisedUserService* supervised_user_service =
191 SupervisedUserServiceFactory::GetForProfile(profile_);
192 supervised_user_service->AddObserver(this);
[email protected]a09159a2012-11-29 12:51:48193
[email protected]0369d6ab2013-08-09 01:52:59194 interstitial_page_ =
[email protected]b8af2d12014-04-29 07:30:42195 content::InterstitialPage::Create(web_contents_, true, url_, this);
[email protected]a09159a2012-11-29 12:51:48196 interstitial_page_->Show();
[email protected]a09159a2012-11-29 12:51:48197
[email protected]b8af2d12014-04-29 07:30:42198 return true;
199}
[email protected]a09159a2012-11-29 12:51:48200
aberentec7d1d12016-01-05 13:04:48201// static
202std::string SupervisedUserInterstitial::GetHTMLContents(
203 Profile* profile,
204 SupervisedUserURLFilter::FilteringBehaviorReason reason) {
[email protected]cb1078de2013-12-23 20:04:22205 base::DictionaryValue strings;
[email protected]a09159a2012-11-29 12:51:48206 strings.SetString("blockPageTitle",
207 l10n_util::GetStringUTF16(IDS_BLOCK_INTERSTITIAL_TITLE));
[email protected]fae057a2013-06-21 22:46:08208
[email protected]cce15bb2014-06-17 13:43:51209 SupervisedUserService* supervised_user_service =
aberentec7d1d12016-01-05 13:04:48210 SupervisedUserServiceFactory::GetForProfile(profile);
[email protected]0369d6ab2013-08-09 01:52:59211
[email protected]cce15bb2014-06-17 13:43:51212 bool allow_access_requests = supervised_user_service->AccessRequestsEnabled();
[email protected]0369d6ab2013-08-09 01:52:59213 strings.SetBoolean("allowAccessRequests", allow_access_requests);
214
aberentec7d1d12016-01-05 13:04:48215 std::string profile_image_url = profile->GetPrefs()->GetString(
[email protected]95c47d02014-08-19 09:17:50216 prefs::kSupervisedUserCustodianProfileImageURL);
217 strings.SetString("avatarURL1x", BuildAvatarImageUrl(profile_image_url,
[email protected]95c47d02014-08-19 09:17:50218 kAvatarSize1x));
219 strings.SetString("avatarURL2x", BuildAvatarImageUrl(profile_image_url,
[email protected]95c47d02014-08-19 09:17:50220 kAvatarSize2x));
221
aberentec7d1d12016-01-05 13:04:48222 std::string profile_image_url2 = profile->GetPrefs()->GetString(
[email protected]95c47d02014-08-19 09:17:50223 prefs::kSupervisedUserSecondCustodianProfileImageURL);
224 strings.SetString("secondAvatarURL1x", BuildAvatarImageUrl(profile_image_url2,
[email protected]95c47d02014-08-19 09:17:50225 kAvatarSize1x));
226 strings.SetString("secondAvatarURL2x", BuildAvatarImageUrl(profile_image_url2,
[email protected]95c47d02014-08-19 09:17:50227 kAvatarSize2x));
228
aberentec7d1d12016-01-05 13:04:48229 bool is_child_account = profile->IsChild();
treib5fc1aed2014-12-08 12:46:03230
[email protected]0085863a2013-12-06 21:19:03231 base::string16 custodian =
[email protected]cce15bb2014-06-17 13:43:51232 base::UTF8ToUTF16(supervised_user_service->GetCustodianName());
treib5fc1aed2014-12-08 12:46:03233 base::string16 second_custodian =
234 base::UTF8ToUTF16(supervised_user_service->GetSecondCustodianName());
atanasovaca751732016-01-05 09:27:41235 base::string16 custodian_email =
236 base::UTF8ToUTF16(supervised_user_service->GetCustodianEmailAddress());
237 base::string16 second_custodian_email = base::UTF8ToUTF16(
238 supervised_user_service->GetSecondCustodianEmailAddress());
239 strings.SetString("custodianName", custodian);
240 strings.SetString("custodianEmail", custodian_email);
241 strings.SetString("secondCustodianName", second_custodian);
242 strings.SetString("secondCustodianEmail", second_custodian_email);
treib5fc1aed2014-12-08 12:46:03243
244 base::string16 block_message;
245 if (allow_access_requests) {
246 if (is_child_account) {
247 block_message = l10n_util::GetStringUTF16(
248 second_custodian.empty()
249 ? IDS_CHILD_BLOCK_INTERSTITIAL_MESSAGE_SINGLE_PARENT
250 : IDS_CHILD_BLOCK_INTERSTITIAL_MESSAGE_MULTI_PARENT);
251 } else {
252 block_message = l10n_util::GetStringFUTF16(
253 IDS_BLOCK_INTERSTITIAL_MESSAGE, custodian);
254 }
255 } else {
256 block_message = l10n_util::GetStringUTF16(
257 IDS_BLOCK_INTERSTITIAL_MESSAGE_ACCESS_REQUESTS_DISABLED);
258 }
259 strings.SetString("blockPageMessage", block_message);
atanasovaca751732016-01-05 09:27:41260 strings.SetString("blockReasonMessage", l10n_util::GetStringUTF16(
261 SupervisedUserURLFilter::GetBlockMessageID(
aberentec7d1d12016-01-05 13:04:48262 reason, is_child_account, second_custodian.empty())));
atanasovaca751732016-01-05 09:27:41263 strings.SetString("blockReasonHeader", l10n_util::GetStringUTF16(
aberentec7d1d12016-01-05 13:04:48264 SupervisedUserURLFilter::GetBlockHeaderID(reason)));
treib5dd8daf32014-12-18 17:36:37265 bool show_feedback = false;
treib9dbb9302015-01-08 14:42:39266#if defined(GOOGLE_CHROME_BUILD)
aberentec7d1d12016-01-05 13:04:48267 show_feedback =
268 is_child_account && SupervisedUserURLFilter::ReasonIsAutomatic(reason);
treib5dd8daf32014-12-18 17:36:37269#endif
270 strings.SetBoolean("showFeedbackLink", show_feedback);
271 strings.SetString("feedbackLink",
272 l10n_util::GetStringUTF16(IDS_BLOCK_INTERSTITIAL_SEND_FEEDBACK));
273
[email protected]a09159a2012-11-29 12:51:48274 strings.SetString("backButton", l10n_util::GetStringUTF16(IDS_BACK_BUTTON));
treib5fc1aed2014-12-08 12:46:03275 strings.SetString("requestAccessButton", l10n_util::GetStringUTF16(
atanasovaca751732016-01-05 09:27:41276 IDS_BLOCK_INTERSTITIAL_REQUEST_ACCESS_BUTTON));
277
278 strings.SetString("showDetailsLink", l10n_util::GetStringUTF16(
279 IDS_BLOCK_INTERSTITIAL_SHOW_DETAILS));
280 strings.SetString("hideDetailsLink", l10n_util::GetStringUTF16(
281 IDS_BLOCK_INTERSTITIAL_HIDE_DETAILS));
[email protected]59f21562013-05-23 16:19:30282
treib5fc1aed2014-12-08 12:46:03283 base::string16 request_sent_message;
khannansf3b27192015-01-09 17:28:17284 base::string16 request_failed_message;
treib5fc1aed2014-12-08 12:46:03285 if (is_child_account) {
khannansf3b27192015-01-09 17:28:17286 if (second_custodian.empty()) {
287 request_sent_message = l10n_util::GetStringUTF16(
288 IDS_CHILD_BLOCK_INTERSTITIAL_REQUEST_SENT_MESSAGE_SINGLE_PARENT);
289 request_failed_message = l10n_util::GetStringUTF16(
290 IDS_CHILD_BLOCK_INTERSTITIAL_REQUEST_FAILED_MESSAGE_SINGLE_PARENT);
291 } else {
292 request_sent_message = l10n_util::GetStringUTF16(
293 IDS_CHILD_BLOCK_INTERSTITIAL_REQUEST_SENT_MESSAGE_MULTI_PARENT);
294 request_failed_message = l10n_util::GetStringUTF16(
295 IDS_CHILD_BLOCK_INTERSTITIAL_REQUEST_FAILED_MESSAGE_MULTI_PARENT);
296 }
treib5fc1aed2014-12-08 12:46:03297 } else {
298 request_sent_message = l10n_util::GetStringFUTF16(
299 IDS_BLOCK_INTERSTITIAL_REQUEST_SENT_MESSAGE, custodian);
khannansf3b27192015-01-09 17:28:17300 request_failed_message = l10n_util::GetStringFUTF16(
301 IDS_BLOCK_INTERSTITIAL_REQUEST_FAILED_MESSAGE, custodian);
treib5fc1aed2014-12-08 12:46:03302 }
303 strings.SetString("requestSentMessage", request_sent_message);
khannansf3b27192015-01-09 17:28:17304 strings.SetString("requestFailedMessage", request_failed_message);
[email protected]59f21562013-05-23 16:19:30305
dbeam622e9f32015-01-28 21:22:45306 const std::string& app_locale = g_browser_process->GetApplicationLocale();
307 webui::SetLoadTimeDataDefaults(app_locale, &strings);
[email protected]a09159a2012-11-29 12:51:48308
bauerbd0399182015-01-26 10:20:45309 std::string html =
310 ResourceBundle::GetSharedInstance()
311 .GetRawDataResource(IDR_SUPERVISED_USER_BLOCK_INTERSTITIAL_HTML)
312 .as_string();
313 webui::AppendWebUiCssTextDefaults(&html);
[email protected]a09159a2012-11-29 12:51:48314
[email protected]2779e3a2013-01-22 18:40:21315 return webui::GetI18nTemplateHtml(html, &strings);
[email protected]a09159a2012-11-29 12:51:48316}
317
aberentec7d1d12016-01-05 13:04:48318std::string SupervisedUserInterstitial::GetHTMLContents() {
319 return GetHTMLContents(profile_, reason_);
320}
321
[email protected]cce15bb2014-06-17 13:43:51322void SupervisedUserInterstitial::CommandReceived(const std::string& command) {
[email protected]2c145422013-01-24 18:15:40323 // For use in histograms.
324 enum Commands {
325 PREVIEW,
326 BACK,
327 NTP,
[email protected]59f21562013-05-23 16:19:30328 ACCESS_REQUEST,
[email protected]2c145422013-01-24 18:15:40329 HISTOGRAM_BOUNDING_VALUE
330 };
331
[email protected]a09159a2012-11-29 12:51:48332 if (command == "\"back\"") {
[email protected]2c145422013-01-24 18:15:40333 UMA_HISTOGRAM_ENUMERATION("ManagedMode.BlockingInterstitialCommand",
334 BACK,
335 HISTOGRAM_BOUNDING_VALUE);
treibe7ccb7e2014-09-09 19:21:45336
creisf82a92ee2015-10-19 19:59:08337 // The interstitial's reference to the WebContents will go away after the
338 // DontProceed call.
339 WebContents* web_contents = web_contents_;
340 DCHECK(web_contents->GetController().GetTransientEntry());
[email protected]a09159a2012-11-29 12:51:48341 interstitial_page_->DontProceed();
creisf82a92ee2015-10-19 19:59:08342
bauerb34f34c5f2015-10-21 15:38:32343 TabCloser::MaybeClose(web_contents);
[email protected]a09159a2012-11-29 12:51:48344 return;
345 }
346
[email protected]59f21562013-05-23 16:19:30347 if (command == "\"request\"") {
[email protected]2c145422013-01-24 18:15:40348 UMA_HISTOGRAM_ENUMERATION("ManagedMode.BlockingInterstitialCommand",
[email protected]59f21562013-05-23 16:19:30349 ACCESS_REQUEST,
[email protected]2c145422013-01-24 18:15:40350 HISTOGRAM_BOUNDING_VALUE);
[email protected]ad7a89e2013-05-31 12:03:24351
[email protected]cce15bb2014-06-17 13:43:51352 SupervisedUserService* supervised_user_service =
treibab0a39e2014-09-24 14:48:28353 SupervisedUserServiceFactory::GetForProfile(profile_);
treib8ecc1eb52015-03-04 18:29:06354 supervised_user_service->AddURLAccessRequest(
bauerb646019b12014-10-16 16:23:09355 url_, base::Bind(&SupervisedUserInterstitial::OnAccessRequestAdded,
356 weak_ptr_factory_.GetWeakPtr()));
[email protected]a09159a2012-11-29 12:51:48357 return;
358 }
359
atanasovaca751732016-01-05 09:27:41360 SupervisedUserService* supervised_user_service =
361 SupervisedUserServiceFactory::GetForProfile(profile_);
362 base::string16 second_custodian =
363 base::UTF8ToUTF16(supervised_user_service->GetSecondCustodianName());
364
treib5dd8daf32014-12-18 17:36:37365 if (command == "\"feedback\"") {
treibd733ef8b2015-01-21 19:56:32366 base::string16 reason = l10n_util::GetStringUTF16(
atanasovaca751732016-01-05 09:27:41367 SupervisedUserURLFilter::GetBlockMessageID(
368 reason_, true, second_custodian.empty()));
treibd733ef8b2015-01-21 19:56:32369 std::string message = l10n_util::GetStringFUTF8(
370 IDS_BLOCK_INTERSTITIAL_DEFAULT_FEEDBACK_TEXT, reason);
sievers2f1e8112015-12-04 18:43:56371#if BUILDFLAG(ANDROID_JAVA_UI)
treibd733ef8b2015-01-21 19:56:32372 ReportChildAccountFeedback(web_contents_, message, url_);
treib9dbb9302015-01-08 14:42:39373#else
treib8a6a5d92015-05-12 16:33:16374 chrome::ShowFeedbackPage(chrome::FindBrowserWithWebContents(web_contents_),
atanasovaca751732016-01-05 09:27:41375 message, std::string());
treib9dbb9302015-01-08 14:42:39376#endif
treib5dd8daf32014-12-18 17:36:37377 return;
378 }
treib5dd8daf32014-12-18 17:36:37379
[email protected]a09159a2012-11-29 12:51:48380 NOTREACHED();
381}
382
[email protected]cce15bb2014-06-17 13:43:51383void SupervisedUserInterstitial::OnProceed() {
[email protected]61f5da22013-09-05 15:52:10384 DispatchContinueRequest(true);
385}
[email protected]a09159a2012-11-29 12:51:48386
[email protected]cce15bb2014-06-17 13:43:51387void SupervisedUserInterstitial::OnDontProceed() {
[email protected]6c7af96d2013-03-28 22:55:14388 DispatchContinueRequest(false);
[email protected]a09159a2012-11-29 12:51:48389}
390
meacerfc55bd52015-03-05 19:12:00391content::InterstitialPageDelegate::TypeID
392SupervisedUserInterstitial::GetTypeForTesting() const {
393 return SupervisedUserInterstitial::kTypeForTesting;
394}
395
treibab0a39e2014-09-24 14:48:28396void SupervisedUserInterstitial::OnURLFilterChanged() {
397 if (ShouldProceed())
398 interstitial_page_->Proceed();
399}
400
bauerb646019b12014-10-16 16:23:09401void SupervisedUserInterstitial::OnAccessRequestAdded(bool success) {
bauerbfc4af2ac2014-11-07 14:27:05402 VLOG(1) << "Sent access request for " << url_.spec()
403 << (success ? " successfully" : " unsuccessfully");
khannansf3b27192015-01-09 17:28:17404 std::string jsFunc =
405 base::StringPrintf("setRequestStatus(%s);", success ? "true" : "false");
406 interstitial_page_->GetMainFrame()->ExecuteJavaScript(
407 base::ASCIIToUTF16(jsFunc));
bauerb646019b12014-10-16 16:23:09408}
409
[email protected]cce15bb2014-06-17 13:43:51410bool SupervisedUserInterstitial::ShouldProceed() {
[email protected]cce15bb2014-06-17 13:43:51411 SupervisedUserService* supervised_user_service =
treibab0a39e2014-09-24 14:48:28412 SupervisedUserServiceFactory::GetForProfile(profile_);
[email protected]cce15bb2014-06-17 13:43:51413 SupervisedUserURLFilter* url_filter =
414 supervised_user_service->GetURLFilterForUIThread();
treib9e4fab902014-10-29 14:25:26415 SupervisedUserURLFilter::FilteringBehavior behavior;
treib22c3a042015-01-15 21:30:13416 if (url_filter->HasAsyncURLChecker()) {
417 if (!url_filter->GetManualFilteringBehaviorForURL(url_, &behavior))
418 return false;
419 } else {
420 behavior = url_filter->GetFilteringBehaviorForURL(url_);
421 }
422 return behavior != SupervisedUserURLFilter::BLOCK;
[email protected]61f5da22013-09-05 15:52:10423}
424
[email protected]cce15bb2014-06-17 13:43:51425void SupervisedUserInterstitial::DispatchContinueRequest(
426 bool continue_request) {
treibab0a39e2014-09-24 14:48:28427 SupervisedUserService* supervised_user_service =
428 SupervisedUserServiceFactory::GetForProfile(profile_);
429 supervised_user_service->RemoveObserver(this);
430
peconna2092d42015-09-17 17:28:59431 if (!callback_.is_null())
432 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
433 base::Bind(callback_, continue_request));
treibab0a39e2014-09-24 14:48:28434
435 // After this, the WebContents may be destroyed. Make sure we don't try to use
436 // it again.
437 web_contents_ = NULL;
[email protected]6c7af96d2013-03-28 22:55:14438}