12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 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 "chrome/browser/managed_mode/managed_mode_interstitial.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/i18n/rtl.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/values.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/managed_mode/managed_user_service.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/managed_mode/managed_user_service_factory.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/interstitial_page.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_delegate.h"
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/browser/web_ui.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/browser_resources.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/generated_resources.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_util.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/webui/jstemplate_builder.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/webui/web_ui_util.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::BrowserThread;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ManagedModeInterstitial::ManagedModeInterstitial(
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::WebContents* web_contents,
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const GURL& url,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::Callback<void(bool)>& callback)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : web_contents_(web_contents),
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      url_(url),
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_ptr_factory_(this),
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      callback_(callback) {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile =
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Profile::FromBrowserContext(web_contents->GetBrowserContext());
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  languages_ = profile->GetPrefs()->GetString(prefs::kAcceptLanguages);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  interstitial_page_ =
454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      content::InterstitialPage::Create(web_contents, true, url_, this);
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  interstitial_page_->Show();
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ManagedModeInterstitial::~ManagedModeInterstitial() {}
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string ManagedModeInterstitial::GetHTMLContents() {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DictionaryValue strings;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  strings.SetString("blockPageTitle",
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    l10n_util::GetStringUTF16(IDS_BLOCK_INTERSTITIAL_TITLE));
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Profile* profile =
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      Profile::FromBrowserContext(web_contents_->GetBrowserContext());
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ManagedUserService* managed_user_service =
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ManagedUserServiceFactory::GetForProfile(profile);
604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
614311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  bool allow_access_requests = managed_user_service->AccessRequestsEnabled();
624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  strings.SetBoolean("allowAccessRequests", allow_access_requests);
634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  string16 custodian = UTF8ToUTF16(managed_user_service->GetCustodianName());
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  strings.SetString(
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "blockPageMessage",
674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      allow_access_requests
684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch          ? l10n_util::GetStringFUTF16(IDS_BLOCK_INTERSTITIAL_MESSAGE,
694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                       custodian)
704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch          : l10n_util::GetStringUTF16(
714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                IDS_BLOCK_INTERSTITIAL_MESSAGE_ACCESS_REQUESTS_DISABLED));
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  strings.SetString("backButton", l10n_util::GetStringUTF16(IDS_BACK_BUTTON));
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  strings.SetString(
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "requestAccessButton",
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      l10n_util::GetStringUTF16(IDS_BLOCK_INTERSTITIAL_REQUEST_ACCESS_BUTTON));
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  strings.SetString(
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "requestSentMessage",
8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      l10n_util::GetStringFUTF16(IDS_BLOCK_INTERSTITIAL_REQUEST_SENT_MESSAGE,
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 custodian));
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  webui::SetFontAndTextDirection(&strings);
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  base::StringPiece html(ResourceBundle::GetSharedInstance().GetRawDataResource(
864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      IDR_MANAGED_MODE_BLOCK_INTERSTITIAL_HTML));
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  webui::UseVersion2 version;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return webui::GetI18nTemplateHtml(html, &strings);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ManagedModeInterstitial::CommandReceived(const std::string& command) {
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For use in histograms.
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum Commands {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PREVIEW,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    BACK,
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NTP,
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ACCESS_REQUEST,
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    HISTOGRAM_BOUNDING_VALUE
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (command == "\"back\"") {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_ENUMERATION("ManagedMode.BlockingInterstitialCommand",
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              BACK,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              HISTOGRAM_BOUNDING_VALUE);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    interstitial_page_->DontProceed();
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (command == "\"request\"") {
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_ENUMERATION("ManagedMode.BlockingInterstitialCommand",
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                              ACCESS_REQUEST,
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              HISTOGRAM_BOUNDING_VALUE);
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Profile* profile =
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        Profile::FromBrowserContext(web_contents_->GetBrowserContext());
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ManagedUserService* managed_user_service =
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        ManagedUserServiceFactory::GetForProfile(profile);
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    managed_user_service->AddAccessRequest(url_);
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DVLOG(1) << "Sent access request for " << url_.spec();
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid ManagedModeInterstitial::OnProceed() { NOTREACHED(); }
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ManagedModeInterstitial::OnDontProceed() {
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DispatchContinueRequest(false);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ManagedModeInterstitial::DispatchContinueRequest(bool continue_request) {
1354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  BrowserThread::PostTask(
1364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      BrowserThread::IO, FROM_HERE, base::Bind(callback_, continue_request));
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
138