Chromium Code Reviews| Index: chrome/browser/subresource_filter/subresource_filter_content_settings_observer_factory.cc |
| diff --git a/chrome/browser/subresource_filter/subresource_filter_content_settings_observer_factory.cc b/chrome/browser/subresource_filter/subresource_filter_content_settings_observer_factory.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..f09944e1e75fc5bce3b0d4f4218f9a2970853898 |
| --- /dev/null |
| +++ b/chrome/browser/subresource_filter/subresource_filter_content_settings_observer_factory.cc |
| @@ -0,0 +1,111 @@ |
| +// Copyright 2017 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/subresource_filter/subresource_filter_content_settings_observer_factory.h" |
| + |
| +#include "base/logging.h" |
| +#include "chrome/browser/content_settings/host_content_settings_map_factory.h" |
| +#include "chrome/browser/profiles/profile.h" |
| +#include "chrome/browser/subresource_filter/chrome_subresource_filter_client.h" |
| +#include "components/content_settings/core/browser/content_settings_details.h" |
| +#include "components/content_settings/core/browser/host_content_settings_map.h" |
| +#include "components/content_settings/core/common/content_settings_pattern.h" |
| +#include "components/content_settings/core/common/content_settings_types.h" |
| +#include "components/keyed_service/content/browser_context_dependency_manager.h" |
| +#include "url/gurl.h" |
| + |
| +SubresourceFilterContentSettingsObserver:: |
| + SubresourceFilterContentSettingsObserver(Profile* profile) |
| + : settings_map_(HostContentSettingsMapFactory::GetForProfile(profile)) { |
| + DCHECK(profile); |
| + settings_map_->AddObserver(this); |
| +} |
| + |
| +void SubresourceFilterContentSettingsObserver::OnContentSettingChanged( |
|
msramek
2017/03/29 09:41:25
This method probably deserves a unittest. You ment
Charlie Harrison
2017/03/29 15:23:32
Done.
|
| + const ContentSettingsPattern& primary_pattern, |
| + const ContentSettingsPattern& secondary_pattern, |
|
msramek
2017/03/29 09:41:25
Do we care about the secondary pattern?
If a user
Charlie Harrison
2017/03/29 15:23:32
Done. We may add this functionality in the future
|
| + ContentSettingsType content_type, |
| + std::string resource_identifier) { |
| + DCHECK(settings_map_); |
| + if (content_type != CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER || |
| + !primary_pattern.IsValid()) { |
| + return; |
| + } |
| + |
| + const ContentSettingsDetails details(primary_pattern, secondary_pattern, |
| + content_type, resource_identifier); |
| + if (details.update_all()) { |
| + ContentSetting global_setting = |
| + GetContentSettingForUrl(GURL("https://example.com")); |
|
msramek
2017/03/29 09:41:25
I'm so going to mess with your metrics by flipping
Charlie Harrison
2017/03/29 15:23:32
Ha! Done. I knew there was a better way than this.
|
| + if (global_setting == CONTENT_SETTING_BLOCK) { |
|
msramek
2017/03/29 09:41:25
style nit: Use a switch instead of NOTREACHED() to
Charlie Harrison
2017/03/29 15:23:32
There are 5 content settings that I'm not handling
msramek
2017/03/29 17:37:30
Sigh... For a moment, I completely forgot that we'
Charlie Harrison
2017/03/29 17:47:34
No worries! Reverted back to the if chain.
|
| + ChromeSubresourceFilterClient::LogSubresourceFilterAction( |
| + kActionContentSettingsBlockedGlobal); |
| + } else if (global_setting == CONTENT_SETTING_ALLOW) { |
| + ChromeSubresourceFilterClient::LogSubresourceFilterAction( |
| + kActionContentSettingsAllowedGlobal); |
| + } else { |
| + NOTREACHED(); |
| + } |
| + return; |
| + } |
| + |
| + GURL url = GURL(primary_pattern.ToString()); |
| + if (!url.is_valid()) { |
| + ChromeSubresourceFilterClient::LogSubresourceFilterAction( |
| + kActionContentSettingsWildcardUpdate); |
| + return; |
| + } |
| + |
| + ContentSetting setting = GetContentSettingForUrl(url); |
| + if (setting == CONTENT_SETTING_BLOCK) { |
|
msramek
2017/03/29 09:41:25
Ditto.
Charlie Harrison
2017/03/29 15:23:32
Done.
|
| + ChromeSubresourceFilterClient::LogSubresourceFilterAction( |
| + kActionContentSettingsBlocked); |
| + } else if (setting == CONTENT_SETTING_ALLOW) { |
| + ChromeSubresourceFilterClient::LogSubresourceFilterAction( |
| + kActionContentSettingsAllowed); |
| + } else { |
| + NOTREACHED(); |
| + } |
| +} |
| + |
| +void SubresourceFilterContentSettingsObserver::Shutdown() { |
| + settings_map_->RemoveObserver(this); |
| + settings_map_ = nullptr; |
| +} |
| + |
| +ContentSetting |
| +SubresourceFilterContentSettingsObserver::GetContentSettingForUrl( |
| + const GURL& url) { |
| + return settings_map_->GetContentSetting( |
| + url, url, ContentSettingsType::CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER, |
| + std::string()); |
| +} |
| + |
| +// static |
| +SubresourceFilterContentSettingsObserver* |
| +SubresourceFilterContentSettingsObserverFactory::GetForProfile( |
| + Profile* profile) { |
| + return static_cast<SubresourceFilterContentSettingsObserver*>( |
| + GetInstance()->GetServiceForBrowserContext(profile, true /* create */)); |
| +} |
| + |
| +// static |
| +SubresourceFilterContentSettingsObserverFactory* |
| +SubresourceFilterContentSettingsObserverFactory::GetInstance() { |
| + return base::Singleton< |
| + SubresourceFilterContentSettingsObserverFactory>::get(); |
| +} |
| + |
| +SubresourceFilterContentSettingsObserverFactory:: |
| + SubresourceFilterContentSettingsObserverFactory() |
| + : BrowserContextKeyedServiceFactory( |
| + "SubresourceFilterContentSettingsObserver", |
| + BrowserContextDependencyManager::GetInstance()) {} |
| + |
| +KeyedService* |
| +SubresourceFilterContentSettingsObserverFactory::BuildServiceInstanceFor( |
| + content::BrowserContext* profile) const { |
| + return new SubresourceFilterContentSettingsObserver( |
| + static_cast<Profile*>(profile)); |
| +} |