| Index: chrome/browser/managed_mode.cc
|
| diff --git a/chrome/browser/managed_mode.cc b/chrome/browser/managed_mode.cc
|
| index 6177d85cd93475ed5378ede92c852265473ccbb2..1053872e71aa94dd65298b60b232b520baefafa5 100644
|
| --- a/chrome/browser/managed_mode.cc
|
| +++ b/chrome/browser/managed_mode.cc
|
| @@ -6,24 +6,61 @@
|
|
|
| #include "base/command_line.h"
|
| #include "chrome/browser/browser_process.h"
|
| +#include "chrome/browser/extensions/extension_service.h"
|
| #include "chrome/browser/extensions/extension_system.h"
|
| +#include "chrome/browser/managed_mode_url_filter.h"
|
| #include "chrome/browser/prefs/pref_service.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| -#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h"
|
| -#include "chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.h"
|
| #include "chrome/browser/ui/browser.h"
|
| #include "chrome/browser/ui/browser_list.h"
|
| #include "chrome/browser/ui/browser_window.h"
|
| #include "chrome/common/chrome_notification_types.h"
|
| #include "chrome/common/chrome_switches.h"
|
| #include "chrome/common/pref_names.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/notification_service.h"
|
| #include "grit/generated_resources.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
|
|
| +using content::BrowserThread;
|
| +
|
| +// A bridge from ManagedMode (which lives on the UI thread) to
|
| +// ManagedModeURLFilter (which lives on the IO thread).
|
| +class ManagedMode::URLFilterContext {
|
| + public:
|
| + URLFilterContext() {}
|
| + ~URLFilterContext() {}
|
| +
|
| + const ManagedModeURLFilter* url_filter() const {
|
| + return &url_filter_;
|
| + }
|
| +
|
| + void SetActive(bool in_managed_mode) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + // Because ManagedMode is a singleton, we can pass the pointer to
|
| + // |url_filter_| unretained.
|
| + BrowserThread::PostTask(BrowserThread::IO,
|
| + FROM_HERE,
|
| + base::Bind(
|
| + &ManagedModeURLFilter::SetActive,
|
| + base::Unretained(&url_filter_),
|
| + in_managed_mode));
|
| + }
|
| +
|
| + void ShutdownOnUIThread() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + BrowserThread::DeleteSoon(BrowserThread::IO, FROM_HERE, this);
|
| + }
|
| +
|
| + private:
|
| + ManagedModeURLFilter url_filter_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(URLFilterContext);
|
| +};
|
| +
|
| // static
|
| ManagedMode* ManagedMode::GetInstance() {
|
| - return Singleton<ManagedMode>::get();
|
| + return Singleton<ManagedMode, LeakySingletonTraits<ManagedMode> >::get();
|
| }
|
|
|
| // static
|
| @@ -133,6 +170,16 @@ void ManagedMode::LeaveManagedModeImpl() {
|
| SetInManagedMode(NULL);
|
| }
|
|
|
| +// static
|
| +const ManagedModeURLFilter* ManagedMode::GetURLFilter() {
|
| + return GetInstance()->GetURLFilterImpl();
|
| +}
|
| +
|
| +const ManagedModeURLFilter* ManagedMode::GetURLFilterImpl() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
|
| + return url_filter_context_->url_filter();
|
| +}
|
| +
|
| std::string ManagedMode::GetDebugPolicyProviderName() const {
|
| // Save the string space in official builds.
|
| #ifdef NDEBUG
|
| @@ -188,14 +235,18 @@ void ManagedMode::OnBrowserRemoved(Browser* browser) {
|
| FinalizeEnter(true);
|
| }
|
|
|
| -ManagedMode::ManagedMode() : managed_profile_(NULL) {
|
| +ManagedMode::ManagedMode() : managed_profile_(NULL),
|
| + url_filter_context_(new URLFilterContext) {
|
| BrowserList::AddObserver(this);
|
| }
|
|
|
| ManagedMode::~ManagedMode() {
|
| + // This class usually is a leaky singleton, so this destructor shouldn't be
|
| + // called. We still do some cleanup, in case we're owned by a unit test.
|
| BrowserList::RemoveObserver(this);
|
| DCHECK_EQ(0u, callbacks_.size());
|
| DCHECK_EQ(0u, browsers_to_close_.size());
|
| + url_filter_context_.release()->ShutdownOnUIThread();
|
| }
|
|
|
| void ManagedMode::Observe(int type,
|
| @@ -216,10 +267,14 @@ void ManagedMode::Observe(int type,
|
| FinalizeEnter(false);
|
| return;
|
| }
|
| - default: {
|
| - NOTREACHED();
|
| + case chrome::NOTIFICATION_EXTENSION_LOADED:
|
| + case chrome::NOTIFICATION_EXTENSION_UNLOADED: {
|
| + if (managed_profile_)
|
| + UpdateWhitelist();
|
| break;
|
| }
|
| + default:
|
| + NOTREACHED();
|
| }
|
| }
|
|
|
| @@ -249,17 +304,30 @@ void ManagedMode::SetInManagedMode(Profile* newly_managed_profile) {
|
| // Register the ManagementPolicy::Provider before changing the pref when
|
| // setting it, and unregister it after changing the pref when clearing it,
|
| // so pref observers see the correct ManagedMode state.
|
| - if (newly_managed_profile) {
|
| + bool in_managed_mode = !!newly_managed_profile;
|
| + if (in_managed_mode) {
|
| DCHECK(!managed_profile_ || managed_profile_ == newly_managed_profile);
|
| extensions::ExtensionSystem::Get(
|
| newly_managed_profile)->management_policy()->RegisterProvider(this);
|
| - g_browser_process->local_state()->SetBoolean(prefs::kInManagedMode, true);
|
| + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
|
| + content::Source<Profile>(newly_managed_profile));
|
| + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
|
| + content::Source<Profile>(newly_managed_profile));
|
| } else {
|
| extensions::ExtensionSystem::Get(
|
| managed_profile_)->management_policy()->UnregisterProvider(this);
|
| - g_browser_process->local_state()->SetBoolean(prefs::kInManagedMode, false);
|
| + registrar_.Remove(this, chrome::NOTIFICATION_EXTENSION_LOADED,
|
| + content::Source<Profile>(managed_profile_));
|
| + registrar_.Remove(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
|
| + content::Source<Profile>(managed_profile_));
|
| }
|
| +
|
| managed_profile_ = newly_managed_profile;
|
| + url_filter_context_->SetActive(in_managed_mode);
|
| + g_browser_process->local_state()->SetBoolean(prefs::kInManagedMode,
|
| + in_managed_mode);
|
| + if (in_managed_mode)
|
| + UpdateWhitelist();
|
|
|
| // This causes the avatar and the profile menu to get updated.
|
| content::NotificationService::current()->Notify(
|
| @@ -267,3 +335,8 @@ void ManagedMode::SetInManagedMode(Profile* newly_managed_profile) {
|
| content::NotificationService::AllBrowserContextsAndSources(),
|
| content::NotificationService::NoDetails());
|
| }
|
| +
|
| +void ManagedMode::UpdateWhitelist() {
|
| + DCHECK(managed_profile_);
|
| + // TODO(bauerb): Update URL filter with whitelist.
|
| +}
|
|
|