diff options
author | bauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-26 17:17:55 +0000 |
---|---|---|
committer | bauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-26 17:17:55 +0000 |
commit | 2a5f296376b0baa8bae3618f3fba73362c818c54 (patch) | |
tree | fd2dc020c3a6ec3b620f055cc4eb8c9da73133e8 | |
parent | 9fe4eea2d85c2aa7c36d420f7738be7a6dbc1f61 (diff) | |
download | chromium_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.grd | 7 | ||||
-rw-r--r-- | chrome/browser/managed_mode/managed_mode.cc | 35 | ||||
-rw-r--r-- | chrome/browser/managed_mode/managed_mode.h | 5 | ||||
-rw-r--r-- | chrome/browser/managed_mode/managed_mode_navigation_observer.cc | 157 | ||||
-rw-r--r-- | chrome/browser/managed_mode/managed_mode_navigation_observer.h | 44 | ||||
-rw-r--r-- | chrome/browser/prefs/browser_prefs.cc | 22 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 | ||||
-rw-r--r-- | chrome/common/pref_names.cc | 8 | ||||
-rw-r--r-- | chrome/common/pref_names.h | 2 |
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[]; |