| 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 |