| OLD | NEW | 
 | (Empty) | 
|    1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |  | 
|    2 // Use of this source code is governed by a BSD-style license that can be |  | 
|    3 // found in the LICENSE file. |  | 
|    4  |  | 
|    5 #import "chrome/browser/ui/cocoa/options/content_settings_dialog_controller.h" |  | 
|    6  |  | 
|    7 #import <Cocoa/Cocoa.h> |  | 
|    8  |  | 
|    9 #include "base/command_line.h" |  | 
|   10 #include "base/mac/mac_util.h" |  | 
|   11 #import "chrome/browser/content_settings/content_settings_details.h" |  | 
|   12 #import "chrome/browser/content_settings/host_content_settings_map.h" |  | 
|   13 #import "chrome/browser/geolocation/geolocation_content_settings_map.h" |  | 
|   14 #import "chrome/browser/geolocation/geolocation_exceptions_table_model.h" |  | 
|   15 #import "chrome/browser/notifications/desktop_notification_service.h" |  | 
|   16 #import "chrome/browser/notifications/notification_exceptions_table_model.h" |  | 
|   17 #include "chrome/browser/plugin_exceptions_table_model.h" |  | 
|   18 #include "chrome/browser/prefs/pref_service.h" |  | 
|   19 #include "chrome/browser/profiles/profile.h" |  | 
|   20 #include "chrome/browser/ui/browser.h" |  | 
|   21 #include "chrome/browser/ui/browser_window.h" |  | 
|   22 #import "chrome/browser/ui/cocoa/l10n_util.h" |  | 
|   23 #import "chrome/browser/ui/cocoa/content_settings/simple_content_exceptions_wind
     ow_controller.h" |  | 
