Chromium Code Reviews| Index: chrome/browser/notifications/notification_channels_provider_android.cc |
| diff --git a/chrome/browser/notifications/notification_channels_provider_android.cc b/chrome/browser/notifications/notification_channels_provider_android.cc |
| index f865fb126b9e95ab59de07953c75cbdbf6426046..d95fee623d90456a6642cf272b1799e571e736a8 100644 |
| --- a/chrome/browser/notifications/notification_channels_provider_android.cc |
| +++ b/chrome/browser/notifications/notification_channels_provider_android.cc |
| @@ -11,6 +11,7 @@ |
| #include "chrome/browser/content_settings/host_content_settings_map_factory.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "components/content_settings/core/browser/content_settings_details.h" |
| +#include "components/content_settings/core/browser/content_settings_rule.h" |
| #include "components/content_settings/core/browser/content_settings_utils.h" |
| #include "components/content_settings/core/browser/host_content_settings_map.h" |
| #include "components/content_settings/core/common/content_settings.h" |
| @@ -56,8 +57,59 @@ class NotificationChannelsBridgeImpl |
| Java_NotificationSettingsBridge_deleteChannel( |
| env, ConvertUTF8ToJavaString(env, origin)); |
| } |
| + |
| + std::vector<Channel> GetChannels() override { |
| + JNIEnv* env = AttachCurrentThread(); |
| + ScopedJavaLocalRef<jobjectArray> raw_channels = |
| + Java_NotificationSettingsBridge_getSiteChannels(env); |
| + jsize num_channels = env->GetArrayLength(raw_channels.obj()); |
| + std::vector<Channel> channels; |
| + for (jsize i = 0; i < num_channels; ++i) { |
| + jobject jchannel = env->GetObjectArrayElement(raw_channels.obj(), i); |
| + Channel channel = {.origin = ConvertJavaStringToUTF8( |
| + Java_SiteChannel_getOrigin(env, jchannel)), |
| + .status = static_cast<NotificationChannelStatus>( |
| + Java_SiteChannel_getStatus(env, jchannel))}; |
|
Peter Beverloo
2017/06/02 15:14:26
Channel channel;
channel.origin = ConvertJ....
cha
awdf
2017/06/02 16:59:48
Done (with a constructor).
|
| + channels.push_back(channel); |
| + } |
| + return channels; |
| + } |
| }; |
| +class ListIterator : public content_settings::RuleIterator { |
| + public: |
| + explicit ListIterator(const std::list<content_settings::Rule>& rules) |
| + : rules_(rules) {} |
| + |
| + ~ListIterator() override {} |
| + |
| + bool HasNext() const override { return !rules_.empty(); } |
| + |
| + content_settings::Rule Next() override { |
| + // |front()| returns a reference but we're going to discard the object |
| + // referred to; force copying here. |
| + content_settings::Rule rule = rules_.front(); |
| + rules_.pop_front(); |
| + return rule; |
| + } |
| + |
| + private: |
| + std::list<content_settings::Rule> rules_; |
|
Peter Beverloo
2017/06/02 15:14:26
Since an instance of the Rule object will be retur
awdf
2017/06/02 16:59:48
Done.
|
| +}; |
| + |
| +ContentSetting ChannelStatusToContentSetting(NotificationChannelStatus status) { |
| + switch (status) { |
| + case NotificationChannelStatus::ENABLED: |
| + return CONTENT_SETTING_ALLOW; |
| + case NotificationChannelStatus::BLOCKED: |
| + return CONTENT_SETTING_BLOCK; |
| + case NotificationChannelStatus::UNAVAILABLE: |
| + return CONTENT_SETTING_DEFAULT; |
| + } |
| + NOTREACHED(); |
| + return CONTENT_SETTING_DEFAULT; |
| +} |
| + |
| } // anonymous namespace |
| NotificationChannelsProviderAndroid::NotificationChannelsProviderAndroid() |
| @@ -77,8 +129,24 @@ NotificationChannelsProviderAndroid::GetRuleIterator( |
| ContentSettingsType content_type, |
| const content_settings::ResourceIdentifier& resource_identifier, |
| bool incognito) const { |
| - // TODO(crbug.com/700377) return rule iterator over all channels |
| - return nullptr; |
| + if (content_type != CONTENT_SETTINGS_TYPE_NOTIFICATIONS || incognito || |
| + !should_use_channels_) { |
| + return nullptr; |
| + } |
| + std::vector<Channel> channels = bridge_->GetChannels(); |
| + if (channels.empty()) { |
| + return nullptr; |
| + } |
| + std::list<content_settings::Rule> rules; |
| + for (const auto& channel : channels) { |
| + DCHECK(channel.status != NotificationChannelStatus::UNAVAILABLE); |
|
Peter Beverloo
2017/06/02 15:14:26
nit: DCHECK_NE
awdf
2017/06/02 16:59:48
Done.
|
| + rules.push_back(content_settings::Rule( |
| + ContentSettingsPattern::FromString(channel.origin), |
| + ContentSettingsPattern(), |
| + new base::Value(ChannelStatusToContentSetting(channel.status)))); |
| + } |
| + return std::unique_ptr<content_settings::RuleIterator>( |
| + new ListIterator(rules)); |
|
Peter Beverloo
2017/06/02 15:14:26
nit (the compiler can figure out typing):
return
awdf
2017/06/02 16:59:48
Done.
|
| } |
| bool NotificationChannelsProviderAndroid::SetWebsiteSetting( |