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/permissions/permission_request_manager.h" | 5 #include "chrome/browser/permissions/permission_request_manager.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/metrics/field_trial.h" | 8 #include "base/metrics/field_trial.h" |
| 9 #include "base/test/scoped_feature_list.h" |
9 #include "build/build_config.h" | 10 #include "build/build_config.h" |
10 #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" | 11 #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" |
11 #include "chrome/browser/custom_handlers/register_protocol_handler_permission_re
quest.h" | 12 #include "chrome/browser/custom_handlers/register_protocol_handler_permission_re
quest.h" |
12 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" | 13 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" |
13 #include "chrome/browser/media/webrtc/media_stream_devices_controller.h" | 14 #include "chrome/browser/media/webrtc/media_stream_devices_controller.h" |
14 #include "chrome/browser/permissions/permission_context_base.h" | 15 #include "chrome/browser/permissions/permission_context_base.h" |
15 #include "chrome/browser/permissions/permission_request_impl.h" | 16 #include "chrome/browser/permissions/permission_request_impl.h" |
16 #include "chrome/browser/permissions/permission_util.h" | 17 #include "chrome/browser/permissions/permission_util.h" |
17 #include "chrome/browser/profiles/profile.h" | 18 #include "chrome/browser/profiles/profile.h" |
18 #include "chrome/browser/ui/browser.h" | 19 #include "chrome/browser/ui/browser.h" |
19 #include "chrome/browser/ui/permission_bubble/mock_permission_prompt_factory.h" | 20 #include "chrome/browser/ui/permission_bubble/mock_permission_prompt_factory.h" |
20 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 21 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
21 #include "chrome/browser/ui/test/test_browser_dialog.h" | 22 #include "chrome/browser/ui/test/test_browser_dialog.h" |
| 23 #include "chrome/common/chrome_features.h" |
22 #include "chrome/test/base/in_process_browser_test.h" | 24 #include "chrome/test/base/in_process_browser_test.h" |
23 #include "chrome/test/base/ui_test_utils.h" | 25 #include "chrome/test/base/ui_test_utils.h" |
24 #include "components/content_settings/core/common/content_settings_types.h" | 26 #include "components/content_settings/core/common/content_settings_types.h" |
25 #include "components/variations/variations_associated_data.h" | 27 #include "components/variations/variations_associated_data.h" |
26 #include "content/public/browser/render_frame_host.h" | 28 #include "content/public/browser/render_frame_host.h" |
27 #include "content/public/browser/render_process_host.h" | 29 #include "content/public/browser/render_process_host.h" |
28 #include "content/public/test/browser_test_utils.h" | 30 #include "content/public/test/browser_test_utils.h" |
29 #include "content/public/test/test_utils.h" | 31 #include "content/public/test/test_utils.h" |
30 #include "net/test/embedded_test_server/embedded_test_server.h" | 32 #include "net/test/embedded_test_server/embedded_test_server.h" |
31 | 33 |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 base::Bind(decided), base::Bind(cleanup))); | 208 base::Bind(decided), base::Bind(cleanup))); |
207 return owned_requests_.back().get(); | 209 return owned_requests_.back().get(); |
208 } | 210 } |
209 | 211 |
210 void PermissionDialogTest::ShowDialog(const std::string& name) { | 212 void PermissionDialogTest::ShowDialog(const std::string& name) { |
211 constexpr const char* kMultipleName = "multiple"; | 213 constexpr const char* kMultipleName = "multiple"; |
212 // Permissions to request for a "multiple" request. Only types handled in | 214 // Permissions to request for a "multiple" request. Only types handled in |
213 // PermissionRequestImpl::GetMessageTextFragment() are valid. | 215 // PermissionRequestImpl::GetMessageTextFragment() are valid. |
214 constexpr ContentSettingsType kMultipleRequests[] = { | 216 constexpr ContentSettingsType kMultipleRequests[] = { |
215 CONTENT_SETTINGS_TYPE_GEOLOCATION, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, | 217 CONTENT_SETTINGS_TYPE_GEOLOCATION, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, |
216 CONTENT_SETTINGS_TYPE_MIDI_SYSEX}; | 218 CONTENT_SETTINGS_TYPE_MIDI_SYSEX, |
| 219 }; |
| 220 constexpr ContentSettingsType kMultipleRequestsWithMedia[] = { |
| 221 CONTENT_SETTINGS_TYPE_GEOLOCATION, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, |
| 222 CONTENT_SETTINGS_TYPE_MIDI_SYSEX, CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, |
| 223 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA}; |
217 constexpr struct { | 224 constexpr struct { |
218 const char* name; | 225 const char* name; |
219 ContentSettingsType type; | 226 ContentSettingsType type; |
220 } kNameToType[] = { | 227 } kNameToType[] = { |
221 {"flash", CONTENT_SETTINGS_TYPE_PLUGINS}, | 228 {"flash", CONTENT_SETTINGS_TYPE_PLUGINS}, |
222 {"geolocation", CONTENT_SETTINGS_TYPE_GEOLOCATION}, | 229 {"geolocation", CONTENT_SETTINGS_TYPE_GEOLOCATION}, |
223 {"protected_media", CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER}, | 230 {"protected_media", CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER}, |
224 {"notifications", CONTENT_SETTINGS_TYPE_NOTIFICATIONS}, | 231 {"notifications", CONTENT_SETTINGS_TYPE_NOTIFICATIONS}, |
225 {"mic", CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC}, | 232 {"mic", CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC}, |
226 {"camera", CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA}, | 233 {"camera", CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA}, |
(...skipping 15 matching lines...) Expand all Loading... |
242 manager->AddRequest(MakeRegisterProtocolHandlerRequest()); | 249 manager->AddRequest(MakeRegisterProtocolHandlerRequest()); |
243 break; | 250 break; |
244 case CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS: | 251 case CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS: |
245 // TODO(tapted): Prompt for downloading multiple files. | 252 // TODO(tapted): Prompt for downloading multiple files. |
246 break; | 253 break; |
247 case CONTENT_SETTINGS_TYPE_DURABLE_STORAGE: | 254 case CONTENT_SETTINGS_TYPE_DURABLE_STORAGE: |
248 // TODO(tapted): Prompt for quota request. | 255 // TODO(tapted): Prompt for quota request. |
249 break; | 256 break; |
250 case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC: | 257 case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC: |
251 case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA: | 258 case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA: |
252 AddMediaRequest(manager, it->type); | 259 if (base::FeatureList::IsEnabled( |
| 260 features::kUsePermissionManagerForMediaRequests)) { |
| 261 manager->AddRequest(MakePermissionRequest(it->type)); |
| 262 } else { |
| 263 AddMediaRequest(manager, it->type); |
| 264 } |
253 break; | 265 break; |
254 // Regular permissions requests. | 266 // Regular permissions requests. |
255 case CONTENT_SETTINGS_TYPE_MIDI_SYSEX: | 267 case CONTENT_SETTINGS_TYPE_MIDI_SYSEX: |
256 case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING: // Same as notifications. | 268 case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING: // Same as notifications. |
257 case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: | 269 case CONTENT_SETTINGS_TYPE_NOTIFICATIONS: |
258 case CONTENT_SETTINGS_TYPE_GEOLOCATION: | 270 case CONTENT_SETTINGS_TYPE_GEOLOCATION: |
259 case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER: // ChromeOS only. | 271 case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER: // ChromeOS only. |
260 case CONTENT_SETTINGS_TYPE_PPAPI_BROKER: | 272 case CONTENT_SETTINGS_TYPE_PPAPI_BROKER: |
261 case CONTENT_SETTINGS_TYPE_PLUGINS: // Flash. | 273 case CONTENT_SETTINGS_TYPE_PLUGINS: // Flash. |
262 manager->AddRequest(MakePermissionRequest(it->type)); | 274 manager->AddRequest(MakePermissionRequest(it->type)); |
263 break; | 275 break; |
264 case CONTENT_SETTINGS_TYPE_DEFAULT: | 276 case CONTENT_SETTINGS_TYPE_DEFAULT: |
265 EXPECT_EQ(kMultipleName, name); | 277 EXPECT_EQ(kMultipleName, name); |
266 for (auto request : kMultipleRequests) | 278 if (base::FeatureList::IsEnabled( |
267 manager->AddRequest(MakePermissionRequest(request)); | 279 features::kUsePermissionManagerForMediaRequests)) { |
| 280 for (auto request : kMultipleRequestsWithMedia) |
| 281 manager->AddRequest(MakePermissionRequest(request)); |
| 282 } else { |
| 283 for (auto request : kMultipleRequests) |
| 284 manager->AddRequest(MakePermissionRequest(request)); |
| 285 } |
| 286 |
268 break; | 287 break; |
269 default: | 288 default: |
270 ADD_FAILURE() << "Not a permission type, or one that doesn't prompt."; | 289 ADD_FAILURE() << "Not a permission type, or one that doesn't prompt."; |
271 return; | 290 return; |
272 } | 291 } |
273 manager->DisplayPendingRequests(); | 292 manager->DisplayPendingRequests(); |
274 } | 293 } |
275 | 294 |
276 // Requests before the load event should be bundled into one bubble. | 295 // Requests before the load event should be bundled into one bubble. |
277 // http://crbug.com/512849 flaky | 296 // http://crbug.com/512849 flaky |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
462 } | 481 } |
463 | 482 |
464 // Host wants to show notifications. | 483 // Host wants to show notifications. |
465 IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_notifications) { | 484 IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_notifications) { |
466 RunDialog(); | 485 RunDialog(); |
467 } | 486 } |
468 | 487 |
469 // Host wants to use your microphone. | 488 // Host wants to use your microphone. |
470 IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_mic) { | 489 IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_mic) { |
471 RunDialog(); | 490 RunDialog(); |
| 491 |
| 492 { |
| 493 base::test::ScopedFeatureList scoped_feature_list; |
| 494 scoped_feature_list.InitAndEnableFeature( |
| 495 features::kUsePermissionManagerForMediaRequests); |
| 496 RunDialog(); |
| 497 } |
472 } | 498 } |
473 | 499 |
474 // Host wants to use your camera. | 500 // Host wants to use your camera. |
475 IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_camera) { | 501 IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_camera) { |
476 RunDialog(); | 502 RunDialog(); |
| 503 |
| 504 { |
| 505 base::test::ScopedFeatureList scoped_feature_list; |
| 506 scoped_feature_list.InitAndEnableFeature( |
| 507 features::kUsePermissionManagerForMediaRequests); |
| 508 RunDialog(); |
| 509 } |
477 } | 510 } |
478 | 511 |
479 // Host wants to open email links. | 512 // Host wants to open email links. |
480 IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_protocol_handlers) { | 513 IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_protocol_handlers) { |
481 RunDialog(); | 514 RunDialog(); |
482 } | 515 } |
483 | 516 |
484 // Host wants to use your MIDI devices. | 517 // Host wants to use your MIDI devices. |
485 IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_midi) { | 518 IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_midi) { |
486 RunDialog(); | 519 RunDialog(); |
487 } | 520 } |
488 | 521 |
489 // Shows a permissions bubble with multiple requests. | 522 // Shows a permissions bubble with multiple requests. |
490 IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_multiple) { | 523 IN_PROC_BROWSER_TEST_F(PermissionDialogTest, InvokeDialog_multiple) { |
491 RunDialog(); | 524 RunDialog(); |
| 525 |
| 526 { |
| 527 base::test::ScopedFeatureList scoped_feature_list; |
| 528 scoped_feature_list.InitAndEnableFeature( |
| 529 features::kUsePermissionManagerForMediaRequests); |
| 530 RunDialog(); |
| 531 } |
492 } | 532 } |
493 | 533 |
494 // CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER is ChromeOS only. | 534 // CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER is ChromeOS only. |
495 #if defined(OS_CHROMEOS) | 535 #if defined(OS_CHROMEOS) |
496 #define MAYBE_InvokeDialog_protected_media InvokeDialog_protected_media | 536 #define MAYBE_InvokeDialog_protected_media InvokeDialog_protected_media |
497 #else | 537 #else |
498 #define MAYBE_InvokeDialog_protected_media DISABLED_InvokeDialog_protected_media | 538 #define MAYBE_InvokeDialog_protected_media DISABLED_InvokeDialog_protected_media |
499 #endif | 539 #endif |
500 IN_PROC_BROWSER_TEST_F(PermissionDialogTest, | 540 IN_PROC_BROWSER_TEST_F(PermissionDialogTest, |
501 MAYBE_InvokeDialog_protected_media) { | 541 MAYBE_InvokeDialog_protected_media) { |
502 RunDialog(); | 542 RunDialog(); |
503 } | 543 } |
504 | 544 |
505 } // anonymous namespace | 545 } // anonymous namespace |
OLD | NEW |