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)); |
+} |