summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-26 17:17:55 +0000
committerbauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-26 17:17:55 +0000
commit2a5f296376b0baa8bae3618f3fba73362c818c54 (patch)
treefd2dc020c3a6ec3b620f055cc4eb8c9da73133e8
parent9fe4eea2d85c2aa7c36d420f7738be7a6dbc1f61 (diff)
downloadchromium_src-2a5f296376b0baa8bae3618f3fba73362c818c54.zip
chromium_src-2a5f296376b0baa8bae3618f3fba73362c818c54.tar.gz
chromium_src-2a5f296376b0baa8bae3618f3fba73362c818c54.tar.bz2
Show a warning infobar when navigating to a non-whitelisted site in managed mode.
TBR=ben@chromium.org BUG=162481 Review URL: https://chromiumcodereview.appspot.com/11419149 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@169441 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/app/generated_resources.grd7
-rw-r--r--chrome/browser/managed_mode/managed_mode.cc35
-rw-r--r--chrome/browser/managed_mode/managed_mode.h5
-rw-r--r--chrome/browser/managed_mode/managed_mode_navigation_observer.cc157
-rw-r--r--chrome/browser/managed_mode/managed_mode_navigation_observer.h44
-rw-r--r--chrome/browser/prefs/browser_prefs.cc22
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/common/pref_names.cc8
-rw-r--r--chrome/common/pref_names.h2
9 files changed, 270 insertions, 12 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 79d933b..55b774f 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -15258,6 +15258,13 @@ Some features may be unavailable. Please check that the profile exists and you
Try again
</message>
+ <!-- Managed Mode -->
+ <message name="IDS_MANAGED_MODE_WARNING_MESSAGE" desc="Infobar message when browsing outside of the content pack whitelist.">
+ You're browsing on a site that is not in any installed content pack.
+ </message>
+ <message name="IDS_MANAGED_MODE_GO_BACK_ACTION" desc="Label for the button that goes back to a 'safe' page.">
+ Take me back!
+ </message>
</messages>
<structures fallback_to_english="true">
diff --git a/chrome/browser/managed_mode/managed_mode.cc b/chrome/browser/managed_mode/managed_mode.cc
index 443ee55..a40042f 100644
--- a/chrome/browser/managed_mode/managed_mode.cc
+++ b/chrome/browser/managed_mode/managed_mode.cc
@@ -5,6 +5,7 @@
#include "chrome/browser/managed_mode/managed_mode.h"
#include "base/command_line.h"
+#include "base/prefs/public/pref_change_registrar.h"
#include "base/sequenced_task_runner.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/extensions/extension_service.h"
@@ -86,6 +87,13 @@ void ManagedMode::RegisterPrefs(PrefService* prefs) {
}
// static
+void ManagedMode::RegisterUserPrefs(PrefService* prefs) {
+ prefs->RegisterIntegerPref(prefs::kDefaultManagedModeFilteringBehavior,
+ 2,
+ PrefService::UNSYNCABLE_PREF);
+}
+
+// static
void ManagedMode::Init(Profile* profile) {
GetInstance()->InitImpl(profile);
}
@@ -351,15 +359,27 @@ void ManagedMode::SetInManagedMode(Profile* newly_managed_profile) {
DCHECK(!managed_profile_ || managed_profile_ == newly_managed_profile);
extensions::ExtensionSystem::Get(
newly_managed_profile)->management_policy()->RegisterProvider(this);
+ pref_change_registrar_.reset(new PrefChangeRegistrar());
+ pref_change_registrar_->Init(newly_managed_profile->GetPrefs());
+ pref_change_registrar_->Add(
+ prefs::kDefaultManagedModeFilteringBehavior,
+ base::Bind(
+ &ManagedMode::OnDefaultFilteringBehaviorChanged,
+ base::Unretained(this)));
} else {
extensions::ExtensionSystem::Get(
managed_profile_)->management_policy()->UnregisterProvider(this);
+ pref_change_registrar_.reset();
}
managed_profile_ = newly_managed_profile;
ManagedModeURLFilter::FilteringBehavior behavior =
- in_managed_mode ? ManagedModeURLFilter::BLOCK :
- ManagedModeURLFilter::ALLOW;
+ ManagedModeURLFilter::ALLOW;
+ if (in_managed_mode) {
+ int behavior_value = managed_profile_->GetPrefs()->GetInteger(
+ prefs::kDefaultManagedModeFilteringBehavior);
+ behavior = ManagedModeURLFilter::BehaviorFromInt(behavior_value);
+ }
io_url_filter_context_->SetDefaultFilteringBehavior(behavior);
ui_url_filter_context_->SetDefaultFilteringBehavior(behavior);
g_browser_process->local_state()->SetBoolean(prefs::kInManagedMode,
@@ -381,6 +401,17 @@ ScopedVector<ManagedModeSiteList> ManagedMode::GetActiveSiteLists() {
return site_lists.Pass();
}
+void ManagedMode::OnDefaultFilteringBehaviorChanged() {
+ DCHECK(IsInManagedModeImpl());
+
+ int behavior_value = managed_profile_->GetPrefs()->GetInteger(
+ prefs::kDefaultManagedModeFilteringBehavior);
+ ManagedModeURLFilter::FilteringBehavior behavior =
+ ManagedModeURLFilter::BehaviorFromInt(behavior_value);
+ io_url_filter_context_->SetDefaultFilteringBehavior(behavior);
+ ui_url_filter_context_->SetDefaultFilteringBehavior(behavior);
+}
+
void ManagedMode::UpdateWhitelist() {
io_url_filter_context_->LoadWhitelists(GetActiveSiteLists());
ui_url_filter_context_->LoadWhitelists(GetActiveSiteLists());
diff --git a/chrome/browser/managed_mode/managed_mode.h b/chrome/browser/managed_mode/managed_mode.h
index 6e2ceaa..37d53ae 100644
--- a/chrome/browser/managed_mode/managed_mode.h
+++ b/chrome/browser/managed_mode/managed_mode.h
@@ -23,6 +23,7 @@ template<typename T>
struct DefaultSingletonTraits;
class ManagedModeSiteList;
class ManagedModeURLFilter;
+class PrefChangeRegistrar;
class PrefService;
class Profile;
@@ -38,6 +39,7 @@ class ManagedMode : public chrome::BrowserListObserver,
typedef base::Callback<void(bool)> EnterCallback;
static void RegisterPrefs(PrefService* prefs);
+ static void RegisterUserPrefs(PrefService* prefs);
// Initializes the singleton, setting the managed_profile_. Must be called
// after g_browser_process and the LocalState have been created.
@@ -127,9 +129,12 @@ class ManagedMode : public chrome::BrowserListObserver,
// This method should only be called if managed mode is active.
ScopedVector<ManagedModeSiteList> GetActiveSiteLists();
+ void OnDefaultFilteringBehaviorChanged();
+
void UpdateWhitelist();
content::NotificationRegistrar registrar_;
+ scoped_ptr<PrefChangeRegistrar> pref_change_registrar_;
scoped_ptr<URLFilterContext> io_url_filter_context_;
scoped_ptr<URLFilterContext> ui_url_filter_context_;
diff --git a/chrome/browser/managed_mode/managed_mode_navigation_observer.cc b/chrome/browser/managed_mode/managed_mode_navigation_observer.cc
new file mode 100644
index 0000000..868f332
--- /dev/null
+++ b/chrome/browser/managed_mode/managed_mode_navigation_observer.cc
@@ -0,0 +1,157 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/managed_mode/managed_mode_navigation_observer.h"
+
+#include "chrome/browser/api/infobars/confirm_infobar_delegate.h"
+#include "chrome/browser/infobars/infobar_tab_helper.h"
+#include "chrome/browser/managed_mode/managed_mode.h"
+#include "chrome/browser/managed_mode/managed_mode_url_filter.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/common/url_constants.h"
+#include "content/public/browser/web_contents_delegate.h"
+#include "content/public/common/frame_navigate_params.h"
+#include "grit/generated_resources.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace {
+
+class ManagedModeWarningInfobarDelegate : public ConfirmInfoBarDelegate {
+ public:
+ explicit ManagedModeWarningInfobarDelegate(
+ InfoBarTabHelper* infobar_tab_helper);
+
+ private:
+ virtual ~ManagedModeWarningInfobarDelegate();
+
+ // ConfirmInfoBarDelegate overrides:
+ virtual string16 GetMessageText() const OVERRIDE;
+ virtual int GetButtons() const OVERRIDE;
+ virtual string16 GetButtonLabel(InfoBarButton button) const OVERRIDE;
+ virtual bool Accept() OVERRIDE;
+ virtual bool Cancel() OVERRIDE;
+
+ // InfoBarDelegate override:
+ virtual bool ShouldExpire(
+ const content::LoadCommittedDetails& details) const OVERRIDE;
+ virtual void InfoBarDismissed() OVERRIDE;
+
+ DISALLOW_COPY_AND_ASSIGN(ManagedModeWarningInfobarDelegate);
+};
+
+void GoBackToSafety(content::WebContents* web_contents) {
+ // For now, just go back one page (the user didn't retreat from that page,
+ // so it should be okay).
+ content::NavigationController* controller =
+ &web_contents->GetController();
+ if (controller->CanGoBack()) {
+ controller->GoBack();
+ return;
+ }
+
+ // If we can't go back (because we opened a new tab), try to close the tab.
+ // If this is the last tab, open a new window.
+ if (BrowserList::size() == 1) {
+ Browser* browser = *(BrowserList::begin());
+ DCHECK(browser == browser::FindBrowserWithWebContents(web_contents));
+ if (browser->tab_count() == 1)
+ chrome::NewEmptyWindow(browser->profile());
+ }
+
+ web_contents->GetDelegate()->CloseContents(web_contents);
+}
+
+ManagedModeWarningInfobarDelegate::ManagedModeWarningInfobarDelegate(
+ InfoBarTabHelper* infobar_tab_helper)
+ : ConfirmInfoBarDelegate(infobar_tab_helper) {}
+
+ManagedModeWarningInfobarDelegate::~ManagedModeWarningInfobarDelegate() {}
+
+string16 ManagedModeWarningInfobarDelegate::GetMessageText() const {
+ return l10n_util::GetStringUTF16(IDS_MANAGED_MODE_WARNING_MESSAGE);
+}
+
+int ManagedModeWarningInfobarDelegate::GetButtons() const {
+ return BUTTON_OK;
+}
+
+string16 ManagedModeWarningInfobarDelegate::GetButtonLabel(
+ InfoBarButton button) const {
+ DCHECK_EQ(BUTTON_OK, button);
+ return l10n_util::GetStringUTF16(IDS_MANAGED_MODE_GO_BACK_ACTION);
+}
+
+bool ManagedModeWarningInfobarDelegate::Accept() {
+ GoBackToSafety(owner()->GetWebContents());
+
+ return false;
+}
+
+bool ManagedModeWarningInfobarDelegate::Cancel() {
+ NOTREACHED();
+ return false;
+}
+
+bool ManagedModeWarningInfobarDelegate::ShouldExpire(
+ const content::LoadCommittedDetails& details) const {
+ // ManagedModeNavigationObserver removes us below.
+ return false;
+}
+
+void ManagedModeWarningInfobarDelegate::InfoBarDismissed() {
+ ManagedModeNavigationObserver* observer =
+ ManagedModeNavigationObserver::FromWebContents(owner()->GetWebContents());
+ observer->WarnInfobarDismissed();
+}
+
+} // namespace
+
+DEFINE_WEB_CONTENTS_USER_DATA_KEY(ManagedModeNavigationObserver)
+
+ManagedModeNavigationObserver::~ManagedModeNavigationObserver() {}
+
+ManagedModeNavigationObserver::ManagedModeNavigationObserver(
+ content::WebContents* web_contents)
+ : WebContentsObserver(web_contents),
+ url_filter_(ManagedMode::GetURLFilterForUIThread()),
+ warn_infobar_delegate_(NULL) {}
+
+void ManagedModeNavigationObserver::WarnInfobarDismissed() {
+ DCHECK(warn_infobar_delegate_);
+ warn_infobar_delegate_ = NULL;
+}
+
+void ManagedModeNavigationObserver::DidCommitProvisionalLoadForFrame(
+ int64 frame_id,
+ bool is_main_frame,
+ const GURL& url,
+ content::PageTransition transition_type,
+ content::RenderViewHost* render_view_host) {
+ if (!is_main_frame)
+ return;
+
+ ManagedModeURLFilter::FilteringBehavior behavior =
+ url_filter_->GetFilteringBehaviorForURL(url);
+
+ if (behavior == ManagedModeURLFilter::WARN) {
+ if (!warn_infobar_delegate_) {
+ InfoBarTabHelper* infobar_tab_helper =
+ InfoBarTabHelper::FromWebContents(web_contents());
+ warn_infobar_delegate_ =
+ new ManagedModeWarningInfobarDelegate(infobar_tab_helper);
+ infobar_tab_helper->AddInfoBar(warn_infobar_delegate_);
+ }
+ } else {
+ if (warn_infobar_delegate_) {
+ InfoBarTabHelper* infobar_tab_helper =
+ InfoBarTabHelper::FromWebContents(web_contents());
+ infobar_tab_helper->RemoveInfoBar(warn_infobar_delegate_);
+ warn_infobar_delegate_= NULL;
+ }
+ }
+
+}
diff --git a/chrome/browser/managed_mode/managed_mode_navigation_observer.h b/chrome/browser/managed_mode/managed_mode_navigation_observer.h
new file mode 100644
index 0000000..3f84381
--- /dev/null
+++ b/chrome/browser/managed_mode/managed_mode_navigation_observer.h
@@ -0,0 +1,44 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_MANAGED_MODE_MANAGED_MODE_NAVIGATION_OBSERVER_H_
+#define CHROME_BROWSER_MANAGED_MODE_MANAGED_MODE_NAVIGATION_OBSERVER_H_
+
+#include "content/public/browser/web_contents_observer.h"
+#include "content/public/browser/web_contents_user_data.h"
+
+class InfoBarDelegate;
+class ManagedModeURLFilter;
+
+class ManagedModeNavigationObserver
+ : public content::WebContentsObserver,
+ public content::WebContentsUserData<ManagedModeNavigationObserver> {
+ public:
+ virtual ~ManagedModeNavigationObserver();
+
+ void WarnInfobarDismissed();
+
+ private:
+ friend class content::WebContentsUserData<ManagedModeNavigationObserver>;
+
+ explicit ManagedModeNavigationObserver(content::WebContents* web_contents);
+
+ // content::WebContentsObserver implementation.
+ virtual void DidCommitProvisionalLoadForFrame(
+ int64 frame_id,
+ bool is_main_frame,
+ const GURL& url,
+ content::PageTransition transition_type,
+ content::RenderViewHost* render_view_host) OVERRIDE;
+
+ // Owned by ManagedMode (which is a singleton and outlives us).
+ const ManagedModeURLFilter* url_filter_;
+
+ // Owned by the InfoBarTabHelper, which has the same lifetime as this object.
+ InfoBarDelegate* warn_infobar_delegate_;
+
+ DISALLOW_COPY_AND_ASSIGN(ManagedModeNavigationObserver);
+};
+
+#endif // CHROME_BROWSER_MANAGED_MODE_MANAGED_MODE_NAVIGATION_OBSERVER_H_
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index e476069..76f5e25 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -144,10 +144,13 @@ enum MigratedPreferences {
namespace chrome {
void RegisterLocalState(PrefService* local_state) {
- // Prefs in Local State
+ // Prefs in Local State.
local_state->RegisterIntegerPref(prefs::kMultipleProfilePrefMigration, 0);
+ // Please keep this list alphabetized.
browser_shutdown::RegisterPrefs(local_state);
+ chrome::RegisterScreenshotPrefs(local_state);
+ chrome_variations::VariationsService::RegisterPrefs(local_state);
ExternalProtocolHandler::RegisterPrefs(local_state);
geolocation::RegisterPrefs(local_state);
IntranetRedirectDetector::RegisterPrefs(local_state);
@@ -158,11 +161,10 @@ void RegisterLocalState(PrefService* local_state) {
PrefProxyConfigTrackerImpl::RegisterPrefs(local_state);
ProfileInfoCache::RegisterPrefs(local_state);
ProfileManager::RegisterPrefs(local_state);
+ PromoResourceService::RegisterPrefs(local_state);
SigninManagerFactory::RegisterPrefs(local_state);
SSLConfigServiceManager::RegisterPrefs(local_state);
- chrome_variations::VariationsService::RegisterPrefs(local_state);
WebCacheManager::RegisterPrefs(local_state);
- chrome::RegisterScreenshotPrefs(local_state);
#if defined(ENABLE_PLUGIN_INSTALLATION)
PluginsResourceService::RegisterPrefs(local_state);
@@ -186,7 +188,6 @@ void RegisterLocalState(PrefService* local_state) {
RegisterTabStripLayoutTypePrefs(local_state);
#endif
- PromoResourceService::RegisterPrefs(local_state);
#if !defined(OS_ANDROID)
BackgroundModeManager::RegisterPrefs(local_state);
RegisterBrowserPrefs(local_state);
@@ -217,11 +218,12 @@ void RegisterLocalState(PrefService* local_state) {
}
void RegisterUserPrefs(PrefService* user_prefs) {
- // User prefs
+ // User prefs. Please keep this list alphabetized.
AlternateErrorPageTabObserver::RegisterUserPrefs(user_prefs);
AutofillManager::RegisterUserPrefs(user_prefs);
BookmarkPromptPrefs::RegisterUserPrefs(user_prefs);
bookmark_utils::RegisterUserPrefs(user_prefs);
+ BrowserInstantController::RegisterUserPrefs(user_prefs);
ChromeContentBrowserClient::RegisterUserPrefs(user_prefs);
ChromeVersionService::RegisterUserPrefs(user_prefs);
chrome_browser_net::HttpServerPropertiesManager::RegisterPrefs(user_prefs);
@@ -234,7 +236,7 @@ void RegisterUserPrefs(PrefService* user_prefs) {
GAIAInfoUpdateService::RegisterUserPrefs(user_prefs);
HostContentSettingsMap::RegisterUserPrefs(user_prefs);
IncognitoModePrefs::RegisterUserPrefs(user_prefs);
- BrowserInstantController::RegisterUserPrefs(user_prefs);
+ InstantUI::RegisterUserPrefs(user_prefs);
MediaCaptureDevicesDispatcher::RegisterUserPrefs(user_prefs);
NetPrefObserver::RegisterPrefs(user_prefs);
NewTabUI::RegisterUserPrefs(user_prefs);
@@ -248,7 +250,6 @@ void RegisterUserPrefs(PrefService* user_prefs) {
SessionStartupPref::RegisterUserPrefs(user_prefs);
TemplateURLPrepopulateData::RegisterUserPrefs(user_prefs);
TranslatePrefs::RegisterUserPrefs(user_prefs);
- InstantUI::RegisterUserPrefs(user_prefs);
#if defined(ENABLE_CONFIGURATION_POLICY)
policy::URLBlacklistManager::RegisterPrefs(user_prefs);
@@ -276,15 +277,16 @@ void RegisterUserPrefs(PrefService* user_prefs) {
#if !defined(OS_ANDROID)
CaptureVisibleTabFunction::RegisterUserPrefs(user_prefs);
ChromeToMobileService::RegisterUserPrefs(user_prefs);
+ DevToolsWindow::RegisterUserPrefs(user_prefs);
extensions::CommandService::RegisterUserPrefs(user_prefs);
ExtensionSettingsHandler::RegisterUserPrefs(user_prefs);
- RegisterAutolaunchPrefs(user_prefs);
- DevToolsWindow::RegisterUserPrefs(user_prefs);
+ ManagedMode::RegisterUserPrefs(user_prefs);
PepperFlashSettingsManager::RegisterUserPrefs(user_prefs);
PinnedTabCodec::RegisterUserPrefs(user_prefs);
PluginsUI::RegisterUserPrefs(user_prefs);
- SyncPromoUI::RegisterUserPrefs(user_prefs);
printing::StickySettings::RegisterUserPrefs(user_prefs);
+ RegisterAutolaunchPrefs(user_prefs);
+ SyncPromoUI::RegisterUserPrefs(user_prefs);
#endif
#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 4308e3b..455bdb2 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -990,6 +990,8 @@
'browser/mac/security_wrappers.h',
'browser/managed_mode/managed_mode.cc',
'browser/managed_mode/managed_mode.h',
+ 'browser/managed_mode/managed_mode_navigation_observer.cc',
+ 'browser/managed_mode/managed_mode_navigation_observer.h',
'browser/managed_mode/managed_mode_site_list.cc',
'browser/managed_mode/managed_mode_site_list.h',
'browser/managed_mode/managed_mode_url_filter.cc',
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index cdc5d44..55bf1c9 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -1111,6 +1111,14 @@ const char kPrintingEnabled[] = "printing.enabled";
// Boolean controlling whether print preview is disabled.
const char kPrintPreviewDisabled[] = "printing.print_preview_disabled";
+// An integer pref specifying the fallback behavior for sites outside of content
+// packs. One of:
+// 0: Allow (does nothing)
+// 1: Warn.
+// 2: Block.
+const char kDefaultManagedModeFilteringBehavior[] =
+ "profile.managed.default_filtering_behavior";
+
// *************** LOCAL STATE ***************
// These are attached to the machine/installation
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index dfba0e5..7a2c435 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -390,6 +390,8 @@ extern const char kInvertNotificationShown[];
extern const char kPrintingEnabled[];
extern const char kPrintPreviewDisabled[];
+extern const char kDefaultManagedModeFilteringBehavior[];
+
// Local state prefs. Please add Profile prefs above instead.
extern const char kCertRevocationCheckingEnabled[];
extern const char kSSLVersionMin[];