| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 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 #include "chrome/browser/push_messaging/push_messaging_permission_context.h" | |
| 6 | |
| 7 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" | |
| 8 #include "chrome/browser/permissions/permission_request_id.h" | |
| 9 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | |
| 10 #include "chrome/test/base/testing_profile.h" | |
| 11 #include "components/content_settings/core/browser/host_content_settings_map.h" | |
| 12 #include "components/content_settings/core/common/content_settings.h" | |
| 13 #include "components/content_settings/core/common/content_settings_types.h" | |
| 14 #include "content/public/browser/web_contents.h" | |
| 15 #include "testing/gtest/include/gtest/gtest.h" | |
| 16 | |
| 17 namespace { | |
| 18 | |
| 19 const char kOriginA[] = "https://origina.org"; | |
| 20 const char kOriginB[] = "https://originb.org"; | |
| 21 const char kInsecureOrigin[] = "http://insecureorigin.org"; | |
| 22 | |
| 23 void DoNothing(ContentSetting content_setting) {} | |
| 24 | |
| 25 class TestPushMessagingPermissionContext | |
| 26 : public PushMessagingPermissionContext { | |
| 27 public: | |
| 28 explicit TestPushMessagingPermissionContext(Profile* profile) | |
| 29 : PushMessagingPermissionContext(profile), | |
| 30 was_persisted_(false), | |
| 31 permission_granted_(false) {} | |
| 32 | |
| 33 bool was_persisted() const { return was_persisted_; } | |
| 34 bool was_granted() const { return permission_granted_; } | |
| 35 | |
| 36 private: | |
| 37 // PushMessagingPermissionContext: | |
| 38 void NotifyPermissionSet(const PermissionRequestID& id, | |
| 39 const GURL& requesting_origin, | |
| 40 const GURL& embedder_origin, | |
| 41 const BrowserPermissionCallback& callback, | |
| 42 bool persist, | |
| 43 ContentSetting content_setting) override { | |
| 44 was_persisted_ = persist; | |
| 45 permission_granted_ = content_setting == CONTENT_SETTING_ALLOW; | |
| 46 PushMessagingPermissionContext::NotifyPermissionSet( | |
| 47 id, requesting_origin, embedder_origin, callback, persist, | |
| 48 content_setting); | |
| 49 } | |
| 50 | |
| 51 bool was_persisted_; | |
| 52 bool permission_granted_; | |
| 53 }; | |
| 54 | |
| 55 class PushMessagingPermissionContextTest | |
| 56 : public ChromeRenderViewHostTestHarness { | |
| 57 public: | |
| 58 PushMessagingPermissionContextTest() {} | |
| 59 | |
| 60 protected: | |
| 61 void SetContentSetting(Profile* profile, | |
| 62 ContentSettingsType setting, | |
| 63 ContentSetting value) { | |
| 64 // These urls must match those in | |
| 65 // PermissionContextBase::UpdateContentSetting, since the tests below use | |
| 66 // this method to overwrite urls set as a result of | |
| 67 // PushMessagingPermissionContext::NotifyPermissionSet. | |
| 68 GURL url_a = GURL(kOriginA); | |
| 69 GURL insecure_url = GURL(kInsecureOrigin); | |
| 70 HostContentSettingsMap* host_content_settings_map = | |
| 71 HostContentSettingsMapFactory::GetForProfile(profile); | |
| 72 | |
| 73 host_content_settings_map->SetContentSettingDefaultScope( | |
| 74 url_a, url_a, setting, std::string(), value); | |
| 75 host_content_settings_map->SetContentSettingDefaultScope( | |
| 76 insecure_url, insecure_url, setting, std::string(), value); | |
| 77 } | |
| 78 }; | |
| 79 | |
| 80 } // namespace | |
| 81 | |
| 82 TEST_F(PushMessagingPermissionContextTest, HasPermissionPrompt) { | |
| 83 TestingProfile profile; | |
| 84 PushMessagingPermissionContext context(&profile); | |
| 85 EXPECT_EQ(CONTENT_SETTING_ASK, | |
| 86 context.GetPermissionStatus(GURL(kOriginA), GURL(kOriginA))); | |
| 87 | |
| 88 // Just granting push messaging permission should still prompt. | |
| 89 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, | |
| 90 CONTENT_SETTING_ALLOW); | |
| 91 | |
| 92 EXPECT_EQ(CONTENT_SETTING_ASK, | |
| 93 context.GetPermissionStatus(GURL(kOriginA), GURL(kOriginA))); | |
| 94 | |
| 95 // Just granting notifications should allow if push messaging is not blocked. | |
| 96 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, | |
| 97 CONTENT_SETTING_ASK); | |
| 98 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, | |
| 99 CONTENT_SETTING_ALLOW); | |
| 100 | |
| 101 EXPECT_EQ(CONTENT_SETTING_ASK, | |
| 102 context.GetPermissionStatus(GURL(kOriginA), GURL(kOriginA))); | |
| 103 | |
| 104 // Granting allow notifications but explicitly denying push messaging should | |
| 105 // block. | |
| 106 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, | |
| 107 CONTENT_SETTING_ALLOW); | |
| 108 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, | |
| 109 CONTENT_SETTING_BLOCK); | |
| 110 | |
| 111 EXPECT_EQ(CONTENT_SETTING_BLOCK, | |
| 112 context.GetPermissionStatus(GURL(kOriginA), GURL(kOriginA))); | |
| 113 } | |
| 114 | |
| 115 TEST_F(PushMessagingPermissionContextTest, HasPermissionDenySettingsMismatch) { | |
| 116 TestingProfile profile; | |
| 117 PushMessagingPermissionContext context(&profile); | |
| 118 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, | |
| 119 CONTENT_SETTING_BLOCK); | |
| 120 EXPECT_EQ(CONTENT_SETTING_BLOCK, | |
| 121 context.GetPermissionStatus(GURL(kOriginA), GURL(kOriginA))); | |
| 122 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, | |
| 123 CONTENT_SETTING_ASK); | |
| 124 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, | |
| 125 CONTENT_SETTING_BLOCK); | |
| 126 EXPECT_EQ(CONTENT_SETTING_BLOCK, | |
| 127 context.GetPermissionStatus(GURL(kOriginA), GURL(kOriginA))); | |
| 128 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, | |
| 129 CONTENT_SETTING_ALLOW); | |
| 130 EXPECT_EQ(CONTENT_SETTING_BLOCK, | |
| 131 context.GetPermissionStatus(GURL(kOriginA), GURL(kOriginA))); | |
| 132 | |
| 133 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, | |
| 134 CONTENT_SETTING_ASK); | |
| 135 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, | |
| 136 CONTENT_SETTING_BLOCK); | |
| 137 EXPECT_EQ(CONTENT_SETTING_BLOCK, | |
| 138 context.GetPermissionStatus(GURL(kOriginA), GURL(kOriginA))); | |
| 139 } | |
| 140 | |
| 141 TEST_F(PushMessagingPermissionContextTest, HasPermissionDenyDifferentOrigins) { | |
| 142 TestingProfile profile; | |
| 143 PushMessagingPermissionContext context(&profile); | |
| 144 EXPECT_EQ(CONTENT_SETTING_BLOCK, | |
| 145 context.GetPermissionStatus(GURL(kOriginB), GURL(kOriginA))); | |
| 146 } | |
| 147 | |
| 148 TEST_F(PushMessagingPermissionContextTest, HasPermissionAccept) { | |
| 149 TestingProfile profile; | |
| 150 PushMessagingPermissionContext context(&profile); | |
| 151 | |
| 152 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, | |
| 153 CONTENT_SETTING_ALLOW); | |
| 154 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, | |
| 155 CONTENT_SETTING_ALLOW); | |
| 156 EXPECT_EQ(CONTENT_SETTING_ALLOW, | |
| 157 context.GetPermissionStatus(GURL(kOriginA), GURL(kOriginA))); | |
| 158 } | |
| 159 | |
| 160 TEST_F(PushMessagingPermissionContextTest, DecidePushPermission) { | |
| 161 TestingProfile profile; | |
| 162 TestPushMessagingPermissionContext context(&profile); | |
| 163 PermissionRequestID request_id(-1, -1, -1); | |
| 164 BrowserPermissionCallback callback = base::Bind(DoNothing); | |
| 165 | |
| 166 context.DecidePushPermission(request_id, GURL(kOriginA), GURL(kOriginA), | |
| 167 callback, | |
| 168 blink::mojom::PermissionStatus::DENIED); | |
| 169 EXPECT_FALSE(context.was_persisted()); | |
| 170 EXPECT_FALSE(context.was_granted()); | |
| 171 | |
| 172 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, | |
| 173 CONTENT_SETTING_ALLOW); | |
| 174 context.DecidePushPermission(request_id, GURL(kOriginA), GURL(kOriginA), | |
| 175 callback, | |
| 176 blink::mojom::PermissionStatus::GRANTED); | |
| 177 EXPECT_TRUE(context.was_persisted()); | |
| 178 EXPECT_TRUE(context.was_granted()); | |
| 179 | |
| 180 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, | |
| 181 CONTENT_SETTING_BLOCK); | |
| 182 context.DecidePushPermission(request_id, GURL(kOriginA), GURL(kOriginA), | |
| 183 callback, | |
| 184 blink::mojom::PermissionStatus::GRANTED); | |
| 185 EXPECT_TRUE(context.was_persisted()); | |
| 186 EXPECT_FALSE(context.was_granted()); | |
| 187 | |
| 188 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, | |
| 189 CONTENT_SETTING_ASK); | |
| 190 context.DecidePushPermission(request_id, GURL(kOriginA), GURL(kOriginA), | |
| 191 callback, | |
| 192 blink::mojom::PermissionStatus::GRANTED); | |
| 193 EXPECT_TRUE(context.was_persisted()); | |
| 194 EXPECT_TRUE(context.was_granted()); | |
| 195 } | |
| 196 | |
| 197 TEST_F(PushMessagingPermissionContextTest, DecidePermission) { | |
| 198 TestingProfile profile; | |
| 199 TestPushMessagingPermissionContext context(&profile); | |
| 200 PermissionRequestID request_id(-1, -1, -1); | |
| 201 BrowserPermissionCallback callback = base::Bind(DoNothing); | |
| 202 | |
| 203 // Requesting and embedding origin are different. | |
| 204 context.DecidePermission(NULL, request_id, GURL(kOriginA), GURL(kOriginB), | |
| 205 true /* user_gesture */, callback); | |
| 206 EXPECT_FALSE(context.was_persisted()); | |
| 207 EXPECT_FALSE(context.was_granted()); | |
| 208 | |
| 209 // Insecure origin | |
| 210 NavigateAndCommit(GURL(kInsecureOrigin)); | |
| 211 context.RequestPermission(web_contents(), request_id, GURL(kInsecureOrigin), | |
| 212 true /* user_gesture */, callback); | |
| 213 EXPECT_FALSE(context.was_persisted()); | |
| 214 EXPECT_FALSE(context.was_granted()); | |
| 215 } | |
| 216 | |
| 217 TEST_F(PushMessagingPermissionContextTest, RequestPermission) { | |
| 218 TestingProfile profile; | |
| 219 TestPushMessagingPermissionContext context(&profile); | |
| 220 PermissionRequestID request_id(-1, -1, -1); | |
| 221 BrowserPermissionCallback callback = base::Bind(DoNothing); | |
| 222 | |
| 223 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, | |
| 224 CONTENT_SETTING_ALLOW); | |
| 225 | |
| 226 EXPECT_EQ( | |
| 227 CONTENT_SETTING_ASK, | |
| 228 HostContentSettingsMapFactory::GetForProfile(&profile)->GetContentSetting( | |
| 229 GURL(kOriginA), GURL(kOriginA), CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, | |
| 230 std::string())); | |
| 231 EXPECT_EQ(CONTENT_SETTING_ALLOW, | |
| 232 context.GetPermissionStatus(GURL(kOriginA), GURL(kOriginA))); | |
| 233 | |
| 234 // If a website already has notifications permission, push permission is | |
| 235 // silently assumed to be granted. | |
| 236 NavigateAndCommit(GURL(kOriginA)); | |
| 237 context.RequestPermission(web_contents(), request_id, GURL(kOriginA), | |
| 238 true /* user_gesture */, callback); | |
| 239 | |
| 240 // Although the permission check goes through, the push message permission | |
| 241 // isn't actually updated. | |
| 242 EXPECT_TRUE(context.was_granted()); | |
| 243 EXPECT_EQ( | |
| 244 CONTENT_SETTING_ASK, | |
| 245 HostContentSettingsMapFactory::GetForProfile(&profile)->GetContentSetting( | |
| 246 GURL(kOriginA), GURL(kOriginA), CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, | |
| 247 std::string())); | |
| 248 EXPECT_EQ(CONTENT_SETTING_ALLOW, | |
| 249 context.GetPermissionStatus(GURL(kOriginA), GURL(kOriginA))); | |
| 250 } | |
| 251 | |
| 252 TEST_F(PushMessagingPermissionContextTest, RequestAfterRevokingNotifications) { | |
| 253 TestingProfile profile; | |
| 254 TestPushMessagingPermissionContext context(&profile); | |
| 255 PermissionRequestID request_id(-1, -1, -1); | |
| 256 BrowserPermissionCallback callback = base::Bind(DoNothing); | |
| 257 | |
| 258 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, | |
| 259 CONTENT_SETTING_ALLOW); | |
| 260 | |
| 261 NavigateAndCommit(GURL(kOriginA)); | |
| 262 context.RequestPermission(web_contents(), request_id, GURL(kOriginA), | |
| 263 true /* user_gesture */, callback); | |
| 264 EXPECT_TRUE(context.was_granted()); | |
| 265 | |
| 266 EXPECT_EQ(CONTENT_SETTING_ALLOW, | |
| 267 context.GetPermissionStatus(GURL(kOriginA), GURL(kOriginA))); | |
| 268 | |
| 269 // Revoke notifications permission. This should revoke push, and prevent | |
| 270 // future requests for push from succeeding. | |
| 271 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, | |
| 272 CONTENT_SETTING_BLOCK); | |
| 273 | |
| 274 EXPECT_EQ(CONTENT_SETTING_BLOCK, | |
| 275 context.GetPermissionStatus(GURL(kOriginA), GURL(kOriginA))); | |
| 276 | |
| 277 context.RequestPermission(web_contents(), request_id, GURL(kOriginA), | |
| 278 true /* user_gesture */, callback); | |
| 279 EXPECT_FALSE(context.was_persisted()); | |
| 280 EXPECT_FALSE(context.was_granted()); | |
| 281 EXPECT_EQ(CONTENT_SETTING_BLOCK, | |
| 282 context.GetPermissionStatus(GURL(kOriginA), GURL(kOriginA))); | |
| 283 } | |
| 284 | |
| 285 TEST_F(PushMessagingPermissionContextTest, GetPermissionStatusInsecureOrigin) { | |
| 286 TestingProfile profile; | |
| 287 TestPushMessagingPermissionContext context(&profile); | |
| 288 | |
| 289 // The status should be blocked for an insecure origin, regardless of the | |
| 290 // content setting value. | |
| 291 EXPECT_EQ(CONTENT_SETTING_BLOCK, | |
| 292 context.GetPermissionStatus(GURL(kInsecureOrigin), | |
| 293 GURL(kInsecureOrigin))); | |
| 294 | |
| 295 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, | |
| 296 CONTENT_SETTING_ALLOW); | |
| 297 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, | |
| 298 CONTENT_SETTING_ALLOW); | |
| 299 EXPECT_EQ(CONTENT_SETTING_BLOCK, | |
| 300 context.GetPermissionStatus(GURL(kInsecureOrigin), | |
| 301 GURL(kInsecureOrigin))); | |
| 302 | |
| 303 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, | |
| 304 CONTENT_SETTING_BLOCK); | |
| 305 EXPECT_EQ(CONTENT_SETTING_BLOCK, | |
| 306 context.GetPermissionStatus(GURL(kInsecureOrigin), | |
| 307 GURL(kInsecureOrigin))); | |
| 308 | |
| 309 SetContentSetting(&profile, CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, | |
| 310 CONTENT_SETTING_ASK); | |
| 311 EXPECT_EQ(CONTENT_SETTING_BLOCK, | |
| 312 context.GetPermissionStatus(GURL(kInsecureOrigin), | |
| 313 GURL(kInsecureOrigin))); | |
| 314 } | |
| OLD | NEW |