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 |