|   24 #import "chrome/browser/ui/cocoa/options/content_exceptions_window_controller.h" |  | 
|   25 #import "chrome/browser/ui/cocoa/options/cookies_window_controller.h" |  | 
|   26 #import "chrome/browser/ui/cocoa/tab_view_picker_table.h" |  | 
|   27 #include "chrome/common/chrome_switches.h" |  | 
|   28 #include "chrome/common/notification_service.h" |  | 
|   29 #include "chrome/common/pref_names.h" |  | 
|   30 #include "chrome/common/url_constants.h" |  | 
|   31 #include "grit/locale_settings.h" |  | 
|   32 #include "grit/generated_resources.h" |  | 
|   33 #include "ui/base/l10n/l10n_util.h" |  | 
|   34  |  | 
|   35 namespace { |  | 
|   36  |  | 
|   37 // Stores the currently visible content settings dialog, if any. |  | 
|   38 ContentSettingsDialogController* g_instance = nil; |  | 
|   39  |  | 
|   40 }  // namespace |  | 
|   41  |  | 
|   42  |  | 
|   43 @interface ContentSettingsDialogController(Private) |  | 
|   44 - (id)initWithProfile:(Profile*)profile; |  | 
|   45 - (void)selectTab:(ContentSettingsType)settingsType; |  | 
|   46 - (void)showExceptionsForType:(ContentSettingsType)settingsType; |  | 
|   47  |  | 
|   48 // Callback when preferences are changed. |prefName| is the name of the |  | 
|   49 // pref that has changed. |  | 
|   50 - (void)prefChanged:(const std::string&)prefName; |  | 
|   51  |  | 
|   52 // Callback when content settings are changed. |  | 
|   53 - (void)contentSettingsChanged:(ContentSettingsDetails*)details; |  | 
|   54  |  | 
|   55 @end |  | 
|   56  |  | 
|   57 namespace ContentSettingsDialogControllerInternal { |  | 
|   58  |  | 
|   59 // A C++ class registered for changes in preferences. |  | 
|   60 class PrefObserverBridge : public NotificationObserver { |  | 
|   61  public: |  | 
|   62   PrefObserverBridge(ContentSettingsDialogController* controller) |  | 
|   63       : controller_(controller), disabled_(false) {} |  | 
|   64  |  | 
|   65   virtual ~PrefObserverBridge() {} |  | 
|   66  |  | 
|   67   virtual void Observe(NotificationType type, |  | 
|   68                        const NotificationSource& source, |  | 
|   69                        const NotificationDetails& details) { |  | 
|   70     if (disabled_) |  | 
|   71       return; |  | 
|   72  |  | 
|   73     // This is currently used by most notifications. |  | 
|   74     if (type == NotificationType::PREF_CHANGED) { |  | 
|   75       std::string* detail = Details<std::string>(details).ptr(); |  | 
|   76       if (detail) |  | 
|   77         [controller_ prefChanged:*detail]; |  | 
|   78     } |  | 
|   79  |  | 
|   80     // This is sent when the "is managed" state changes. |  | 
|   81     // TODO(markusheintz): Move all content settings to this notification. |  | 
|   82     if (type == NotificationType::CONTENT_SETTINGS_CHANGED) { |  | 
|   83       ContentSettingsDetails* settings_details = |  | 
|   84           Details<ContentSettingsDetails>(details).ptr(); |  | 
|   85       [controller_ contentSettingsChanged:settings_details]; |  | 
|   86     } |  | 
|   87   } |  | 
|   88  |  | 
|   89   void SetDisabled(bool disabled) { |  | 
|   90     disabled_ = disabled; |  | 
|   91   } |  | 
|   92  |  | 
|   93  private: |  | 
|   94   ContentSettingsDialogController* controller_;  // weak, owns us |  | 
|   95   bool disabled_;  // true if notifications should be ignored. |  | 
|   96 }; |  | 
|   97  |  | 
|   98 // A C++ utility class to disable notifications for PrefsObserverBridge. |  | 
|   99 // The intended usage is to create this on the stack. |  | 
|  100 class PrefObserverDisabler { |  | 
|  101  public: |  | 
|  102   PrefObserverDisabler(PrefObserverBridge *bridge) : bridge_(bridge) { |  | 
|  103     bridge_->SetDisabled(true); |  | 
|  104   } |  | 
|  105  |  | 
|  106   ~PrefObserverDisabler() { |  | 
|  107     bridge_->SetDisabled(false); |  | 
|  108   } |  | 
|  109  |  | 
|  110  private: |  | 
|  111   PrefObserverBridge *bridge_; |  | 
|  112 }; |  | 
|  113  |  | 
|  114 }  // ContentSettingsDialogControllerInternal |  | 
|  115  |  | 
|  116 @implementation ContentSettingsDialogController |  | 
|  117  |  | 
|  118 + (id)showContentSettingsForType:(ContentSettingsType)settingsType |  | 
|  119                          profile:(Profile*)profile { |  | 
|  120   profile = profile->GetOriginalProfile(); |  | 
|  121   if (!g_instance) |  | 
|  122     g_instance = [[self alloc] initWithProfile:profile]; |  | 
|  123  |  | 
|  124   // The code doesn't expect multiple profiles. Check that support for that |  | 
|  125   // hasn't been added. |  | 
|  126   DCHECK(g_instance->profile_ == profile); |  | 
|  127  |  | 
|  128   // Select desired tab. |  | 
|  129   if (settingsType == CONTENT_SETTINGS_TYPE_DEFAULT) { |  | 
|  130     // Remember the last visited page from local state. |  | 
|  131     int value = g_instance->lastSelectedTab_.GetValue(); |  | 
|  132     if (value >= 0 && value < CONTENT_SETTINGS_NUM_TYPES) |  | 
|  133       settingsType = static_cast<ContentSettingsType>(value); |  | 
|  134     if (settingsType == CONTENT_SETTINGS_TYPE_DEFAULT) |  | 
|  135       settingsType = CONTENT_SETTINGS_TYPE_COOKIES; |  | 
|  136   } |  | 
|  137   // TODO(thakis): Autosave window pos. |  | 
|  138  |  | 
|  139   [g_instance selectTab:settingsType]; |  | 
|  140   [g_instance showWindow:nil]; |  | 
|  141   [g_instance closeExceptionsSheet]; |  | 
|  142   return g_instance; |  | 
|  143 } |  | 
|  144  |  | 
|  145 - (id)initWithProfile:(Profile*)profile { |  | 
|  146   DCHECK(profile); |  | 
|  147   NSString* nibpath = |  | 
|  148       [base::mac::MainAppBundle() pathForResource:@"ContentSettings" |  | 
|  149                                           ofType:@"nib"]; |  | 
|  150   if ((self = [super initWithWindowNibPath:nibpath owner:self])) { |  | 
|  151     profile_ = profile; |  | 
|  152  |  | 
|  153     observer_.reset( |  | 
|  154         new ContentSettingsDialogControllerInternal::PrefObserverBridge(self)); |  | 
|  155     clearSiteDataOnExit_.Init(prefs::kClearSiteDataOnExit, |  | 
|  156                               profile_->GetPrefs(), observer_.get()); |  | 
|  157  |  | 
|  158     // Manually observe notifications for preferences that are grouped in |  | 
|  159     // the HostContentSettingsMap or GeolocationContentSettingsMap. |  | 
|  160     PrefService* prefs = profile_->GetPrefs(); |  | 
|  161     registrar_.Init(prefs); |  | 
|  162     registrar_.Add(prefs::kBlockThirdPartyCookies, observer_.get()); |  | 
|  163     registrar_.Add(prefs::kBlockNonsandboxedPlugins, observer_.get()); |  | 
|  164     registrar_.Add(prefs::kDefaultContentSettings, observer_.get()); |  | 
|  165     registrar_.Add(prefs::kGeolocationDefaultContentSetting, observer_.get()); |  | 
|  166  |  | 
|  167     // We don't need to observe changes in this value. |  | 
|  168     lastSelectedTab_.Init(prefs::kContentSettingsWindowLastTabIndex, |  | 
|  169                           profile_->GetPrefs(), NULL); |  | 
|  170   } |  | 
|  171   return self; |  | 
|  172 } |  | 
|  173  |  | 
|  174 - (void)closeExceptionsSheet { |  | 
|  175   NSWindow* attachedSheet = [[self window] attachedSheet]; |  | 
|  176   if (attachedSheet) { |  | 
|  177     [NSApp endSheet:attachedSheet]; |  | 
|  178   } |  | 
|  179 } |  | 
|  180  |  | 
|  181 - (void)awakeFromNib { |  | 
|  182   DCHECK([self window]); |  | 
|  183   DCHECK(tabView_); |  | 
|  184   DCHECK(tabViewPicker_); |  | 
|  185   DCHECK_EQ(self, [[self window] delegate]); |  | 
|  186  |  | 
|  187   // Adapt views to potentially long localized strings. |  | 
|  188   CGFloat windowDelta = 0; |  | 
|  189   for (NSTabViewItem* tab in [tabView_ tabViewItems]) { |  | 
|  190     NSArray* subviews = [[tab view] subviews]; |  | 
|  191     windowDelta = MAX(windowDelta, |  | 
|  192                       cocoa_l10n_util::VerticallyReflowGroup(subviews)); |  | 
|  193  |  | 
|  194     for (NSView* view in subviews) { |  | 
|  195       // Since the tab pane is in a horizontal resizer in IB, it's convenient |  | 
|  196       // to give all the subviews flexible width so that their sizes are |  | 
|  197       // autoupdated in IB. However, in chrome, the subviews shouldn't have |  | 
|  198       // flexible widths as this looks weird. |  | 
|  199       [view setAutoresizingMask:NSViewMaxXMargin | NSViewMinYMargin]; |  | 
|  200     } |  | 
|  201   } |  | 
|  202  |  | 
|  203   NSString* label = |  | 
|  204       l10n_util::GetNSStringWithFixup(IDS_CONTENT_SETTINGS_FEATURES_LABEL); |  | 
|  205   label = [label stringByReplacingOccurrencesOfString:@":" withString:@""]; |  | 
|  206   [tabViewPicker_ setHeading:label]; |  | 
|  207  |  | 
|  208   if (!CommandLine::ForCurrentProcess()->HasSwitch( |  | 
|  209           switches::kEnableClickToPlay)) { |  | 
|  210     // The |pluginsEnabledIndex| property is bound to the selected *tag*, |  | 
|  211     // so we don't have to worry about index shifts when removing a row |  | 
|  212     // from the matrix. |  | 
|  213     [pluginDefaultSettingMatrix_ removeRow:kPluginsAskIndex]; |  | 
|  214     NSArray* siblingViews = [[pluginDefaultSettingMatrix_ superview] subviews]; |  | 
|  215     for (NSView* view in siblingViews) { |  | 
|  216       NSRect frame = [view frame]; |  | 
|  217       if (frame.origin.y < [pluginDefaultSettingMatrix_ frame].origin.y) { |  | 
|  218         frame.origin.y += |  | 
|  219             ([pluginDefaultSettingMatrix_ cellSize].height + |  | 
|  220              [pluginDefaultSettingMatrix_ intercellSpacing].height); |  | 
|  221         [view setFrame:frame]; |  | 
|  222       } |  | 
|  223     } |  | 
|  224   } |  | 
|  225  |  | 
|  226   NSRect frame = [[self window] frame]; |  | 
|  227   frame.origin.y -= windowDelta; |  | 
|  228   frame.size.height += windowDelta; |  | 
|  229   [[self window] setFrame:frame display:NO]; |  | 
|  230 } |  | 
|  231  |  | 
|  232 // NSWindowDelegate method. |  | 
|  233 - (void)windowWillClose:(NSNotification*)notification { |  | 
|  234   [self autorelease]; |  | 
|  235   g_instance = nil; |  | 
|  236 } |  | 
|  237  |  | 
|  238 - (void)selectTab:(ContentSettingsType)settingsType { |  | 
|  239   [self window];  // Make sure the nib file is loaded. |  | 
|  240   DCHECK(tabView_); |  | 
|  241   [tabView_ selectTabViewItemAtIndex:settingsType]; |  | 
|  242 } |  | 
|  243  |  | 
|  244 // NSTabViewDelegate method. |  | 
|  245 - (void)         tabView:(NSTabView*)tabView |  | 
|  246     didSelectTabViewItem:(NSTabViewItem*)tabViewItem { |  | 
|  247   DCHECK_EQ(tabView_, tabView); |  | 
|  248   NSInteger index = [tabView indexOfTabViewItem:tabViewItem]; |  | 
|  249   DCHECK_GT(index, CONTENT_SETTINGS_TYPE_DEFAULT); |  | 
|  250   DCHECK_LT(index, CONTENT_SETTINGS_NUM_TYPES); |  | 
|  251   if (index > CONTENT_SETTINGS_TYPE_DEFAULT && |  | 
|  252        index < CONTENT_SETTINGS_NUM_TYPES) |  | 
|  253     lastSelectedTab_.SetValue(index); |  | 
|  254 } |  | 
|  255  |  | 
|  256 // Let esc close the window. |  | 
|  257 - (void)cancel:(id)sender { |  | 
|  258   [self close]; |  | 
|  259 } |  | 
|  260  |  | 
|  261 - (void)setCookieSettingIndex:(NSInteger)value { |  | 
|  262   ContentSetting setting = CONTENT_SETTING_DEFAULT; |  | 
|  263   switch (value) { |  | 
|  264     case kCookieEnabledIndex:  setting = CONTENT_SETTING_ALLOW; break; |  | 
|  265     case kCookieDisabledIndex: setting = CONTENT_SETTING_BLOCK; break; |  | 
|  266     default: |  | 
|  267       NOTREACHED(); |  | 
|  268   } |  | 
|  269   ContentSettingsDialogControllerInternal::PrefObserverDisabler |  | 
|  270       disabler(observer_.get()); |  | 
|  271   profile_->GetHostContentSettingsMap()->SetDefaultContentSetting( |  | 
|  272       CONTENT_SETTINGS_TYPE_COOKIES, |  | 
|  273       setting); |  | 
|  274 } |  | 
|  275  |  | 
|  276 - (NSInteger)cookieSettingIndex { |  | 
|  277   switch (profile_->GetHostContentSettingsMap()->GetDefaultContentSetting( |  | 
|  278       CONTENT_SETTINGS_TYPE_COOKIES)) { |  | 
|  279     case CONTENT_SETTING_ALLOW:        return kCookieEnabledIndex; |  | 
|  280     case CONTENT_SETTING_BLOCK:        return kCookieDisabledIndex; |  | 
|  281     default: |  | 
|  282       NOTREACHED(); |  | 
|  283       return kCookieEnabledIndex; |  | 
|  284   } |  | 
|  285 } |  | 
|  286  |  | 
|  287 - (BOOL)cookieSettingsManaged { |  | 
|  288   return profile_->GetHostContentSettingsMap()->IsDefaultContentSettingManaged( |  | 
|  289       CONTENT_SETTINGS_TYPE_COOKIES); |  | 
|  290 } |  | 
|  291  |  | 
|  292 - (BOOL)blockThirdPartyCookies { |  | 
|  293   HostContentSettingsMap* settingsMap = profile_->GetHostContentSettingsMap(); |  | 
|  294   return settingsMap->BlockThirdPartyCookies(); |  | 
|  295 } |  | 
|  296  |  | 
|  297 - (void)setBlockThirdPartyCookies:(BOOL)value { |  | 
|  298   HostContentSettingsMap* settingsMap = profile_->GetHostContentSettingsMap(); |  | 
|  299   ContentSettingsDialogControllerInternal::PrefObserverDisabler |  | 
|  300       disabler(observer_.get()); |  | 
|  301   settingsMap->SetBlockThirdPartyCookies(value); |  | 
|  302 } |  | 
|  303  |  | 
|  304 - (BOOL)blockThirdPartyCookiesManaged { |  | 
|  305   HostContentSettingsMap* settingsMap = profile_->GetHostContentSettingsMap(); |  | 
|  306   return settingsMap->IsBlockThirdPartyCookiesManaged(); |  | 
|  307 } |  | 
|  308  |  | 
|  309 - (BOOL)clearSiteDataOnExitManaged { |  | 
|  310   return clearSiteDataOnExit_.IsManaged(); |  | 
|  311 } |  | 
|  312  |  | 
|  313 - (BOOL)clearSiteDataOnExit { |  | 
|  314   return clearSiteDataOnExit_.GetValue(); |  | 
|  315 } |  | 
|  316  |  | 
|  317 - (void)setClearSiteDataOnExit:(BOOL)value { |  | 
|  318   ContentSettingsDialogControllerInternal::PrefObserverDisabler |  | 
|  319       disabler(observer_.get()); |  | 
|  320   clearSiteDataOnExit_.SetValue(value); |  | 
|  321 } |  | 
|  322  |  | 
|  323 // Shows the cookies controller. |  | 
|  324 - (IBAction)showCookies:(id)sender { |  | 
|  325   // The cookie controller will autorelease itself when it's closed. |  | 
|  326   BrowsingDataDatabaseHelper* databaseHelper = |  | 
|  327       new BrowsingDataDatabaseHelper(profile_); |  | 
|  328   BrowsingDataLocalStorageHelper* storageHelper = |  | 
|  329       new BrowsingDataLocalStorageHelper(profile_); |  | 
|  330   BrowsingDataAppCacheHelper* appcacheHelper = |  | 
|  331       new BrowsingDataAppCacheHelper(profile_); |  | 
|  332   BrowsingDataIndexedDBHelper* indexedDBHelper = |  | 
|  333       BrowsingDataIndexedDBHelper::Create(profile_); |  | 
|  334   CookiesWindowController* controller = |  | 
|  335       [[CookiesWindowController alloc] initWithProfile:profile_ |  | 
|  336                                         databaseHelper:databaseHelper |  | 
|  337                                          storageHelper:storageHelper |  | 
|  338                                         appcacheHelper:appcacheHelper |  | 
|  339                                        indexedDBHelper:indexedDBHelper]; |  | 
|  340   [controller attachSheetTo:[self window]]; |  | 
|  341 } |  | 
|  342  |  | 
|  343 // Called when the user clicks the "Flash Player storage settings" button. |  | 
|  344 - (IBAction)openFlashPlayerSettings:(id)sender { |  | 
|  345   Browser* browser = Browser::Create(profile_); |  | 
|  346   browser->OpenURL(GURL(l10n_util::GetStringUTF8(IDS_FLASH_STORAGE_URL)), |  | 
|  347                    GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK); |  | 
|  348   browser->window()->Show(); |  | 
|  349 } |  | 
|  350  |  | 
|  351 // Called when the user clicks the "Disable individual plug-ins..." button. |  | 
|  352 - (IBAction)openPluginsPage:(id)sender { |  | 
|  353   Browser* browser = Browser::Create(profile_); |  | 
|  354   browser->OpenURL(GURL(chrome::kChromeUIPluginsURL), |  | 
|  355                    GURL(), NEW_FOREGROUND_TAB, PageTransition::LINK); |  | 
|  356   browser->window()->Show(); |  | 
|  357 } |  | 
|  358  |  | 
|  359 - (IBAction)showCookieExceptions:(id)sender { |  | 
|  360   [self showExceptionsForType:CONTENT_SETTINGS_TYPE_COOKIES]; |  | 
|  361 } |  | 
|  362  |  | 
|  363 - (IBAction)showImagesExceptions:(id)sender { |  | 
|  364   [self showExceptionsForType:CONTENT_SETTINGS_TYPE_IMAGES]; |  | 
|  365 } |  | 
|  366  |  | 
|  367 - (IBAction)showJavaScriptExceptions:(id)sender { |  | 
|  368   [self showExceptionsForType:CONTENT_SETTINGS_TYPE_JAVASCRIPT]; |  | 
|  369 } |  | 
|  370  |  | 
|  371 - (IBAction)showPluginsExceptions:(id)sender { |  | 
|  372   if (CommandLine::ForCurrentProcess()->HasSwitch( |  | 
|  373           switches::kEnableResourceContentSettings)) { |  | 
|  374     HostContentSettingsMap* settingsMap = profile_->GetHostContentSettingsMap(); |  | 
|  375     HostContentSettingsMap* offTheRecordSettingsMap = |  | 
|  376         profile_->HasOffTheRecordProfile() ? |  | 
|  377             profile_->GetOffTheRecordProfile()->GetHostContentSettingsMap() : |  | 
|  378             NULL; |  | 
|  379     PluginExceptionsTableModel* model = |  | 
|  380         new PluginExceptionsTableModel(settingsMap, offTheRecordSettingsMap); |  | 
|  381     model->LoadSettings(); |  | 
|  382     [[SimpleContentExceptionsWindowController controllerWithTableModel:model] |  | 
|  383         attachSheetTo:[self window]]; |  | 
|  384   } else { |  | 
|  385     [self showExceptionsForType:CONTENT_SETTINGS_TYPE_PLUGINS]; |  | 
|  386   } |  | 
|  387 } |  | 
|  388  |  | 
|  389 - (IBAction)showPopupsExceptions:(id)sender { |  | 
|  390   [self showExceptionsForType:CONTENT_SETTINGS_TYPE_POPUPS]; |  | 
|  391 } |  | 
|  392  |  | 
|  393 - (IBAction)showGeolocationExceptions:(id)sender { |  | 
|  394   GeolocationContentSettingsMap* settingsMap = |  | 
|  395       profile_->GetGeolocationContentSettingsMap(); |  | 
|  396   GeolocationExceptionsTableModel* model =  // Freed by window controller. |  | 
|  397       new GeolocationExceptionsTableModel(settingsMap); |  | 
|  398   [[SimpleContentExceptionsWindowController controllerWithTableModel:model] |  | 
|  399       attachSheetTo:[self window]]; |  | 
|  400 } |  | 
|  401  |  | 
|  402 - (IBAction)showNotificationsExceptions:(id)sender { |  | 
|  403   DesktopNotificationService* service = |  | 
|  404       profile_->GetDesktopNotificationService(); |  | 
|  405   NotificationExceptionsTableModel* model =  // Freed by window controller. |  | 
|  406       new NotificationExceptionsTableModel(service); |  | 
|  407   [[SimpleContentExceptionsWindowController controllerWithTableModel:model] |  | 
|  408       attachSheetTo:[self window]]; |  | 
|  409 } |  | 
|  410  |  | 
|  411 - (void)showExceptionsForType:(ContentSettingsType)settingsType { |  | 
|  412   HostContentSettingsMap* settingsMap = profile_->GetHostContentSettingsMap(); |  | 
|  413   HostContentSettingsMap* offTheRecordSettingsMap = |  | 
|  414       profile_->HasOffTheRecordProfile() ? |  | 
|  415           profile_->GetOffTheRecordProfile()->GetHostContentSettingsMap() : |  | 
|  416           NULL; |  | 
|  417   [[ContentExceptionsWindowController controllerForType:settingsType |  | 
|  418                                             settingsMap:settingsMap |  | 
|  419                                          otrSettingsMap:offTheRecordSettingsMap] |  | 
|  420       attachSheetTo:[self window]]; |  | 
|  421 } |  | 
|  422  |  | 
|  423 - (void)setImagesEnabledIndex:(NSInteger)value { |  | 
|  424   ContentSetting setting = value == kContentSettingsEnabledIndex ? |  | 
|  425       CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; |  | 
|  426   ContentSettingsDialogControllerInternal::PrefObserverDisabler |  | 
|  427       disabler(observer_.get()); |  | 
|  428   profile_->GetHostContentSettingsMap()->SetDefaultContentSetting( |  | 
|  429       CONTENT_SETTINGS_TYPE_IMAGES, setting); |  | 
|  430 } |  | 
|  431  |  | 
|  432 - (NSInteger)imagesEnabledIndex { |  | 
|  433   HostContentSettingsMap* settingsMap = profile_->GetHostContentSettingsMap(); |  | 
|  434   bool enabled = |  | 
|  435       settingsMap->GetDefaultContentSetting(CONTENT_SETTINGS_TYPE_IMAGES) == |  | 
|  436       CONTENT_SETTING_ALLOW; |  | 
|  437   return enabled ? kContentSettingsEnabledIndex : kContentSettingsDisabledIndex; |  | 
|  438 } |  | 
|  439  |  | 
|  440 - (BOOL)imagesSettingsManaged { |  | 
|  441   return profile_->GetHostContentSettingsMap()->IsDefaultContentSettingManaged( |  | 
|  442       CONTENT_SETTINGS_TYPE_IMAGES); |  | 
|  443 } |  | 
|  444  |  | 
|  445 - (void)setJavaScriptEnabledIndex:(NSInteger)value { |  | 
|  446   ContentSetting setting = value == kContentSettingsEnabledIndex ? |  | 
|  447       CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; |  | 
|  448   ContentSettingsDialogControllerInternal::PrefObserverDisabler |  | 
|  449       disabler(observer_.get()); |  | 
|  450   profile_->GetHostContentSettingsMap()->SetDefaultContentSetting( |  | 
|  451       CONTENT_SETTINGS_TYPE_JAVASCRIPT, setting); |  | 
|  452 } |  | 
|  453  |  | 
|  454 - (NSInteger)javaScriptEnabledIndex { |  | 
|  455   HostContentSettingsMap* settingsMap = profile_->GetHostContentSettingsMap(); |  | 
|  456   bool enabled = |  | 
|  457       settingsMap->GetDefaultContentSetting(CONTENT_SETTINGS_TYPE_JAVASCRIPT) == |  | 
|  458       CONTENT_SETTING_ALLOW; |  | 
|  459   return enabled ? kContentSettingsEnabledIndex : kContentSettingsDisabledIndex; |  | 
|  460 } |  | 
|  461  |  | 
|  462 - (BOOL)javaScriptSettingsManaged { |  | 
|  463   return profile_->GetHostContentSettingsMap()->IsDefaultContentSettingManaged( |  | 
|  464       CONTENT_SETTINGS_TYPE_JAVASCRIPT); |  | 
|  465 } |  | 
|  466  |  | 
|  467 - (void)setPluginsEnabledIndex:(NSInteger)value { |  | 
|  468   ContentSetting setting = CONTENT_SETTING_DEFAULT; |  | 
|  469   switch (value) { |  | 
|  470     case kPluginsAllowIndex: |  | 
|  471       setting = CONTENT_SETTING_ALLOW; |  | 
|  472       break; |  | 
|  473     case kPluginsAskIndex: |  | 
|  474       setting = CONTENT_SETTING_ASK; |  | 
|  475       break; |  | 
|  476     case kPluginsBlockIndex: |  | 
|  477       setting = CONTENT_SETTING_BLOCK; |  | 
|  478       break; |  | 
|  479     default: |  | 
|  480       NOTREACHED(); |  | 
|  481   } |  | 
|  482   ContentSettingsDialogControllerInternal::PrefObserverDisabler |  | 
|  483       disabler(observer_.get()); |  | 
|  484   profile_->GetHostContentSettingsMap()->SetDefaultContentSetting( |  | 
|  485       CONTENT_SETTINGS_TYPE_PLUGINS, setting); |  | 
|  486 } |  | 
|  487  |  | 
|  488 - (NSInteger)pluginsEnabledIndex { |  | 
|  489   HostContentSettingsMap* map = profile_->GetHostContentSettingsMap(); |  | 
|  490   ContentSetting setting = |  | 
|  491       map->GetDefaultContentSetting(CONTENT_SETTINGS_TYPE_PLUGINS); |  | 
|  492   switch (setting) { |  | 
|  493     case CONTENT_SETTING_ALLOW: |  | 
|  494       return kPluginsAllowIndex; |  | 
|  495     case CONTENT_SETTING_ASK: |  | 
|  496       if (CommandLine::ForCurrentProcess()->HasSwitch( |  | 
|  497           switches::kEnableClickToPlay)) |  | 
|  498         return kPluginsAskIndex; |  | 
|  499       // Fall through to the next case. |  | 
|  500     case CONTENT_SETTING_BLOCK: |  | 
|  501       return kPluginsBlockIndex; |  | 
|  502     default: |  | 
|  503       NOTREACHED(); |  | 
|  504       return kPluginsAllowIndex; |  | 
|  505   } |  | 
|  506 } |  | 
|  507  |  | 
|  508 - (BOOL)pluginsSettingsManaged { |  | 
|  509   return profile_->GetHostContentSettingsMap()->IsDefaultContentSettingManaged( |  | 
|  510       CONTENT_SETTINGS_TYPE_PLUGINS); |  | 
|  511 } |  | 
|  512  |  | 
|  513 - (void)setPopupsEnabledIndex:(NSInteger)value { |  | 
|  514   ContentSetting setting = value == kContentSettingsEnabledIndex ? |  | 
|  515       CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; |  | 
|  516   ContentSettingsDialogControllerInternal::PrefObserverDisabler |  | 
|  517       disabler(observer_.get()); |  | 
|  518   profile_->GetHostContentSettingsMap()->SetDefaultContentSetting( |  | 
|  519       CONTENT_SETTINGS_TYPE_POPUPS, setting); |  | 
|  520 } |  | 
|  521  |  | 
|  522 - (NSInteger)popupsEnabledIndex { |  | 
|  523   HostContentSettingsMap* settingsMap = profile_->GetHostContentSettingsMap(); |  | 
|  524   bool enabled = |  | 
|  525       settingsMap->GetDefaultContentSetting(CONTENT_SETTINGS_TYPE_POPUPS) == |  | 
|  526       CONTENT_SETTING_ALLOW; |  | 
|  527   return enabled ? kContentSettingsEnabledIndex : kContentSettingsDisabledIndex; |  | 
|  528 } |  | 
|  529  |  | 
|  530 - (BOOL)popupsSettingsManaged { |  | 
|  531   return profile_->GetHostContentSettingsMap()->IsDefaultContentSettingManaged( |  | 
|  532       CONTENT_SETTINGS_TYPE_POPUPS); |  | 
|  533 } |  | 
|  534  |  | 
|  535 - (void)setGeolocationSettingIndex:(NSInteger)value { |  | 
|  536   ContentSetting setting = CONTENT_SETTING_DEFAULT; |  | 
|  537   switch (value) { |  | 
|  538     case kGeolocationEnabledIndex:  setting = CONTENT_SETTING_ALLOW; break; |  | 
|  539     case kGeolocationAskIndex:      setting = CONTENT_SETTING_ASK;   break; |  | 
|  540     case kGeolocationDisabledIndex: setting = CONTENT_SETTING_BLOCK; break; |  | 
|  541     default: |  | 
|  542       NOTREACHED(); |  | 
|  543   } |  | 
|  544   ContentSettingsDialogControllerInternal::PrefObserverDisabler |  | 
|  545       disabler(observer_.get()); |  | 
|  546   profile_->GetGeolocationContentSettingsMap()->SetDefaultContentSetting( |  | 
|  547       setting); |  | 
|  548 } |  | 
|  549  |  | 
|  550 - (NSInteger)geolocationSettingIndex { |  | 
|  551   ContentSetting setting = |  | 
|  552       profile_->GetGeolocationContentSettingsMap()->GetDefaultContentSetting(); |  | 
|  553   switch (setting) { |  | 
|  554     case CONTENT_SETTING_ALLOW: return kGeolocationEnabledIndex; |  | 
|  555     case CONTENT_SETTING_ASK:   return kGeolocationAskIndex; |  | 
|  556     case CONTENT_SETTING_BLOCK: return kGeolocationDisabledIndex; |  | 
|  557     default: |  | 
|  558       NOTREACHED(); |  | 
|  559       return kGeolocationAskIndex; |  | 
|  560   } |  | 
|  561 } |  | 
|  562  |  | 
|  563 - (void)setNotificationsSettingIndex:(NSInteger)value { |  | 
|  564   ContentSetting setting = CONTENT_SETTING_DEFAULT; |  | 
|  565   switch (value) { |  | 
|  566     case kNotificationsEnabledIndex:  setting = CONTENT_SETTING_ALLOW; break; |  | 
|  567     case kNotificationsAskIndex:      setting = CONTENT_SETTING_ASK;   break; |  | 
|  568     case kNotificationsDisabledIndex: setting = CONTENT_SETTING_BLOCK; break; |  | 
|  569     default: |  | 
|  570       NOTREACHED(); |  | 
|  571   } |  | 
|  572   ContentSettingsDialogControllerInternal::PrefObserverDisabler |  | 
|  573       disabler(observer_.get()); |  | 
|  574   profile_->GetDesktopNotificationService()->SetDefaultContentSetting( |  | 
|  575       setting); |  | 
|  576 } |  | 
|  577  |  | 
|  578 - (NSInteger)notificationsSettingIndex { |  | 
|  579   ContentSetting setting = |  | 
|  580       profile_->GetDesktopNotificationService()->GetDefaultContentSetting(); |  | 
|  581   switch (setting) { |  | 
|  582     case CONTENT_SETTING_ALLOW: return kNotificationsEnabledIndex; |  | 
|  583     case CONTENT_SETTING_ASK:   return kNotificationsAskIndex; |  | 
|  584     case CONTENT_SETTING_BLOCK: return kNotificationsDisabledIndex; |  | 
|  585     default: |  | 
|  586       NOTREACHED(); |  | 
|  587       return kGeolocationAskIndex; |  | 
|  588   } |  | 
|  589 } |  | 
|  590  |  | 
|  591 // Callback when preferences are changed. |prefName| is the name of the |  | 
|  592 // pref that has changed and should not be NULL. |  | 
|  593 - (void)prefChanged:(const std::string&)prefName { |  | 
|  594   if (prefName == prefs::kClearSiteDataOnExit) { |  | 
|  595     [self willChangeValueForKey:@"clearSiteDataOnExit"]; |  | 
|  596     [self didChangeValueForKey:@"clearSiteDataOnExit"]; |  | 
|  597     [self willChangeValueForKey:@"clearSiteDataOnExitManaged"]; |  | 
|  598     [self didChangeValueForKey:@"clearSiteDataOnExitManaged"]; |  | 
|  599   } |  | 
|  600   if (prefName == prefs::kBlockThirdPartyCookies) { |  | 
|  601     [self willChangeValueForKey:@"blockThirdPartyCookies"]; |  | 
|  602     [self didChangeValueForKey:@"blockThirdPartyCookies"]; |  | 
|  603     [self willChangeValueForKey:@"blockThirdPartyCookiesManaged"]; |  | 
|  604     [self didChangeValueForKey:@"blockThirdPartyCookiesManaged"]; |  | 
|  605   } |  | 
|  606   if (prefName == prefs::kBlockNonsandboxedPlugins) { |  | 
|  607     [self willChangeValueForKey:@"pluginsEnabledIndex"]; |  | 
|  608     [self didChangeValueForKey:@"pluginsEnabledIndex"]; |  | 
|  609   } |  | 
|  610   if (prefName == prefs::kDefaultContentSettings) { |  | 
|  611     // We don't know exactly which setting has changed, so we'll tickle all |  | 
|  612     // of the properties that apply to kDefaultContentSettings.  This will |  | 
|  613     // keep the UI up-to-date. |  | 
|  614     [self willChangeValueForKey:@"cookieSettingIndex"]; |  | 
|  615     [self didChangeValueForKey:@"cookieSettingIndex"]; |  | 
|  616     [self willChangeValueForKey:@"imagesEnabledIndex"]; |  | 
|  617     [self didChangeValueForKey:@"imagesEnabledIndex"]; |  | 
|  618     [self willChangeValueForKey:@"javaScriptEnabledIndex"]; |  | 
|  619     [self didChangeValueForKey:@"javaScriptEnabledIndex"]; |  | 
|  620     [self willChangeValueForKey:@"pluginsEnabledIndex"]; |  | 
|  621     [self didChangeValueForKey:@"pluginsEnabledIndex"]; |  | 
|  622     [self willChangeValueForKey:@"popupsEnabledIndex"]; |  | 
|  623     [self didChangeValueForKey:@"popupsEnabledIndex"]; |  | 
|  624  |  | 
|  625     // Updates the "Enable" state of the radio groups and the exception buttons. |  | 
|  626     [self willChangeValueForKey:@"cookieSettingsManaged"]; |  | 
|  627     [self didChangeValueForKey:@"cookieSettingsManaged"]; |  | 
|  628     [self willChangeValueForKey:@"imagesSettingsManaged"]; |  | 
|  629     [self didChangeValueForKey:@"imagesSettingsManaged"]; |  | 
|  630     [self willChangeValueForKey:@"javaScriptSettingsManaged"]; |  | 
|  631     [self didChangeValueForKey:@"javaScriptSettingsManaged"]; |  | 
|  632     [self willChangeValueForKey:@"pluginsSettingsManaged"]; |  | 
|  633     [self didChangeValueForKey:@"pluginsSettingsManaged"]; |  | 
|  634     [self willChangeValueForKey:@"popupsSettingsManaged"]; |  | 
|  635     [self didChangeValueForKey:@"popupsSettingsManaged"]; |  | 
|  636   } |  | 
|  637   if (prefName == prefs::kGeolocationDefaultContentSetting) { |  | 
|  638     [self willChangeValueForKey:@"geolocationSettingIndex"]; |  | 
|  639     [self didChangeValueForKey:@"geolocationSettingIndex"]; |  | 
|  640   } |  | 
|  641   if (prefName == prefs::kDesktopNotificationDefaultContentSetting) { |  | 
|  642     [self willChangeValueForKey:@"notificationsSettingIndex"]; |  | 
|  643     [self didChangeValueForKey:@"notificationsSettingIndex"]; |  | 
|  644   } |  | 
|  645 } |  | 
|  646  |  | 
|  647 - (void)contentSettingsChanged:(ContentSettingsDetails*)details { |  | 
|  648   [self prefChanged:prefs::kBlockNonsandboxedPlugins]; |  | 
|  649   [self prefChanged:prefs::kDefaultContentSettings]; |  | 
|  650 } |  | 
|  651  |  | 
|  652 @end |  | 
| OLD | NEW |