diff options
19 files changed, 164 insertions, 31 deletions
diff --git a/chrome/app/nibs/Preferences.xib b/chrome/app/nibs/Preferences.xib index b0e9a81..0e570ba 100644 --- a/chrome/app/nibs/Preferences.xib +++ b/chrome/app/nibs/Preferences.xib @@ -2574,19 +2574,15 @@ AAMAAAABAAEAAAFTAAMAAAAEAAAFwgAAAAAACAAIAAgACAABAAEAAQABA</bytes> </object> <object class="IBConnectionRecord"> <object class="IBBindingConnection" key="connection"> - <string key="label">enabled: isDefaultBrowser</string> + <string key="label">enabled: canChangeDefaultBrowser</string> <reference key="source" ref="192681043"/> <reference key="destination" ref="1001"/> <object class="NSNibBindingConnector" key="connector"> <reference key="NSSource" ref="192681043"/> <reference key="NSDestination" ref="1001"/> - <string key="NSLabel">enabled: isDefaultBrowser</string> + <string key="NSLabel">enabled: canChangeDefaultBrowser</string> <string key="NSBinding">enabled</string> - <string key="NSKeyPath">isDefaultBrowser</string> - <object class="NSDictionary" key="NSOptions"> - <string key="NS.key.0">NSValueTransformerName</string> - <string key="NS.object.0">NSNegateBoolean</string> - </object> + <string key="NSKeyPath">canChangeDefaultBrowser</string> <int key="NSNibBindingConnectorVersion">2</int> </object> </object> diff --git a/chrome/app/policy/policy_templates.json b/chrome/app/policy/policy_templates.json index c1165de..f93a4f4 100644 --- a/chrome/app/policy/policy_templates.json +++ b/chrome/app/policy/policy_templates.json @@ -129,6 +129,22 @@ ], }, { + 'name': 'DefaultBrowserSettingEnabled', + 'type': 'main', + 'supported_on': ['chrome.*:11-'], + 'features': {'dynamic_refresh': 1}, + 'example_value': True, + 'caption': '''Set Chrome as Default Browser''', + 'desc': '''Configures the default browser checks in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> and prevents users from changing them. + + If you enable this setting, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> will always check on startup whether it is the default browser and automatically register itself if possible. + + If this setting is disabled, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> will never check if it is the default browser and will disable user controls for setting this option. + + If this setting is not set, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> will allow the user to control whether it is the default browser and whether user notifications should be shown when it isn't.''', + 'label': '''Set Chrome as Default Browser''', + }, + { 'name': 'ApplicationLocaleValue', 'type': 'string', 'supported_on': ['chrome.win:8-'], diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc index 849ac7d..90ea85c 100644 --- a/chrome/browser/browser_process_impl.cc +++ b/chrome/browser/browser_process_impl.cc @@ -48,6 +48,7 @@ #include "chrome/browser/renderer_host/resource_dispatcher_host.h" #include "chrome/browser/safe_browsing/client_side_detection_service.h" #include "chrome/browser/safe_browsing/safe_browsing_service.h" +#include "chrome/browser/shell_integration.h" #include "chrome/browser/sidebar/sidebar_manager.h" #include "chrome/browser/tab_closeable_state_watcher.h" #include "chrome/common/chrome_constants.h" @@ -566,6 +567,12 @@ void BrowserProcessImpl::Observe(NotificationType type, plugin_data_remover_->StartRemoving(base::Time()); } } + } else if (type == NotificationType::PREF_CHANGED) { + std::string* pref = Details<std::string>(details).ptr(); + if (*pref == prefs::kDefaultBrowserSettingEnabled) { + if (local_state_->GetBoolean(prefs::kDefaultBrowserSettingEnabled)) + ShellIntegration::SetAsDefaultBrowser(); + } } else { NOTREACHED(); } @@ -742,6 +749,15 @@ void BrowserProcessImpl::CreateLocalState() { print_job_manager_->set_printing_enabled(printing_enabled); pref_change_registrar_.Add(prefs::kPrintingEnabled, print_job_manager_.get()); + + // Initialize the notification for the default browser setting policy. + local_state_->RegisterBooleanPref(prefs::kDefaultBrowserSettingEnabled, + false); + if (local_state_->IsManagedPreference(prefs::kDefaultBrowserSettingEnabled)) { + if (local_state_->GetBoolean(prefs::kDefaultBrowserSettingEnabled)) + ShellIntegration::SetAsDefaultBrowser(); + } + pref_change_registrar_.Add(prefs::kDefaultBrowserSettingEnabled, this); } void BrowserProcessImpl::CreateIconManager() { diff --git a/chrome/browser/dom_ui/options/browser_options_handler.cc b/chrome/browser/dom_ui/options/browser_options_handler.cc index cb14dd5..bb8a1e4 100644 --- a/chrome/browser/dom_ui/options/browser_options_handler.cc +++ b/chrome/browser/dom_ui/options/browser_options_handler.cc @@ -10,6 +10,7 @@ #include "base/string_number_conversions.h" #include "base/utf_string_conversions.h" #include "base/values.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/browser_thread.h" #include "chrome/browser/custom_home_pages_table_model.h" #include "chrome/browser/dom_ui/dom_ui_favicon_source.h" @@ -133,6 +134,9 @@ void BrowserOptionsHandler::Initialize() { make_scoped_refptr(new DOMUIFavIconSource(profile)))); homepage_.Init(prefs::kHomePage, profile->GetPrefs(), NULL); + default_browser_policy_.Init(prefs::kDefaultBrowserSettingEnabled, + g_browser_process->local_state(), + this); UpdateDefaultBrowserState(); UpdateStartupPages(); UpdateSearchEngines(); @@ -187,6 +191,11 @@ void BrowserOptionsHandler::UpdateDefaultBrowserState() { } void BrowserOptionsHandler::BecomeDefaultBrowser(const ListValue* args) { + // If the default browser setting is managed then we should not be able to + // call this function. + if (default_browser_policy_.IsManaged()) + return; + UserMetricsRecordAction(UserMetricsAction("Options_SetAsDefaultBrowser")); #if defined(OS_MACOSX) if (ShellIntegration::SetAsDefaultBrowser()) @@ -230,8 +239,9 @@ void BrowserOptionsHandler::SetDefaultBrowserUIString(int status_string_id) { status_string_id == IDS_OPTIONS_DEFAULTBROWSER_DEFAULT)); scoped_ptr<Value> can_be_default(Value::CreateBooleanValue( - status_string_id == IDS_OPTIONS_DEFAULTBROWSER_DEFAULT || - status_string_id == IDS_OPTIONS_DEFAULTBROWSER_NOTDEFAULT)); + !default_browser_policy_.IsManaged() && + (status_string_id == IDS_OPTIONS_DEFAULTBROWSER_DEFAULT || + status_string_id == IDS_OPTIONS_DEFAULTBROWSER_NOTDEFAULT))); dom_ui_->CallJavascriptFunction( L"BrowserOptions.updateDefaultBrowserState", @@ -333,6 +343,12 @@ void BrowserOptionsHandler::OnItemsRemoved(int start, int length) { OnModelChanged(); } +void BrowserOptionsHandler::Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) { + UpdateDefaultBrowserState(); +} + void BrowserOptionsHandler::SetStartupPagesToCurrentPages( const ListValue* args) { startup_custom_pages_table_model_->SetToCurrentlyOpenPages(); diff --git a/chrome/browser/dom_ui/options/browser_options_handler.h b/chrome/browser/dom_ui/options/browser_options_handler.h index e15ef31..bf753b8 100644 --- a/chrome/browser/dom_ui/options/browser_options_handler.h +++ b/chrome/browser/dom_ui/options/browser_options_handler.h @@ -46,6 +46,11 @@ class BrowserOptionsHandler : public OptionsPageUIHandler, virtual void OnItemsRemoved(int start, int length); private: + // NotificationObserver implementation. + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details); + // Sets the home page to the given string. Called from DOMUI. void SetHomePage(const ListValue* args); @@ -91,6 +96,7 @@ class BrowserOptionsHandler : public OptionsPageUIHandler, scoped_refptr<ShellIntegration::DefaultBrowserWorker> default_browser_worker_; StringPrefMember homepage_; + BooleanPrefMember default_browser_policy_; TemplateURLModel* template_url_model_; // Weak. diff --git a/chrome/browser/first_run/first_run.cc b/chrome/browser/first_run/first_run.cc index 4235a8a..5b7033e 100644 --- a/chrome/browser/first_run/first_run.cc +++ b/chrome/browser/first_run/first_run.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 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. @@ -301,10 +301,20 @@ bool FirstRun::ProcessMasterPreferences(const FilePath& user_data_dir, } #endif - if (prefs.GetBool( - installer::master_preferences::kMakeChromeDefaultForUser, - &value) && value) { - ShellIntegration::SetAsDefaultBrowser(); + // Even on the first run we only allow for the user choice to take effect if + // no policy has been set by the admin. + if (!g_browser_process->local_state()->IsManagedPreference( + prefs::kDefaultBrowserSettingEnabled)) { + if (prefs.GetBool( + installer::master_preferences::kMakeChromeDefaultForUser, + &value) && value) { + ShellIntegration::SetAsDefaultBrowser(); + } + } else { + if (g_browser_process->local_state()->GetBoolean( + prefs::kDefaultBrowserSettingEnabled)) { + ShellIntegration::SetAsDefaultBrowser(); + } } return false; diff --git a/chrome/browser/policy/configuration_policy_pref_store.cc b/chrome/browser/policy/configuration_policy_pref_store.cc index 851ae68..b19b3a1 100644 --- a/chrome/browser/policy/configuration_policy_pref_store.cc +++ b/chrome/browser/policy/configuration_policy_pref_store.cc @@ -227,6 +227,8 @@ const ConfigurationPolicyPrefKeeper::PolicyToPreferenceMapEntry prefs::kDisable3DAPIs }, { Value::TYPE_INTEGER, kPolicyPolicyRefreshRate, prefs::kPolicyRefreshRate }, + { Value::TYPE_BOOLEAN, kPolicyDefaultBrowserSettingEnabled, + prefs::kDefaultBrowserSettingEnabled }, #if defined(OS_CHROMEOS) { Value::TYPE_BOOLEAN, kPolicyChromeOsLockOnIdleSuspend, @@ -841,6 +843,8 @@ ConfigurationPolicyPrefStore::GetChromePolicyDefinitionList() { key::kDisable3DAPIs }, { kPolicyPolicyRefreshRate, Value::TYPE_INTEGER, key::kPolicyRefreshRate }, + { kPolicyDefaultBrowserSettingEnabled, Value::TYPE_BOOLEAN, + key::kDefaultBrowserSettingEnabled }, #if defined(OS_CHROMEOS) { kPolicyChromeOsLockOnIdleSuspend, Value::TYPE_BOOLEAN, diff --git a/chrome/browser/policy/managed_prefs_banner_base.cc b/chrome/browser/policy/managed_prefs_banner_base.cc index 826f453..2693054 100644 --- a/chrome/browser/policy/managed_prefs_banner_base.cc +++ b/chrome/browser/policy/managed_prefs_banner_base.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 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. @@ -67,6 +67,7 @@ void ManagedPrefsBannerBase::Init(PrefService* local_state, AddUserPref(prefs::kDefaultSearchProviderSuggestURL); AddUserPref(prefs::kDefaultSearchProviderIconURL); AddUserPref(prefs::kDefaultSearchProviderEncodings); + AddLocalStatePref(prefs::kDefaultBrowserSettingEnabled); break; case OPTIONS_PAGE_CONTENT: AddUserPref(prefs::kSyncManaged); diff --git a/chrome/browser/shell_integration.cc b/chrome/browser/shell_integration.cc index 9227c56..ad0106d 100644 --- a/chrome/browser/shell_integration.cc +++ b/chrome/browser/shell_integration.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 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. @@ -10,8 +10,10 @@ #include "base/string_util.h" #include "base/utf_string_conversions.h" #include "chrome/browser/browser_thread.h" +#include "chrome/browser/prefs/pref_service.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" +#include "chrome/common/pref_names.h" ShellIntegration::ShortcutInfo::ShortcutInfo() : create_on_desktop(false), diff --git a/chrome/browser/shell_integration.h b/chrome/browser/shell_integration.h index b9c6530..6caed57 100644 --- a/chrome/browser/shell_integration.h +++ b/chrome/browser/shell_integration.h @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 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. @@ -15,6 +15,7 @@ #include "third_party/skia/include/core/SkBitmap.h" class FilePath; +class PrefService; #if defined(USE_X11) namespace base { diff --git a/chrome/browser/ui/browser_init.cc b/chrome/browser/ui/browser_init.cc index be770c8..8df358f 100644 --- a/chrome/browser/ui/browser_init.cc +++ b/chrome/browser/ui/browser_init.cc @@ -1055,10 +1055,24 @@ void BrowserInit::LaunchWithProfile::CheckDefaultBrowser(Profile* profile) { // We do not check if we are the default browser if: // - the user said "don't ask me again" on the infobar earlier. // - this is the first launch after the first run flow. + // - There is a policy in control of this setting. if (!profile->GetPrefs()->GetBoolean(prefs::kCheckDefaultBrowser) || FirstRun::IsChromeFirstRun()) { return; } + if (g_browser_process->local_state()->IsManagedPreference( + prefs::kDefaultBrowserSettingEnabled)) { + if (g_browser_process->local_state()->GetBoolean( + prefs::kDefaultBrowserSettingEnabled)) { + BrowserThread::PostTask( + BrowserThread::FILE, FROM_HERE, NewRunnableFunction( + &ShellIntegration::SetAsDefaultBrowser)); + } else { + // TODO(pastarmovj): We can't really do anything meaningful here yet but + // just prevent showing the infobar. + } + return; + } BrowserThread::PostTask( BrowserThread::FILE, FROM_HERE, new CheckDefaultBrowserTask()); } diff --git a/chrome/browser/ui/cocoa/options/preferences_window_controller.h b/chrome/browser/ui/cocoa/options/preferences_window_controller.h index 494ac79..3815beb 100644 --- a/chrome/browser/ui/cocoa/options/preferences_window_controller.h +++ b/chrome/browser/ui/cocoa/options/preferences_window_controller.h @@ -92,6 +92,7 @@ class ProfileSyncService; BooleanPrefMember instantEnabled_; IBOutlet NSButton* instantCheckbox_; scoped_nsobject<SearchEngineListModel> searchEngineModel_; + BooleanPrefMember default_browser_policy_; // Used when creating a new home page url to make the new cell editable. BOOL pendingSelectForEdit_; BOOL restoreButtonsEnabled_; diff --git a/chrome/browser/ui/cocoa/options/preferences_window_controller.mm b/chrome/browser/ui/cocoa/options/preferences_window_controller.mm index d106d4b..e5332b6 100644 --- a/chrome/browser/ui/cocoa/options/preferences_window_controller.mm +++ b/chrome/browser/ui/cocoa/options/preferences_window_controller.mm @@ -406,6 +406,7 @@ CGFloat AutoSizeUnderTheHoodContent(NSView* view, // KVC getter methods. - (BOOL)fileHandlerUIEnabled; +- (BOOL)canChangeDefaultBrowser; @end namespace PreferencesWindowControllerInternal { @@ -831,6 +832,13 @@ class ManagedPrefsBannerState : public policy::ManagedPrefsBannerBase { - (void)registerPrefObservers { if (!prefs_) return; + // During unit tests, there is no local state object, so we fall back to + // the prefs object (where we've explicitly registered this pref so we + // know it's there). + PrefService* local = g_browser_process->local_state(); + if (!local) + local = prefs_; + // Basics panel registrar_.Init(prefs_); registrar_.Add(prefs::kURLsToRestoreOnStartup, observer_.get()); @@ -840,6 +848,8 @@ class ManagedPrefsBannerState : public policy::ManagedPrefsBannerBase { homepage_.Init(prefs::kHomePage, prefs_, observer_.get()); showHomeButton_.Init(prefs::kShowHomeButton, prefs_, observer_.get()); instantEnabled_.Init(prefs::kInstantEnabled, prefs_, observer_.get()); + default_browser_policy_.Init(prefs::kDefaultBrowserSettingEnabled, + local, observer_.get()); // Personal Stuff panel askSavePasswords_.Init(prefs::kPasswordManagerEnabled, @@ -858,12 +868,6 @@ class ManagedPrefsBannerState : public policy::ManagedPrefsBannerBase { translateEnabled_.Init(prefs::kEnableTranslate, prefs_, observer_.get()); tabsToLinks_.Init(prefs::kWebkitTabsToLinks, prefs_, observer_.get()); - // During unit tests, there is no local state object, so we fall back to - // the prefs object (where we've explicitly registered this pref so we - // know it's there). - PrefService* local = g_browser_process->local_state(); - if (!local) - local = prefs_; metricsReporting_.Init(prefs::kMetricsReportingEnabled, local, observer_.get()); defaultDownloadLocation_.Init(prefs::kDownloadDefaultDirectory, prefs_, @@ -911,7 +915,7 @@ class ManagedPrefsBannerState : public policy::ManagedPrefsBannerBase { paths = [paths setByAddingObject:@"homepageURL"]; } else if ([key isEqualToString:@"hompageURL"]) { paths = [paths setByAddingObject:@"newTabPageIsHomePageIndex"]; - } else if ([key isEqualToString:@"isDefaultBrowser"]) { + } else if ([key isEqualToString:@"canChangeDefaultBrowser"]) { paths = [paths setByAddingObject:@"defaultBrowser"]; } else if ([key isEqualToString:@"defaultBrowserTextColor"]) { paths = [paths setByAddingObject:@"defaultBrowser"]; @@ -978,6 +982,9 @@ class ManagedPrefsBannerState : public policy::ManagedPrefsBannerBase { [self setShowHomeButtonEnabled:!showHomeButton_.IsManaged()]; } else if (*prefName == prefs::kInstantEnabled) { [self configureInstant]; + } else if (*prefName == prefs::kDefaultBrowserSettingEnabled) { + [self willChangeValueForKey:@"defaultBrowser"]; + [self didChangeValueForKey:@"defaultBrowser"]; } } @@ -1264,15 +1271,19 @@ enum { kHomepageNewTabPage, kHomepageURL }; [self didChangeValueForKey:@"defaultBrowser"]; } -// Returns the Chromium default browser state. -- (ShellIntegration::DefaultBrowserState)isDefaultBrowser { - return ShellIntegration::IsDefaultBrowser(); +// Returns the Chromium default browser state and whether this is user +// controlled or locked by a policy. +- (BOOL)canChangeDefaultBrowser { + return !default_browser_policy_.IsManaged() && + ShellIntegration::IsDefaultBrowser() != + ShellIntegration::IS_DEFAULT_BROWSER; } // Returns the text color of the "chromium is your default browser" text (green // for yes, red for no). - (NSColor*)defaultBrowserTextColor { - ShellIntegration::DefaultBrowserState state = [self isDefaultBrowser]; + ShellIntegration::DefaultBrowserState state = + ShellIntegration::IsDefaultBrowser(); return (state == ShellIntegration::IS_DEFAULT_BROWSER) ? [NSColor colorWithCalibratedRed:0.0 green:135.0/255.0 blue:0 alpha:1.0] : [NSColor colorWithCalibratedRed:135.0/255.0 green:0 blue:0 alpha:1.0]; @@ -1281,7 +1292,8 @@ enum { kHomepageNewTabPage, kHomepageURL }; // Returns the text for the "chromium is your default browser" string dependent // on if Chromium actually is or not. - (NSString*)defaultBrowserText { - ShellIntegration::DefaultBrowserState state = [self isDefaultBrowser]; + ShellIntegration::DefaultBrowserState state = + ShellIntegration::IsDefaultBrowser(); int stringId; if (state == ShellIntegration::IS_DEFAULT_BROWSER) stringId = IDS_OPTIONS_DEFAULTBROWSER_DEFAULT; diff --git a/chrome/browser/ui/gtk/options/general_page_gtk.cc b/chrome/browser/ui/gtk/options/general_page_gtk.cc index a398850..0f552ff 100644 --- a/chrome/browser/ui/gtk/options/general_page_gtk.cc +++ b/chrome/browser/ui/gtk/options/general_page_gtk.cc @@ -10,6 +10,7 @@ #include "base/callback.h" #include "base/command_line.h" #include "base/utf_string_conversions.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/custom_home_pages_table_model.h" #include "chrome/browser/instant/instant_confirm_dialog.h" #include "chrome/browser/instant/instant_controller.h" @@ -108,6 +109,10 @@ GeneralPageGtk::GeneralPageGtk(Profile* profile) homepage_.Init(prefs::kHomePage, profile->GetPrefs(), this); show_home_button_.Init(prefs::kShowHomeButton, profile->GetPrefs(), this); + default_browser_policy_.Init(prefs::kDefaultBrowserSettingEnabled, + g_browser_process->local_state(), + this); + instant_.Init(prefs::kInstantEnabled, profile->GetPrefs(), this); // Load initial values @@ -203,6 +208,15 @@ void GeneralPageGtk::NotifyPrefChanged(const std::string* pref_name) { GTK_TOGGLE_BUTTON(instant_checkbox_), instant_.GetValue()); } + if (!pref_name || *pref_name == prefs::kDefaultBrowserSettingEnabled) { + // If the option is managed the UI is uncondionally disabled otherwise we + // restart the standard button enabling logic. + if (default_browser_policy_.IsManaged()) + gtk_widget_set_sensitive(default_browser_use_as_default_button_, false); + else + default_browser_worker_->StartCheckDefaultBrowser(); + } + initializing_ = false; } @@ -788,7 +802,8 @@ void GeneralPageGtk::SetDefaultBrowserUIState( } gtk_widget_set_sensitive(default_browser_use_as_default_button_, - state == ShellIntegration::STATE_NOT_DEFAULT); + state == ShellIntegration::STATE_NOT_DEFAULT && + !default_browser_policy_.IsManaged()); } void GeneralPageGtk::OnInstantLabelSizeAllocate(GtkWidget* sender, diff --git a/chrome/browser/ui/gtk/options/general_page_gtk.h b/chrome/browser/ui/gtk/options/general_page_gtk.h index 9e41e50..0584486 100644 --- a/chrome/browser/ui/gtk/options/general_page_gtk.h +++ b/chrome/browser/ui/gtk/options/general_page_gtk.h @@ -151,6 +151,7 @@ class GeneralPageGtk : public OptionsPageBase, // Widgets of the default browser group GtkWidget* default_browser_status_label_; GtkWidget* default_browser_use_as_default_button_; + BooleanPrefMember default_browser_policy_; // The parent GtkTable widget GtkWidget* page_; diff --git a/chrome/browser/ui/views/options/general_page_view.cc b/chrome/browser/ui/views/options/general_page_view.cc index 43664e4..71f9b3b 100644 --- a/chrome/browser/ui/views/options/general_page_view.cc +++ b/chrome/browser/ui/views/options/general_page_view.cc @@ -13,6 +13,7 @@ #include "base/string_util.h" #include "base/utf_string_conversions.h" #include "chrome/browser/browser_window.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/custom_home_pages_table_model.h" #include "chrome/browser/dom_ui/new_tab_ui.h" #include "chrome/browser/instant/instant_confirm_dialog.h" @@ -382,6 +383,9 @@ void GeneralPageView::InitControlLayout() { profile()->GetPrefs(), this); homepage_.Init(prefs::kHomePage, profile()->GetPrefs(), this); show_home_button_.Init(prefs::kShowHomeButton, profile()->GetPrefs(), this); + default_browser_policy_.Init(prefs::kDefaultBrowserSettingEnabled, + g_browser_process->local_state(), + this); } void GeneralPageView::NotifyPrefChanged(const std::string* pref_name) { @@ -446,6 +450,15 @@ void GeneralPageView::NotifyPrefChanged(const std::string* pref_name) { if (!pref_name || *pref_name == prefs::kInstantEnabled) instant_checkbox_->SetChecked(prefs->GetBoolean(prefs::kInstantEnabled)); + + if (!pref_name || *pref_name == prefs::kDefaultBrowserSettingEnabled) { + // If the option is managed the UI is uncondionally disabled otherwise we + // restart the standard button enabling logic. + if (default_browser_policy_.IsManaged()) + default_browser_use_as_default_button_->SetEnabled(false); + else + default_browser_worker_->StartCheckDefaultBrowser(); + } } void GeneralPageView::HighlightGroup(OptionsGroup highlight_group) { @@ -463,7 +476,9 @@ void GeneralPageView::LinkActivated(views::Link* source, int event_flags) { void GeneralPageView::SetDefaultBrowserUIState( ShellIntegration::DefaultBrowserUIState state) { - bool button_enabled = state == ShellIntegration::STATE_NOT_DEFAULT; + bool button_enabled = + (state == ShellIntegration::STATE_NOT_DEFAULT) && + !default_browser_policy_.IsManaged(); default_browser_use_as_default_button_->SetEnabled(button_enabled); default_browser_use_as_default_button_->SetNeedElevation(true); if (state == ShellIntegration::STATE_IS_DEFAULT) { diff --git a/chrome/browser/ui/views/options/general_page_view.h b/chrome/browser/ui/views/options/general_page_view.h index 43ab638..d8f5533 100644 --- a/chrome/browser/ui/views/options/general_page_view.h +++ b/chrome/browser/ui/views/options/general_page_view.h @@ -160,6 +160,7 @@ class GeneralPageView : public OptionsPageView, OptionsGroupView* default_browser_group_; views::Label* default_browser_status_label_; views::NativeButton* default_browser_use_as_default_button_; + BooleanPrefMember default_browser_policy_; // The helper object that performs default browser set/check tasks. scoped_refptr<ShellIntegration::DefaultBrowserWorker> default_browser_worker_; diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index 93be4ce..e709b43 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc @@ -570,6 +570,11 @@ const char kPluginsShowDetails[] = "plugins.show_details"; // on start-up. const char kCheckDefaultBrowser[] = "browser.check_default_browser"; +// Policy setting whether default browser check should be disabled and default +// browser registration should take place. +const char kDefaultBrowserSettingEnabled[] = + "browser.default_browser_setting_enabled"; + #if defined(OS_MACOSX) // Boolean that indicates whether the application should show the info bar // asking the user to set up automatic updates when Keystone promotion is diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index dc248ab..8f2094b 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h @@ -207,6 +207,7 @@ extern const char kPluginsPluginsBlacklist[]; extern const char kPluginsEnabledInternalPDF[]; extern const char kPluginsShowDetails[]; extern const char kCheckDefaultBrowser[]; +extern const char kDefaultBrowserSettingEnabled[]; #if defined(OS_MACOSX) extern const char kShowUpdatePromotionInfoBar[]; #endif |