| 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), | |
| 39 permission_set_count_(0), | 38 permission_set_count_(0), |
| 40 last_permission_set_persisted_(false), | 39 last_permission_set_persisted_(false), |
| 41 last_permission_set_setting_(CONTENT_SETTING_DEFAULT) {} | 40 last_permission_set_setting_(CONTENT_SETTING_DEFAULT) {} |
| 42 | 41 |
| 43 int permission_set_count() const { return permission_set_count_; } | 42 int permission_set_count() const { return permission_set_count_; } |
| 44 bool last_permission_set_persisted() const { | 43 bool last_permission_set_persisted() const { |
| 45 return last_permission_set_persisted_; | 44 return last_permission_set_persisted_; |
| 46 } | 45 } |
| 47 ContentSetting last_permission_set_setting() const { | 46 ContentSetting last_permission_set_setting() const { |
| 48 return last_permission_set_setting_; | 47 return last_permission_set_setting_; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 69 NotificationPermissionContext::NotifyPermissionSet( | 68 NotificationPermissionContext::NotifyPermissionSet( |
| 70 id, requesting_origin, embedder_origin, callback, persist, | 69 id, requesting_origin, embedder_origin, callback, persist, |
| 71 content_setting); | 70 content_setting); |
| 72 } | 71 } |
| 73 | 72 |
| 74 int permission_set_count_; | 73 int permission_set_count_; |
| 75 bool last_permission_set_persisted_; | 74 bool last_permission_set_persisted_; |
| 76 ContentSetting last_permission_set_setting_; | 75 ContentSetting last_permission_set_setting_; |
| 77 }; | 76 }; |
| 78 | 77 |
| 79 } // namespace | |
| 80 | |
| 81 class NotificationPermissionContextTest | 78 class NotificationPermissionContextTest |
| 82 : public ChromeRenderViewHostTestHarness { | 79 : public ChromeRenderViewHostTestHarness { |
| 83 public: | 80 public: |
| 84 scoped_refptr<base::TestMockTimeTaskRunner> SwitchToMockTime() { | 81 scoped_refptr<base::TestMockTimeTaskRunner> SwitchToMockTime() { |
| 85 old_task_runner_ = base::ThreadTaskRunnerHandle::Get(); | 82 old_task_runner_ = base::ThreadTaskRunnerHandle::Get(); |
| 86 scoped_refptr<base::TestMockTimeTaskRunner> task_runner( | 83 scoped_refptr<base::TestMockTimeTaskRunner> task_runner( |
| 87 new base::TestMockTimeTaskRunner(base::Time::Now(), | 84 new base::TestMockTimeTaskRunner(base::Time::Now(), |
| 88 base::TimeTicks::Now())); | 85 base::TimeTicks::Now())); |
| 89 base::MessageLoop::current()->SetTaskRunner(task_runner); | 86 base::MessageLoop::current()->SetTaskRunner(task_runner); |
| 90 return task_runner; | 87 return task_runner; |
| 91 } | 88 } |
| 92 | 89 |
| 93 void TearDown() override { | 90 void TearDown() override { |
| 94 if (old_task_runner_) { | 91 if (old_task_runner_) { |
| 95 base::MessageLoop::current()->SetTaskRunner(old_task_runner_); | 92 base::MessageLoop::current()->SetTaskRunner(old_task_runner_); |
| 96 old_task_runner_ = nullptr; | 93 old_task_runner_ = nullptr; |
| 97 } | 94 } |
| 98 ChromeRenderViewHostTestHarness::TearDown(); | 95 ChromeRenderViewHostTestHarness::TearDown(); |
| 99 } | 96 } |
| 100 | 97 |
| 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 | |
| 109 private: | 98 private: |
| 110 scoped_refptr<base::SingleThreadTaskRunner> old_task_runner_; | 99 scoped_refptr<base::SingleThreadTaskRunner> old_task_runner_; |
| 111 }; | 100 }; |
| 112 | 101 |
| 102 } // namespace |
| 103 |
| 113 // Web Notification permission requests will completely ignore the embedder | 104 // Web Notification permission requests will completely ignore the embedder |
| 114 // origin. See https://crbug.com/416894. | 105 // origin. See https://crbug.com/416894. |
| 115 TEST_F(NotificationPermissionContextTest, IgnoresEmbedderOrigin) { | 106 TEST_F(NotificationPermissionContextTest, IgnoresEmbedderOrigin) { |
| 116 GURL requesting_origin("https://example.com"); | 107 GURL requesting_origin("https://example.com"); |
| 117 GURL embedding_origin("https://chrome.com"); | 108 GURL embedding_origin("https://chrome.com"); |
| 118 GURL different_origin("https://foobar.com"); | 109 GURL different_origin("https://foobar.com"); |
| 119 | 110 |
| 120 NotificationPermissionContext context(profile(), | 111 NotificationPermissionContext context(profile()); |
| 121 content::PermissionType::NOTIFICATIONS); | 112 context.UpdateContentSetting(requesting_origin, |
| 122 UpdateContentSetting(&context, requesting_origin, embedding_origin, | 113 embedding_origin, |
| 123 CONTENT_SETTING_ALLOW); | 114 CONTENT_SETTING_ALLOW); |
| 124 | 115 |
| 125 EXPECT_EQ(CONTENT_SETTING_ALLOW, | 116 EXPECT_EQ(CONTENT_SETTING_ALLOW, |
| 126 context.GetPermissionStatus(requesting_origin, embedding_origin)); | 117 context.GetPermissionStatus(requesting_origin, embedding_origin)); |
| 127 | 118 |
| 128 EXPECT_EQ(CONTENT_SETTING_ALLOW, | 119 EXPECT_EQ(CONTENT_SETTING_ALLOW, |
| 129 context.GetPermissionStatus(requesting_origin, different_origin)); | 120 context.GetPermissionStatus(requesting_origin, different_origin)); |
| 130 | 121 |
| 131 context.ResetPermission(requesting_origin, embedding_origin); | 122 context.ResetPermission(requesting_origin, embedding_origin); |
| 132 | 123 |
| 133 EXPECT_EQ(CONTENT_SETTING_ASK, | 124 EXPECT_EQ(CONTENT_SETTING_ASK, |
| 134 context.GetPermissionStatus(requesting_origin, embedding_origin)); | 125 context.GetPermissionStatus(requesting_origin, embedding_origin)); |
| 135 | 126 |
| 136 EXPECT_EQ(CONTENT_SETTING_ASK, | 127 EXPECT_EQ(CONTENT_SETTING_ASK, |
| 137 context.GetPermissionStatus(requesting_origin, different_origin)); | 128 context.GetPermissionStatus(requesting_origin, different_origin)); |
| 138 } | 129 } |
| 139 | 130 |
| 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 | |
| 168 // Web Notifications do not require a secure origin when requesting permission. | 131 // Web Notifications do not require a secure origin when requesting permission. |
| 169 // See https://crbug.com/404095. | 132 // See https://crbug.com/404095. |
| 170 TEST_F(NotificationPermissionContextTest, NoSecureOriginRequirement) { | 133 TEST_F(NotificationPermissionContextTest, NoSecureOriginRequirement) { |
| 171 GURL origin("http://example.com"); | 134 GURL origin("http://example.com"); |
| 172 | 135 |
| 173 NotificationPermissionContext context(profile(), | 136 NotificationPermissionContext context(profile()); |
| 174 content::PermissionType::NOTIFICATIONS); | |
| 175 EXPECT_EQ(CONTENT_SETTING_ASK, | 137 EXPECT_EQ(CONTENT_SETTING_ASK, |
| 176 context.GetPermissionStatus(origin, origin)); | 138 context.GetPermissionStatus(origin, origin)); |
| 177 | 139 |
| 178 UpdateContentSetting(&context, origin, origin, CONTENT_SETTING_ALLOW); | 140 context.UpdateContentSetting(origin, origin, CONTENT_SETTING_ALLOW); |
| 179 | 141 |
| 180 EXPECT_EQ(CONTENT_SETTING_ALLOW, | 142 EXPECT_EQ(CONTENT_SETTING_ALLOW, |
| 181 context.GetPermissionStatus(origin, origin)); | 143 context.GetPermissionStatus(origin, origin)); |
| 182 } | 144 } |
| 183 | 145 |
| 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 | |
| 207 // Tests auto-denial after a time delay in incognito. | 146 // Tests auto-denial after a time delay in incognito. |
| 208 TEST_F(NotificationPermissionContextTest, TestDenyInIncognitoAfterDelay) { | 147 TEST_F(NotificationPermissionContextTest, TestDenyInIncognitoAfterDelay) { |
| 209 TestNotificationPermissionContext permission_context( | 148 TestNotificationPermissionContext permission_context( |
| 210 profile()->GetOffTheRecordProfile()); | 149 profile()->GetOffTheRecordProfile()); |
| 211 GURL url("https://www.example.com"); | 150 GURL url("https://www.example.com"); |
| 212 NavigateAndCommit(url); | 151 NavigateAndCommit(url); |
| 213 | 152 |
| 214 const PermissionRequestID id(web_contents()->GetRenderProcessHost()->GetID(), | 153 const PermissionRequestID id(web_contents()->GetRenderProcessHost()->GetID(), |
| 215 web_contents()->GetMainFrame()->GetRoutingID(), | 154 web_contents()->GetMainFrame()->GetRoutingID(), |
| 216 -1); | 155 -1); |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 // After another 2.5 seconds, the second permission request should also have | 294 // After another 2.5 seconds, the second permission request should also have |
| 356 // received a response. | 295 // received a response. |
| 357 task_runner->FastForwardBy(base::TimeDelta::FromMilliseconds(2500)); | 296 task_runner->FastForwardBy(base::TimeDelta::FromMilliseconds(2500)); |
| 358 EXPECT_EQ(2, permission_context.permission_set_count()); | 297 EXPECT_EQ(2, permission_context.permission_set_count()); |
| 359 EXPECT_TRUE(permission_context.last_permission_set_persisted()); | 298 EXPECT_TRUE(permission_context.last_permission_set_persisted()); |
| 360 EXPECT_EQ(CONTENT_SETTING_BLOCK, | 299 EXPECT_EQ(CONTENT_SETTING_BLOCK, |
| 361 permission_context.last_permission_set_setting()); | 300 permission_context.last_permission_set_setting()); |
| 362 EXPECT_EQ(CONTENT_SETTING_BLOCK, | 301 EXPECT_EQ(CONTENT_SETTING_BLOCK, |
| 363 permission_context.GetContentSettingFromMap(url, url)); | 302 permission_context.GetContentSettingFromMap(url, url)); |
| 364 } | 303 } |
| OLD | NEW |