| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/notifications/notification_permission_context.h" | 5 #include "chrome/browser/notifications/notification_permission_context.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "base/test/test_mock_time_task_runner.h" | 9 #include "base/test/test_mock_time_task_runner.h" |
| 10 #include "base/threading/thread_task_runner_handle.h" | 10 #include "base/threading/thread_task_runner_handle.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 #include "url/gurl.h" | 27 #include "url/gurl.h" |
| 28 | 28 |
| 29 namespace { | 29 namespace { |
| 30 | 30 |
| 31 void DoNothing(ContentSetting content_setting) {} | 31 void DoNothing(ContentSetting content_setting) {} |
| 32 void DoNothing2(blink::mojom::PermissionStatus status) {} | 32 void DoNothing2(blink::mojom::PermissionStatus status) {} |
| 33 | 33 |
| 34 class TestNotificationPermissionContext : public NotificationPermissionContext { | 34 class TestNotificationPermissionContext : public NotificationPermissionContext { |
| 35 public: | 35 public: |
| 36 explicit TestNotificationPermissionContext(Profile* profile) | 36 explicit TestNotificationPermissionContext(Profile* profile) |
| 37 : NotificationPermissionContext(profile), | 37 : NotificationPermissionContext(profile, |
| 38 content::PermissionType::NOTIFICATIONS), |
| 38 permission_set_count_(0), | 39 permission_set_count_(0), |
| 39 last_permission_set_persisted_(false), | 40 last_permission_set_persisted_(false), |
| 40 last_permission_set_setting_(CONTENT_SETTING_DEFAULT) {} | 41 last_permission_set_setting_(CONTENT_SETTING_DEFAULT) {} |
| 41 | 42 |
| 42 int permission_set_count() const { return permission_set_count_; } | 43 int permission_set_count() const { return permission_set_count_; } |
| 43 bool last_permission_set_persisted() const { | 44 bool last_permission_set_persisted() const { |
| 44 return last_permission_set_persisted_; | 45 return last_permission_set_persisted_; |
| 45 } | 46 } |
| 46 ContentSetting last_permission_set_setting() const { | 47 ContentSetting last_permission_set_setting() const { |
| 47 return last_permission_set_setting_; | 48 return last_permission_set_setting_; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 68 NotificationPermissionContext::NotifyPermissionSet( | 69 NotificationPermissionContext::NotifyPermissionSet( |
| 69 id, requesting_origin, embedder_origin, callback, persist, | 70 id, requesting_origin, embedder_origin, callback, persist, |
| 70 content_setting); | 71 content_setting); |
| 71 } | 72 } |
| 72 | 73 |
| 73 int permission_set_count_; | 74 int permission_set_count_; |
| 74 bool last_permission_set_persisted_; | 75 bool last_permission_set_persisted_; |
| 75 ContentSetting last_permission_set_setting_; | 76 ContentSetting last_permission_set_setting_; |
| 76 }; | 77 }; |
| 77 | 78 |
| 79 } // namespace |
| 80 |
| 78 class NotificationPermissionContextTest | 81 class NotificationPermissionContextTest |
| 79 : public ChromeRenderViewHostTestHarness { | 82 : public ChromeRenderViewHostTestHarness { |
| 80 public: | 83 public: |
| 81 scoped_refptr<base::TestMockTimeTaskRunner> SwitchToMockTime() { | 84 scoped_refptr<base::TestMockTimeTaskRunner> SwitchToMockTime() { |
| 82 old_task_runner_ = base::ThreadTaskRunnerHandle::Get(); | 85 old_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
| 83 scoped_refptr<base::TestMockTimeTaskRunner> task_runner( | 86 scoped_refptr<base::TestMockTimeTaskRunner> task_runner( |
| 84 new base::TestMockTimeTaskRunner(base::Time::Now(), | 87 new base::TestMockTimeTaskRunner(base::Time::Now(), |
| 85 base::TimeTicks::Now())); | 88 base::TimeTicks::Now())); |
| 86 base::MessageLoop::current()->SetTaskRunner(task_runner); | 89 base::MessageLoop::current()->SetTaskRunner(task_runner); |
| 87 return task_runner; | 90 return task_runner; |
| 88 } | 91 } |
| 89 | 92 |
| 90 void TearDown() override { | 93 void TearDown() override { |
| 91 if (old_task_runner_) { | 94 if (old_task_runner_) { |
| 92 base::MessageLoop::current()->SetTaskRunner(old_task_runner_); | 95 base::MessageLoop::current()->SetTaskRunner(old_task_runner_); |
| 93 old_task_runner_ = nullptr; | 96 old_task_runner_ = nullptr; |
| 94 } | 97 } |
| 95 ChromeRenderViewHostTestHarness::TearDown(); | 98 ChromeRenderViewHostTestHarness::TearDown(); |
| 96 } | 99 } |
| 97 | 100 |
| 101 protected: |
| 102 void UpdateContentSetting(NotificationPermissionContext* context, |
| 103 const GURL& requesting_origin, |
| 104 const GURL& embedding_origin, |
| 105 ContentSetting setting) { |
| 106 context->UpdateContentSetting(requesting_origin, embedding_origin, setting); |
| 107 } |
| 108 |
| 98 private: | 109 private: |
| 99 scoped_refptr<base::SingleThreadTaskRunner> old_task_runner_; | 110 scoped_refptr<base::SingleThreadTaskRunner> old_task_runner_; |
| 100 }; | 111 }; |
| 101 | 112 |
| 102 } // namespace | |
| 103 | |
| 104 // Web Notification permission requests will completely ignore the embedder | 113 // Web Notification permission requests will completely ignore the embedder |
| 105 // origin. See https://crbug.com/416894. | 114 // origin. See https://crbug.com/416894. |
| 106 TEST_F(NotificationPermissionContextTest, IgnoresEmbedderOrigin) { | 115 TEST_F(NotificationPermissionContextTest, IgnoresEmbedderOrigin) { |
| 107 GURL requesting_origin("https://example.com"); | 116 GURL requesting_origin("https://example.com"); |
| 108 GURL embedding_origin("https://chrome.com"); | 117 GURL embedding_origin("https://chrome.com"); |
| 109 GURL different_origin("https://foobar.com"); | 118 GURL different_origin("https://foobar.com"); |
| 110 | 119 |
| 111 NotificationPermissionContext context(profile()); | 120 NotificationPermissionContext context(profile(), |
| 112 context.UpdateContentSetting(requesting_origin, | 121 content::PermissionType::NOTIFICATIONS); |
| 113 embedding_origin, | 122 UpdateContentSetting(&context, requesting_origin, embedding_origin, |
| 114 CONTENT_SETTING_ALLOW); | 123 CONTENT_SETTING_ALLOW); |
| 115 | 124 |
| 116 EXPECT_EQ(CONTENT_SETTING_ALLOW, | 125 EXPECT_EQ(CONTENT_SETTING_ALLOW, |
| 117 context.GetPermissionStatus(requesting_origin, embedding_origin)); | 126 context.GetPermissionStatus(requesting_origin, embedding_origin)); |
| 118 | 127 |
| 119 EXPECT_EQ(CONTENT_SETTING_ALLOW, | 128 EXPECT_EQ(CONTENT_SETTING_ALLOW, |
| 120 context.GetPermissionStatus(requesting_origin, different_origin)); | 129 context.GetPermissionStatus(requesting_origin, different_origin)); |
| 121 | 130 |
| 122 context.ResetPermission(requesting_origin, embedding_origin); | 131 context.ResetPermission(requesting_origin, embedding_origin); |
| 123 | 132 |
| 124 EXPECT_EQ(CONTENT_SETTING_ASK, | 133 EXPECT_EQ(CONTENT_SETTING_ASK, |
| 125 context.GetPermissionStatus(requesting_origin, embedding_origin)); | 134 context.GetPermissionStatus(requesting_origin, embedding_origin)); |
| 126 | 135 |
| 127 EXPECT_EQ(CONTENT_SETTING_ASK, | 136 EXPECT_EQ(CONTENT_SETTING_ASK, |
| 128 context.GetPermissionStatus(requesting_origin, different_origin)); | 137 context.GetPermissionStatus(requesting_origin, different_origin)); |
| 129 } | 138 } |
| 130 | 139 |
| 140 // Push messaging permission requests should only succeed for top level origins |
| 141 // (embedding origin == requesting origin). |
| 142 TEST_F(NotificationPermissionContextTest, PushTopLevelOriginOnly) { |
| 143 GURL requesting_origin("https://example.com"); |
| 144 GURL embedding_origin("https://chrome.com"); |
| 145 |
| 146 NotificationPermissionContext context( |
| 147 profile(), content::PermissionType::PUSH_MESSAGING); |
| 148 UpdateContentSetting(&context, requesting_origin, embedding_origin, |
| 149 CONTENT_SETTING_ALLOW); |
| 150 |
| 151 EXPECT_EQ(CONTENT_SETTING_BLOCK, |
| 152 context.GetPermissionStatus(requesting_origin, embedding_origin)); |
| 153 |
| 154 context.ResetPermission(requesting_origin, embedding_origin); |
| 155 |
| 156 UpdateContentSetting(&context, embedding_origin, embedding_origin, |
| 157 CONTENT_SETTING_ALLOW); |
| 158 |
| 159 EXPECT_EQ(CONTENT_SETTING_ALLOW, |
| 160 context.GetPermissionStatus(embedding_origin, embedding_origin)); |
| 161 |
| 162 context.ResetPermission(embedding_origin, embedding_origin); |
| 163 |
| 164 EXPECT_EQ(CONTENT_SETTING_ASK, |
| 165 context.GetPermissionStatus(embedding_origin, embedding_origin)); |
| 166 } |
| 167 |
| 131 // Web Notifications do not require a secure origin when requesting permission. | 168 // Web Notifications do not require a secure origin when requesting permission. |
| 132 // See https://crbug.com/404095. | 169 // See https://crbug.com/404095. |
| 133 TEST_F(NotificationPermissionContextTest, NoSecureOriginRequirement) { | 170 TEST_F(NotificationPermissionContextTest, NoSecureOriginRequirement) { |
| 134 GURL origin("http://example.com"); | 171 GURL origin("http://example.com"); |
| 135 | 172 |
| 136 NotificationPermissionContext context(profile()); | 173 NotificationPermissionContext context(profile(), |
| 174 content::PermissionType::NOTIFICATIONS); |
| 137 EXPECT_EQ(CONTENT_SETTING_ASK, | 175 EXPECT_EQ(CONTENT_SETTING_ASK, |
| 138 context.GetPermissionStatus(origin, origin)); | 176 context.GetPermissionStatus(origin, origin)); |
| 139 | 177 |
| 140 context.UpdateContentSetting(origin, origin, CONTENT_SETTING_ALLOW); | 178 UpdateContentSetting(&context, origin, origin, CONTENT_SETTING_ALLOW); |
| 141 | 179 |
| 142 EXPECT_EQ(CONTENT_SETTING_ALLOW, | 180 EXPECT_EQ(CONTENT_SETTING_ALLOW, |
| 143 context.GetPermissionStatus(origin, origin)); | 181 context.GetPermissionStatus(origin, origin)); |
| 144 } | 182 } |
| 145 | 183 |
| 184 // Push notifications requires a secure origin to acquire permission. |
| 185 TEST_F(NotificationPermissionContextTest, PushSecureOriginRequirement) { |
| 186 GURL origin("http://example.com"); |
| 187 GURL secure_origin("https://example.com"); |
| 188 |
| 189 NotificationPermissionContext context( |
| 190 profile(), content::PermissionType::PUSH_MESSAGING); |
| 191 EXPECT_EQ(CONTENT_SETTING_BLOCK, context.GetPermissionStatus(origin, origin)); |
| 192 |
| 193 UpdateContentSetting(&context, origin, origin, CONTENT_SETTING_ALLOW); |
| 194 |
| 195 EXPECT_EQ(CONTENT_SETTING_BLOCK, context.GetPermissionStatus(origin, origin)); |
| 196 |
| 197 EXPECT_EQ(CONTENT_SETTING_ASK, |
| 198 context.GetPermissionStatus(secure_origin, secure_origin)); |
| 199 |
| 200 UpdateContentSetting(&context, secure_origin, secure_origin, |
| 201 CONTENT_SETTING_ALLOW); |
| 202 |
| 203 EXPECT_EQ(CONTENT_SETTING_ALLOW, |
| 204 context.GetPermissionStatus(secure_origin, secure_origin)); |
| 205 } |
| 206 |
| 146 // Tests auto-denial after a time delay in incognito. | 207 // Tests auto-denial after a time delay in incognito. |
| 147 TEST_F(NotificationPermissionContextTest, TestDenyInIncognitoAfterDelay) { | 208 TEST_F(NotificationPermissionContextTest, TestDenyInIncognitoAfterDelay) { |
| 148 TestNotificationPermissionContext permission_context( | 209 TestNotificationPermissionContext permission_context( |
| 149 profile()->GetOffTheRecordProfile()); | 210 profile()->GetOffTheRecordProfile()); |
| 150 GURL url("https://www.example.com"); | 211 GURL url("https://www.example.com"); |
| 151 NavigateAndCommit(url); | 212 NavigateAndCommit(url); |
| 152 | 213 |
| 153 const PermissionRequestID id(web_contents()->GetRenderProcessHost()->GetID(), | 214 const PermissionRequestID id(web_contents()->GetRenderProcessHost()->GetID(), |
| 154 web_contents()->GetMainFrame()->GetRoutingID(), | 215 web_contents()->GetMainFrame()->GetRoutingID(), |
| 155 -1); | 216 -1); |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 // After another 2.5 seconds, the second permission request should also have | 355 // After another 2.5 seconds, the second permission request should also have |
| 295 // received a response. | 356 // received a response. |
| 296 task_runner->FastForwardBy(base::TimeDelta::FromMilliseconds(2500)); | 357 task_runner->FastForwardBy(base::TimeDelta::FromMilliseconds(2500)); |
| 297 EXPECT_EQ(2, permission_context.permission_set_count()); | 358 EXPECT_EQ(2, permission_context.permission_set_count()); |
| 298 EXPECT_TRUE(permission_context.last_permission_set_persisted()); | 359 EXPECT_TRUE(permission_context.last_permission_set_persisted()); |
| 299 EXPECT_EQ(CONTENT_SETTING_BLOCK, | 360 EXPECT_EQ(CONTENT_SETTING_BLOCK, |
| 300 permission_context.last_permission_set_setting()); | 361 permission_context.last_permission_set_setting()); |
| 301 EXPECT_EQ(CONTENT_SETTING_BLOCK, | 362 EXPECT_EQ(CONTENT_SETTING_BLOCK, |
| 302 permission_context.GetContentSettingFromMap(url, url)); | 363 permission_context.GetContentSettingFromMap(url, url)); |
| 303 } | 364 } |
| OLD | NEW |