Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Side by Side Diff: media/blink/key_system_config_selector.cc

Issue 2349813002: EME: Update MediaKeySystemConfiguration defaults; require non-empty capabilities (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "media/blink/key_system_config_selector.h" 5 #include "media/blink/key_system_config_selector.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 requirement == EmeFeatureRequirement::Optional) { 122 requirement == EmeFeatureRequirement::Optional) {
123 return EmeConfigRule::SUPPORTED; 123 return EmeConfigRule::SUPPORTED;
124 } 124 }
125 if (support == EmeFeatureSupport::NOT_SUPPORTED || 125 if (support == EmeFeatureSupport::NOT_SUPPORTED ||
126 requirement == EmeFeatureRequirement::NotAllowed) { 126 requirement == EmeFeatureRequirement::NotAllowed) {
127 return EmeConfigRule::PERSISTENCE_NOT_ALLOWED; 127 return EmeConfigRule::PERSISTENCE_NOT_ALLOWED;
128 } 128 }
129 return EmeConfigRule::PERSISTENCE_REQUIRED; 129 return EmeConfigRule::PERSISTENCE_REQUIRED;
130 } 130 }
131 131
132 static bool IsPersistentSessionType(
133 blink::WebEncryptedMediaSessionType sessionType) {
134 switch (sessionType) {
135 case blink::WebEncryptedMediaSessionType::Temporary:
136 return false;
137 case blink::WebEncryptedMediaSessionType::PersistentLicense:
138 return true;
139 case blink::WebEncryptedMediaSessionType::PersistentReleaseMessage:
140 return true;
141 case blink::WebEncryptedMediaSessionType::Unknown:
142 break;
143 }
144
145 NOTREACHED();
146 return false;
147 }
148
132 } // namespace 149 } // namespace
133 150
134 struct KeySystemConfigSelector::SelectionRequest { 151 struct KeySystemConfigSelector::SelectionRequest {
135 std::string key_system; 152 std::string key_system;
136 blink::WebVector<blink::WebMediaKeySystemConfiguration> 153 blink::WebVector<blink::WebMediaKeySystemConfiguration>
137 candidate_configurations; 154 candidate_configurations;
138 blink::WebSecurityOrigin security_origin; 155 blink::WebSecurityOrigin security_origin;
139 base::Callback<void(const blink::WebMediaKeySystemConfiguration&, 156 base::Callback<void(const blink::WebMediaKeySystemConfiguration&,
140 const CdmConfig&)> succeeded_cb; 157 const CdmConfig&)> succeeded_cb;
141 base::Callback<void(const blink::WebString&)> not_supported_cb; 158 base::Callback<void(const blink::WebString&)> not_supported_cb;
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 // 5. Return media type capabilities. 444 // 5. Return media type capabilities.
428 return true; 445 return true;
429 } 446 }
430 447
431 KeySystemConfigSelector::ConfigurationSupport 448 KeySystemConfigSelector::ConfigurationSupport
432 KeySystemConfigSelector::GetSupportedConfiguration( 449 KeySystemConfigSelector::GetSupportedConfiguration(
433 const std::string& key_system, 450 const std::string& key_system,
434 const blink::WebMediaKeySystemConfiguration& candidate, 451 const blink::WebMediaKeySystemConfiguration& candidate,
435 ConfigState* config_state, 452 ConfigState* config_state,
436 blink::WebMediaKeySystemConfiguration* accumulated_configuration) { 453 blink::WebMediaKeySystemConfiguration* accumulated_configuration) {
437 // From https://w3c.github.io/encrypted-media/#get-supported-configuration 454 // From
438 // 1. Let accumulated configuration be empty. (Done by caller.) 455 // http://w3c.github.io/encrypted-media/#get-supported-configuration-and-conse nt
439 // 2. If the initDataTypes member is present in candidate configuration, run 456 // 1. Let accumulated configuration be a new MediaKeySystemConfiguration
440 // the following steps: 457 // dictionary. (Done by caller.)
441 if (candidate.hasInitDataTypes) { 458 // 2. Set the label member of accumulated configuration to equal the label
442 // 2.1. Let supported types be empty. 459 // member of candidate configuration.
460 accumulated_configuration->label = candidate.label;
461
462 // 3. If the initDataTypes member of candidate configuration is non-empty,
463 // run the following steps:
464 if (!candidate.initDataTypes.isEmpty()) {
465 // 3.1. Let supported types be an empty sequence of DOMStrings.
443 std::vector<blink::WebEncryptedMediaInitDataType> supported_types; 466 std::vector<blink::WebEncryptedMediaInitDataType> supported_types;
444 467
445 // 2.2. For each value in candidate configuration's initDataTypes member: 468 // 3.2. For each value in candidate configuration's initDataTypes member:
446 for (size_t i = 0; i < candidate.initDataTypes.size(); i++) { 469 for (size_t i = 0; i < candidate.initDataTypes.size(); i++) {
447 // 2.2.1. Let initDataType be the value. 470 // 3.2.1. Let initDataType be the value.
448 blink::WebEncryptedMediaInitDataType init_data_type = 471 blink::WebEncryptedMediaInitDataType init_data_type =
449 candidate.initDataTypes[i]; 472 candidate.initDataTypes[i];
450 // 2.2.2. If the implementation supports generating requests based on 473
474 // 3.2.2. If the implementation supports generating requests based on
451 // initDataType, add initDataType to supported types. String 475 // initDataType, add initDataType to supported types. String
452 // comparison is case-sensitive. The empty string is never 476 // comparison is case-sensitive. The empty string is never
453 // supported. 477 // supported.
454 if (key_systems_->IsSupportedInitDataType( 478 if (key_systems_->IsSupportedInitDataType(
455 key_system, ConvertToEmeInitDataType(init_data_type))) { 479 key_system, ConvertToEmeInitDataType(init_data_type))) {
456 supported_types.push_back(init_data_type); 480 supported_types.push_back(init_data_type);
457 } 481 }
458 } 482 }
459 483
460 // 2.3. If supported types is empty, return null. 484 // 3.3. If supported types is empty, return null.
461 if (supported_types.empty()) { 485 if (supported_types.empty()) {
462 DVLOG(2) << "Rejecting requested configuration because " 486 DVLOG(2) << "Rejecting requested configuration because "
463 << "no initDataType values were supported."; 487 << "no initDataType values were supported.";
464 return CONFIGURATION_NOT_SUPPORTED; 488 return CONFIGURATION_NOT_SUPPORTED;
465 } 489 }
466 490
467 // 2.4. Add supported types to accumulated configuration. 491 // 3.4. Set the initDataTypes member of accumulated configuration to
492 // supported types.
468 accumulated_configuration->initDataTypes = supported_types; 493 accumulated_configuration->initDataTypes = supported_types;
469 } 494 }
470 495
471 // 3. Follow the steps for the value of candidate configuration's 496 // 4. Let distinctive identifier requirement be the value of candidate
472 // distinctiveIdentifier member from the following list: 497 // configuration's distinctiveIdentifier member.
473 // - "required": If the implementation does not support a persistent 498 EmeFeatureRequirement distinctiveIdentifier = candidate.distinctiveIdentifier;
474 // Distinctive Identifier in combination with accumulated 499
475 // configuration, return null. 500 // 5. If distinctive identifier requirement is "optional" and Distinctive
476 // - "optional": Continue. 501 // Identifiers are not allowed according to restrictions, set distinctive
477 // - "not-allowed": If the implementation requires a Distinctive 502 // identifier requirement to "not-allowed".
478 // Identifier in combination with accumulated configuration, return 503 EmeFeatureSupport distinctiveIdentifierSupport =
sandersd (OOO until July 31) 2016/09/16 23:02:10 Nit: variable name does not match Chromium style.
jrummell 2016/09/17 00:15:05 Done.
479 // null. 504 key_systems_->GetDistinctiveIdentifierSupport(key_system);
505 if (distinctiveIdentifier == EmeFeatureRequirement::Optional) {
506 if (distinctiveIdentifierSupport == EmeFeatureSupport::INVALID ||
507 distinctiveIdentifierSupport == EmeFeatureSupport::NOT_SUPPORTED) {
508 distinctiveIdentifier = EmeFeatureRequirement::NotAllowed;
509 }
510 }
511
512 // 6. Follow the steps for distinctive identifier requirement from the
513 // following list:
514 // - "required": If the implementation does not support use of
515 // Distinctive Identifier(s) in combination with accumulated
516 // configuration and restrictions, return NotSupported.
517 // - "optional": Continue with the following steps.
518 // - "not-allowed": If the implementation requires use Distinctive
519 // Identifier(s) or Distinctive Permanent Identifier(s) in
520 // combination with accumulated configuration and restrictions,
521 // return NotSupported.
480 // We also reject OPTIONAL when distinctive identifiers are ALWAYS_ENABLED and 522 // We also reject OPTIONAL when distinctive identifiers are ALWAYS_ENABLED and
481 // permission has already been denied. This would happen anyway at step 11. 523 // permission has already been denied. This would happen anyway later.
482 EmeConfigRule di_rule = GetDistinctiveIdentifierConfigRule( 524 EmeConfigRule di_rule = GetDistinctiveIdentifierConfigRule(
483 key_systems_->GetDistinctiveIdentifierSupport(key_system), 525 distinctiveIdentifierSupport, distinctiveIdentifier);
484 candidate.distinctiveIdentifier);
485 if (!config_state->IsRuleSupported(di_rule)) { 526 if (!config_state->IsRuleSupported(di_rule)) {
486 DVLOG(2) << "Rejecting requested configuration because " 527 DVLOG(2) << "Rejecting requested configuration because "
487 << "the distinctiveIdentifier requirement was not supported."; 528 << "the distinctiveIdentifier requirement was not supported.";
488 return CONFIGURATION_NOT_SUPPORTED; 529 return CONFIGURATION_NOT_SUPPORTED;
489 } 530 }
490 config_state->AddRule(di_rule); 531 config_state->AddRule(di_rule);
491 532
492 // 4. Add the value of the candidate configuration's distinctiveIdentifier 533 // 7. Set the distinctiveIdentifier member of accumulated configuration to
493 // member to accumulated configuration. 534 // equal distinctive identifier requirement.
494 accumulated_configuration->distinctiveIdentifier = 535 accumulated_configuration->distinctiveIdentifier = distinctiveIdentifier;
495 candidate.distinctiveIdentifier;
496 536
497 // 5. Follow the steps for the value of candidate configuration's 537 // 8. Let persistent state requirement be equal to the value of candidate
498 // persistentState member from the following list: 538 // configuration's persistentState member.
499 // - "required": If the implementation does not support persisting state 539 EmeFeatureRequirement persistentState = candidate.persistentState;
sandersd (OOO until July 31) 2016/09/16 23:02:10 Nit: variable name does not match Chromium style.
jrummell 2016/09/17 00:15:05 Done.
500 // in combination with accumulated configuration, return null. 540
501 // - "optional": Continue. 541 // 9. If persistent state requirement is "optional" and persisting state is
502 // - "not-allowed": If the implementation requires persisting state in 542 // not allowed according to restrictions, set persistent state requirement
503 // combination with accumulated configuration, return null. 543 // to "not-allowed".
504 EmeConfigRule ps_rule = GetPersistentStateConfigRule( 544 EmeFeatureSupport persistentStateSupport =
sandersd (OOO until July 31) 2016/09/16 23:02:10 Nit: variable name does not match Chromium style.
jrummell 2016/09/17 00:15:05 Done.
505 key_systems_->GetPersistentStateSupport(key_system), 545 key_systems_->GetPersistentStateSupport(key_system);
506 candidate.persistentState); 546 if (persistentState == EmeFeatureRequirement::Optional) {
547 if (persistentStateSupport == EmeFeatureSupport::INVALID ||
548 persistentStateSupport == EmeFeatureSupport::NOT_SUPPORTED) {
549 persistentState = EmeFeatureRequirement::NotAllowed;
550 }
551 }
552
553 // 10. Follow the steps for persistent state requirement from the following
554 // list:
555 // - "required": If the implementation does not support persisting
556 // state in combination with accumulated configuration and
557 // restrictions, return NotSupported.
558 // - "optional": Continue with the following steps.
559 // - "not-allowed": If the implementation requires persisting state in
560 // combination with accumulated configuration and restrictions,
561 // return NotSupported.
562 EmeConfigRule ps_rule =
563 GetPersistentStateConfigRule(persistentStateSupport, persistentState);
507 if (!config_state->IsRuleSupported(ps_rule)) { 564 if (!config_state->IsRuleSupported(ps_rule)) {
508 DVLOG(2) << "Rejecting requested configuration because " 565 DVLOG(2) << "Rejecting requested configuration because "
509 << "the persistentState requirement was not supported."; 566 << "the persistentState requirement was not supported.";
510 return CONFIGURATION_NOT_SUPPORTED; 567 return CONFIGURATION_NOT_SUPPORTED;
511 } 568 }
512 config_state->AddRule(ps_rule); 569 config_state->AddRule(ps_rule);
513 570
514 // 6. Add the value of the candidate configuration's persistentState 571 // 11. Set the persistentState member of accumulated configuration to equal
515 // member to accumulated configuration. 572 // the value of persistent state requirement.
516 accumulated_configuration->persistentState = candidate.persistentState; 573 accumulated_configuration->persistentState = persistentState;
517 574
518 // 7. Follow the steps for the first matching condition from the following 575 // 12. Follow the steps for the first matching condition from the following
519 // list: 576 // list:
520 // - If the sessionTypes member is present in candidate configuration, 577 // - If the sessionTypes member is present in candidate configuration,
521 // let session types be candidate configuration's sessionTypes member. 578 // let session types be candidate configuration's sessionTypes member.
522 // - Otherwise, let session types be [ "temporary" ]. 579 // - Otherwise, let session types be [ "temporary" ].
523 blink::WebVector<blink::WebEncryptedMediaSessionType> session_types; 580 blink::WebVector<blink::WebEncryptedMediaSessionType> session_types;
524 if (candidate.hasSessionTypes) { 581 if (candidate.hasSessionTypes) {
525 session_types = candidate.sessionTypes; 582 session_types = candidate.sessionTypes;
526 } else { 583 } else {
527 std::vector<blink::WebEncryptedMediaSessionType> temporary(1); 584 std::vector<blink::WebEncryptedMediaSessionType> temporary(1);
528 temporary[0] = blink::WebEncryptedMediaSessionType::Temporary; 585 temporary[0] = blink::WebEncryptedMediaSessionType::Temporary;
529 session_types = temporary; 586 session_types = temporary;
530 } 587 }
531 588
532 // 8. For each value in session types: 589 // 13. For each value in session types:
533 for (size_t i = 0; i < session_types.size(); i++) { 590 for (size_t i = 0; i < session_types.size(); i++) {
534 // 8.1. Let session type be the value. 591 // 13.1. Let session type be the value.
535 blink::WebEncryptedMediaSessionType session_type = session_types[i]; 592 blink::WebEncryptedMediaSessionType session_type = session_types[i];
536 // 8.2. If the implementation does not support session type in combination 593
537 // with accumulated configuration, return null. 594 // 13.2. If accumulated configuration's persistentState value is
538 // 8.3. If session type is "persistent-license" or 595 // "not-allowed" and the Is persistent session type? algorithm
539 // "persistent-release-message", follow the steps for accumulated 596 // returns true for session type return NotSupported.
540 // configuration's persistentState value from the following list: 597 if (accumulated_configuration->persistentState ==
541 // - "required": Continue. 598 EmeFeatureRequirement::NotAllowed &&
542 // - "optional": Change accumulated configuration's persistentState 599 IsPersistentSessionType(session_type)) {
543 // value to "required". 600 DVLOG(2) << "Rejecting requested configuration because persistent "
544 // - "not-allowed": Return null. 601 "sessions are not allowed.";
602 return CONFIGURATION_NOT_SUPPORTED;
603 }
604
605 // 13.3. If the implementation does not support session type in combination
606 // with accumulated configuration and restrictions for other reasons,
607 // return NotSupported.
545 EmeConfigRule session_type_rule = EmeConfigRule::NOT_SUPPORTED; 608 EmeConfigRule session_type_rule = EmeConfigRule::NOT_SUPPORTED;
546 switch (session_type) { 609 switch (session_type) {
547 case blink::WebEncryptedMediaSessionType::Unknown: 610 case blink::WebEncryptedMediaSessionType::Unknown:
548 DVLOG(2) << "Rejecting requested configuration because " 611 DVLOG(2) << "Rejecting requested configuration because "
549 << "a required session type was not recognized."; 612 << "a required session type was not recognized.";
550 return CONFIGURATION_NOT_SUPPORTED; 613 return CONFIGURATION_NOT_SUPPORTED;
551 case blink::WebEncryptedMediaSessionType::Temporary: 614 case blink::WebEncryptedMediaSessionType::Temporary:
552 session_type_rule = EmeConfigRule::SUPPORTED; 615 session_type_rule = EmeConfigRule::SUPPORTED;
553 break; 616 break;
554 case blink::WebEncryptedMediaSessionType::PersistentLicense: 617 case blink::WebEncryptedMediaSessionType::PersistentLicense:
555 session_type_rule = GetSessionTypeConfigRule( 618 session_type_rule = GetSessionTypeConfigRule(
556 key_systems_->GetPersistentLicenseSessionSupport(key_system)); 619 key_systems_->GetPersistentLicenseSessionSupport(key_system));
557 break; 620 break;
558 case blink::WebEncryptedMediaSessionType::PersistentReleaseMessage: 621 case blink::WebEncryptedMediaSessionType::PersistentReleaseMessage:
559 session_type_rule = GetSessionTypeConfigRule( 622 session_type_rule = GetSessionTypeConfigRule(
560 key_systems_->GetPersistentReleaseMessageSessionSupport( 623 key_systems_->GetPersistentReleaseMessageSessionSupport(
561 key_system)); 624 key_system));
562 break; 625 break;
563 } 626 }
627
564 if (!config_state->IsRuleSupported(session_type_rule)) { 628 if (!config_state->IsRuleSupported(session_type_rule)) {
565 DVLOG(2) << "Rejecting requested configuration because " 629 DVLOG(2) << "Rejecting requested configuration because "
566 << "a required session type was not supported."; 630 << "a required session type was not supported.";
567 return CONFIGURATION_NOT_SUPPORTED; 631 return CONFIGURATION_NOT_SUPPORTED;
568 } 632 }
569 config_state->AddRule(session_type_rule); 633 config_state->AddRule(session_type_rule);
634
635 // 13.4. If accumulated configuration's persistentState value is "optional"
636 // and the result of running the Is persistent session type?
637 // algorithm on session type is true, change accumulated
638 // configuration's persistentState value to "required".
639 if (accumulated_configuration->persistentState ==
640 EmeFeatureRequirement::Optional &&
641 IsPersistentSessionType(session_type)) {
642 accumulated_configuration->persistentState =
643 EmeFeatureRequirement::Required;
644 }
570 } 645 }
571 646
572 // 9. Add session types to accumulated configuration. 647 // 14. Set the sessionTypes member of accumulated configuration to
648 // session types.
573 accumulated_configuration->sessionTypes = session_types; 649 accumulated_configuration->sessionTypes = session_types;
574 650
575 // 10. If the videoCapabilities member is present in candidate configuration: 651 // 15. If the videoCapabilities and audioCapabilities members in candidate
576 if (candidate.hasVideoCapabilities) { 652 // configuration are both empty, return NotSupported.
577 // 10.1. Let video capabilities be the result of executing the Get Supported 653 // TODO(jrummell): Enforce this once the deprecation warning is removed.
578 // Capabilities for Media Type algorithm on Video, candidate 654 // See http://crbug.com/616233.
579 // configuration's videoCapabilities member, and accumulated 655
580 // configuration. 656 // 16. If the videoCapabilities member in candidate configuration is
581 // 10.2. If video capabilities is null, return null. 657 // non-empty:
582 std::vector<blink::WebMediaKeySystemMediaCapability> video_capabilities; 658 std::vector<blink::WebMediaKeySystemMediaCapability> video_capabilities;
659 if (!candidate.videoCapabilities.isEmpty()) {
660 // 16.1. Let video capabilities be the result of executing the Get
661 // Supported Capabilities for Audio/Video Type algorithm on Video,
662 // candidate configuration's videoCapabilities member, accumulated
663 // configuration, and restrictions.
664 // 16.2. If video capabilities is null, return NotSupported.
583 if (!GetSupportedCapabilities(key_system, EmeMediaType::VIDEO, 665 if (!GetSupportedCapabilities(key_system, EmeMediaType::VIDEO,
584 candidate.videoCapabilities, config_state, 666 candidate.videoCapabilities, config_state,
585 &video_capabilities)) { 667 &video_capabilities)) {
586 return CONFIGURATION_NOT_SUPPORTED; 668 return CONFIGURATION_NOT_SUPPORTED;
587 } 669 }
588 670
589 // 10.3. Add video capabilities to accumulated configuration. 671 // 16.3. Set the videoCapabilities member of accumulated configuration
590 accumulated_configuration->hasVideoCapabilities = true; 672 // to video capabilities.
673 accumulated_configuration->videoCapabilities = video_capabilities;
674 } else {
675 // Otherwise set the videoCapabilities member of accumulated configuration
676 // to an empty sequence.
591 accumulated_configuration->videoCapabilities = video_capabilities; 677 accumulated_configuration->videoCapabilities = video_capabilities;
592 } 678 }
593 679
594 // 11. If the audioCapabilities member is present in candidate configuration: 680 // 17. If the audioCapabilities member in candidate configuration is
595 if (candidate.hasAudioCapabilities) { 681 // non-empty:
596 // 11.1. Let audio capabilities be the result of executing the Get Supported 682 std::vector<blink::WebMediaKeySystemMediaCapability> audio_capabilities;
597 // Capabilities for Media Type algorithm on Audio, candidate 683 if (!candidate.audioCapabilities.isEmpty()) {
598 // configuration's audioCapabilities member, and accumulated 684 // 17.1. Let audio capabilities be the result of executing the Get
599 // configuration. 685 // Supported Capabilities for Audio/Video Type algorithm on Audio,
600 // 11.2. If audio capabilities is null, return null. 686 // candidate configuration's audioCapabilities member, accumulated
601 std::vector<blink::WebMediaKeySystemMediaCapability> audio_capabilities; 687 // configuration, and restrictions.
688 // 17.2. If audio capabilities is null, return NotSupported.
602 if (!GetSupportedCapabilities(key_system, EmeMediaType::AUDIO, 689 if (!GetSupportedCapabilities(key_system, EmeMediaType::AUDIO,
603 candidate.audioCapabilities, config_state, 690 candidate.audioCapabilities, config_state,
604 &audio_capabilities)) { 691 &audio_capabilities)) {
605 return CONFIGURATION_NOT_SUPPORTED; 692 return CONFIGURATION_NOT_SUPPORTED;
606 } 693 }
607 694
608 // 11.3. Add audio capabilities to accumulated configuration. 695 // 17.3. Set the audioCapabilities member of accumulated configuration
609 accumulated_configuration->hasAudioCapabilities = true; 696 // to audio capabilities.
697 accumulated_configuration->audioCapabilities = audio_capabilities;
698 } else {
699 // Otherwise set the audioCapabilities member of accumulated configuration
700 // to an empty sequence.
610 accumulated_configuration->audioCapabilities = audio_capabilities; 701 accumulated_configuration->audioCapabilities = audio_capabilities;
611 } 702 }
612 703
613 // 12. If accumulated configuration's distinctiveIdentifier value is 704 // 18. If accumulated configuration's distinctiveIdentifier value is
614 // "optional", follow the steps for the first matching condition from the 705 // "optional", follow the steps for the first matching condition
615 // following list: 706 // from the following list:
616 // - If the implementation requires a Distinctive Identifier for any of 707 // - If the implementation requires use Distinctive Identifier(s) or
617 // the combinations in accumulated configuration, change accumulated 708 // Distinctive Permanent Identifier(s) for any of the combinations
618 // configuration's distinctiveIdentifier value to "required". 709 // in accumulated configuration, change accumulated configuration's
619 // - Otherwise, change accumulated configuration's distinctiveIdentifier 710 // distinctiveIdentifier value to "required".
620 // value to "not-allowed". 711 // - Otherwise, change accumulated configuration's
712 // distinctiveIdentifier value to "not-allowed".
621 if (accumulated_configuration->distinctiveIdentifier == 713 if (accumulated_configuration->distinctiveIdentifier ==
622 blink::WebMediaKeySystemConfiguration::Requirement::Optional) { 714 EmeFeatureRequirement::Optional) {
623 EmeConfigRule not_allowed_rule = GetDistinctiveIdentifierConfigRule( 715 EmeConfigRule not_allowed_rule = GetDistinctiveIdentifierConfigRule(
624 key_systems_->GetDistinctiveIdentifierSupport(key_system), 716 key_systems_->GetDistinctiveIdentifierSupport(key_system),
625 EmeFeatureRequirement::NotAllowed); 717 EmeFeatureRequirement::NotAllowed);
626 EmeConfigRule required_rule = GetDistinctiveIdentifierConfigRule( 718 EmeConfigRule required_rule = GetDistinctiveIdentifierConfigRule(
627 key_systems_->GetDistinctiveIdentifierSupport(key_system), 719 key_systems_->GetDistinctiveIdentifierSupport(key_system),
628 EmeFeatureRequirement::Required); 720 EmeFeatureRequirement::Required);
629 bool not_allowed_supported = 721 bool not_allowed_supported =
630 config_state->IsRuleSupported(not_allowed_rule); 722 config_state->IsRuleSupported(not_allowed_rule);
631 bool required_supported = config_state->IsRuleSupported(required_rule); 723 bool required_supported = config_state->IsRuleSupported(required_rule);
632 // If a distinctive identifier is recommend and that is a possible outcome, 724 // If a distinctive identifier is recommend and that is a possible outcome,
633 // prefer that. 725 // prefer that.
634 if (required_supported && config_state->IsIdentifierRecommended() && 726 if (required_supported && config_state->IsIdentifierRecommended() &&
635 config_state->IsPermissionPossible()) { 727 config_state->IsPermissionPossible()) {
636 not_allowed_supported = false; 728 not_allowed_supported = false;
637 } 729 }
638 if (not_allowed_supported) { 730 if (not_allowed_supported) {
639 accumulated_configuration->distinctiveIdentifier = 731 accumulated_configuration->distinctiveIdentifier =
640 blink::WebMediaKeySystemConfiguration::Requirement::NotAllowed; 732 EmeFeatureRequirement::NotAllowed;
641 config_state->AddRule(not_allowed_rule); 733 config_state->AddRule(not_allowed_rule);
642 } else if (required_supported) { 734 } else if (required_supported) {
643 accumulated_configuration->distinctiveIdentifier = 735 accumulated_configuration->distinctiveIdentifier =
644 blink::WebMediaKeySystemConfiguration::Requirement::Required; 736 EmeFeatureRequirement::Required;
645 config_state->AddRule(required_rule); 737 config_state->AddRule(required_rule);
646 } else { 738 } else {
647 // We should not have passed step 3. 739 // We should not have passed step 6.
648 NOTREACHED(); 740 NOTREACHED();
649 return CONFIGURATION_NOT_SUPPORTED; 741 return CONFIGURATION_NOT_SUPPORTED;
650 } 742 }
651 } 743 }
652 744
653 // 13. If accumulated configuration's persistentState value is "optional", 745 // 19. If accumulated configuration's persistentState value is "optional",
654 // follow the steps for the first matching condition from the following 746 // follow the steps for the first matching condition from the following
655 // list: 747 // list:
656 // - If the implementation requires persisting state for any of the 748 // - If the implementation requires persisting state for any of the
657 // combinations in accumulated configuration, change accumulated 749 // combinations in accumulated configuration, change accumulated
658 // configuration's persistentState value to "required". 750 // configuration's persistentState value to "required".
659 // - Otherwise, change accumulated configuration's persistentState value 751 // - Otherwise, change accumulated configuration's persistentState
660 // to "not-allowed". 752 // value to "not-allowed".
661 if (accumulated_configuration->persistentState == 753 if (accumulated_configuration->persistentState ==
662 blink::WebMediaKeySystemConfiguration::Requirement::Optional) { 754 EmeFeatureRequirement::Optional) {
663 EmeConfigRule not_allowed_rule = GetPersistentStateConfigRule( 755 EmeConfigRule not_allowed_rule = GetPersistentStateConfigRule(
664 key_systems_->GetPersistentStateSupport(key_system), 756 key_systems_->GetPersistentStateSupport(key_system),
665 EmeFeatureRequirement::NotAllowed); 757 EmeFeatureRequirement::NotAllowed);
666 EmeConfigRule required_rule = GetPersistentStateConfigRule( 758 EmeConfigRule required_rule = GetPersistentStateConfigRule(
667 key_systems_->GetPersistentStateSupport(key_system), 759 key_systems_->GetPersistentStateSupport(key_system),
668 EmeFeatureRequirement::Required); 760 EmeFeatureRequirement::Required);
669 // |distinctiveIdentifier| should not be affected after it is decided. 761 // |distinctiveIdentifier| should not be affected after it is decided.
670 DCHECK(not_allowed_rule == EmeConfigRule::NOT_SUPPORTED || 762 DCHECK(not_allowed_rule == EmeConfigRule::NOT_SUPPORTED ||
671 not_allowed_rule == EmeConfigRule::PERSISTENCE_NOT_ALLOWED); 763 not_allowed_rule == EmeConfigRule::PERSISTENCE_NOT_ALLOWED);
672 DCHECK(required_rule == EmeConfigRule::NOT_SUPPORTED || 764 DCHECK(required_rule == EmeConfigRule::NOT_SUPPORTED ||
673 required_rule == EmeConfigRule::PERSISTENCE_REQUIRED); 765 required_rule == EmeConfigRule::PERSISTENCE_REQUIRED);
674 bool not_allowed_supported = 766 bool not_allowed_supported =
675 config_state->IsRuleSupported(not_allowed_rule); 767 config_state->IsRuleSupported(not_allowed_rule);
676 bool required_supported = config_state->IsRuleSupported(required_rule); 768 bool required_supported = config_state->IsRuleSupported(required_rule);
677 if (not_allowed_supported) { 769 if (not_allowed_supported) {
678 accumulated_configuration->persistentState = 770 accumulated_configuration->persistentState =
679 blink::WebMediaKeySystemConfiguration::Requirement::NotAllowed; 771 EmeFeatureRequirement::NotAllowed;
680 config_state->AddRule(not_allowed_rule); 772 config_state->AddRule(not_allowed_rule);
681 } else if (required_supported) { 773 } else if (required_supported) {
682 accumulated_configuration->persistentState = 774 accumulated_configuration->persistentState =
683 blink::WebMediaKeySystemConfiguration::Requirement::Required; 775 EmeFeatureRequirement::Required;
684 config_state->AddRule(required_rule); 776 config_state->AddRule(required_rule);
685 } else { 777 } else {
686 // We should not have passed step 5. 778 // We should not have passed step 5.
687 NOTREACHED(); 779 NOTREACHED();
688 return CONFIGURATION_NOT_SUPPORTED; 780 return CONFIGURATION_NOT_SUPPORTED;
689 } 781 }
690 } 782 }
691 783
692 // 14. If implementation in the configuration specified by the combination of 784 // 20. If implementation in the configuration specified by the combination of
693 // the values in accumulated configuration is not supported or not allowed 785 // the values in accumulated configuration is not supported or not allowed
694 // in the origin, return null. 786 // in the origin, return NotSupported.
695 // 15. If accumulated configuration's distinctiveIdentifier value is 787 // TODO(jrummell): can we check that the CDM can't be loaded by the origin?
696 // "required", [prompt the user for consent]. 788
789 // 21. If accumulated configuration's distinctiveIdentifier value is
790 // "required" and the Distinctive Identifier(s) associated with
791 // accumulated configuration are not unique per origin and profile
792 // and clearable:
793 // 21.1. Update restrictions to reflect that all configurations described
794 // by accumulated configuration do not have user consent.
795 // 21.2. Return ConsentDenied and restrictions.
796 // (Not required as data is unique per origin and clearable.)
797
798 // 22. Let consent status and updated restrictions be the result of running
799 // the Get Consent Status algorithm on accumulated configuration,
800 // restrictions and origin and follow the steps for the value of consent
801 // status from the following list:
802 // - "ConsentDenied": Return ConsentDenied and updated restrictions.
803 // - "InformUser": Inform the user that accumulated configuration is
804 // in use in the origin including, specifically, the information
805 // that Distinctive Identifier(s) and/or Distinctive Permanent
806 // Identifier(s) as appropriate will be used if the
807 // distinctiveIdentifier member of accumulated configuration is
808 // "required". Continue to the next step.
809 // - "Allowed": Continue to the next step.
810 // Accumulated configuration's distinctiveIdentifier should be "required" or
811 // "notallowed"" due to step 18. If it is "required", prompt the user for
812 // consent unless it has already been granted.
697 if (accumulated_configuration->distinctiveIdentifier == 813 if (accumulated_configuration->distinctiveIdentifier ==
698 blink::WebMediaKeySystemConfiguration::Requirement::Required) { 814 EmeFeatureRequirement::Required) {
699 // The caller is responsible for resolving what to do if permission is 815 // The caller is responsible for resolving what to do if permission is
700 // required but has been denied (it should treat it as NOT_SUPPORTED). 816 // required but has been denied (it should treat it as NOT_SUPPORTED).
701 if (!config_state->IsPermissionGranted()) 817 if (!config_state->IsPermissionGranted())
702 return CONFIGURATION_REQUIRES_PERMISSION; 818 return CONFIGURATION_REQUIRES_PERMISSION;
703 } 819 }
704 820
705 // 16. If the label member is present in candidate configuration, add the 821 // 23. Return accumulated configuration.
706 // value of the candidate configuration's label member to accumulated
707 // configuration.
708 accumulated_configuration->label = candidate.label;
709
710 // 17. Return accumulated configuration.
711 return CONFIGURATION_SUPPORTED; 822 return CONFIGURATION_SUPPORTED;
712 } 823 }
713 824
714 void KeySystemConfigSelector::SelectConfig( 825 void KeySystemConfigSelector::SelectConfig(
715 const blink::WebString& key_system, 826 const blink::WebString& key_system,
716 const blink::WebVector<blink::WebMediaKeySystemConfiguration>& 827 const blink::WebVector<blink::WebMediaKeySystemConfiguration>&
717 candidate_configurations, 828 candidate_configurations,
718 const blink::WebSecurityOrigin& security_origin, 829 const blink::WebSecurityOrigin& security_origin,
719 bool are_secure_codecs_supported, 830 bool are_secure_codecs_supported,
720 base::Callback<void(const blink::WebMediaKeySystemConfiguration&, 831 base::Callback<void(const blink::WebMediaKeySystemConfiguration&,
721 const CdmConfig&)> succeeded_cb, 832 const CdmConfig&)> succeeded_cb,
722 base::Callback<void(const blink::WebString&)> not_supported_cb) { 833 base::Callback<void(const blink::WebString&)> not_supported_cb) {
723 // Continued from requestMediaKeySystemAccess(), step 7, from 834 // Continued from requestMediaKeySystemAccess(), step 6, from
724 // https://w3c.github.io/encrypted-media/#requestmediakeysystemaccess 835 // https://w3c.github.io/encrypted-media/#requestmediakeysystemaccess
725 // 836 //
726 // 7.1. If keySystem is not one of the Key Systems supported by the user 837 // 6.1 If keySystem is not one of the Key Systems supported by the user
727 // agent, reject promise with with a new DOMException whose name is 838 // agent, reject promise with a NotSupportedError. String comparison
728 // NotSupportedError. String comparison is case-sensitive. 839 // is case-sensitive.
729 if (!base::IsStringASCII(key_system)) { 840 if (!base::IsStringASCII(key_system)) {
730 not_supported_cb.Run("Only ASCII keySystems are supported"); 841 not_supported_cb.Run("Only ASCII keySystems are supported");
731 return; 842 return;
732 } 843 }
733 844
734 std::string key_system_ascii = 845 std::string key_system_ascii =
735 base::UTF16ToASCII(base::StringPiece16(key_system)); 846 base::UTF16ToASCII(base::StringPiece16(key_system));
736 if (!key_systems_->IsSupportedKeySystem(key_system_ascii)) { 847 if (!key_systems_->IsSupportedKeySystem(key_system_ascii)) {
737 not_supported_cb.Run("Unsupported keySystem"); 848 not_supported_cb.Run("Unsupported keySystem");
738 return; 849 return;
739 } 850 }
740 851
741 // 7.2-7.4. Implemented by OnSelectConfig(). 852 // 6.2-6.4. Implemented by OnSelectConfig().
742 // TODO(sandersd): This should be async, ideally not on the main thread. 853 // TODO(sandersd): This should be async, ideally not on the main thread.
743 std::unique_ptr<SelectionRequest> request(new SelectionRequest()); 854 std::unique_ptr<SelectionRequest> request(new SelectionRequest());
744 request->key_system = key_system_ascii; 855 request->key_system = key_system_ascii;
745 request->candidate_configurations = candidate_configurations; 856 request->candidate_configurations = candidate_configurations;
746 request->security_origin = security_origin; 857 request->security_origin = security_origin;
747 request->are_secure_codecs_supported = are_secure_codecs_supported; 858 request->are_secure_codecs_supported = are_secure_codecs_supported;
748 request->succeeded_cb = succeeded_cb; 859 request->succeeded_cb = succeeded_cb;
749 request->not_supported_cb = not_supported_cb; 860 request->not_supported_cb = not_supported_cb;
750 SelectConfigInternal(std::move(request)); 861 SelectConfigInternal(std::move(request));
751 } 862 }
752 863
753 void KeySystemConfigSelector::SelectConfigInternal( 864 void KeySystemConfigSelector::SelectConfigInternal(
754 std::unique_ptr<SelectionRequest> request) { 865 std::unique_ptr<SelectionRequest> request) {
755 // Continued from requestMediaKeySystemAccess(), step 7.1, from 866 // Continued from requestMediaKeySystemAccess(), step 6, from
756 // https://w3c.github.io/encrypted-media/#requestmediakeysystemaccess 867 // https://w3c.github.io/encrypted-media/#requestmediakeysystemaccess
757 // 868 //
758 // 7.2. Let implementation be the implementation of keySystem. 869 // 6.2. Let implementation be the implementation of keySystem.
759 // (|key_systems_| fills this role.) 870 // (|key_systems_| fills this role.)
760 // 7.3. For each value in supportedConfigurations: 871 // 6.3. For each value in supportedConfigurations:
761 for (size_t i = 0; i < request->candidate_configurations.size(); i++) { 872 for (size_t i = 0; i < request->candidate_configurations.size(); i++) {
762 // 7.3.1. Let candidate configuration be the value. 873 // 6.3.1. Let candidate configuration be the value.
763 // 7.3.2. Let supported configuration be the result of executing the Get 874 // 6.3.2. Let supported configuration be the result of executing the Get
764 // Supported Configuration algorithm on implementation, candidate 875 // Supported Configuration algorithm on implementation, candidate
765 // configuration, and origin. 876 // configuration, and origin.
766 // 7.3.3. If supported configuration is not null, [initialize and return a 877 // 6.3.3. If supported configuration is not NotSupported, [initialize
767 // new MediaKeySystemAccess object.] 878 // and return a new MediaKeySystemAccess object.]
768 ConfigState config_state(request->was_permission_requested, 879 ConfigState config_state(request->was_permission_requested,
769 request->is_permission_granted); 880 request->is_permission_granted);
770 DCHECK(config_state.IsRuleSupported( 881 DCHECK(config_state.IsRuleSupported(
771 EmeConfigRule::HW_SECURE_CODECS_NOT_ALLOWED)); 882 EmeConfigRule::HW_SECURE_CODECS_NOT_ALLOWED));
772 if (!request->are_secure_codecs_supported) 883 if (!request->are_secure_codecs_supported)
773 config_state.AddRule(EmeConfigRule::HW_SECURE_CODECS_NOT_ALLOWED); 884 config_state.AddRule(EmeConfigRule::HW_SECURE_CODECS_NOT_ALLOWED);
774 blink::WebMediaKeySystemConfiguration accumulated_configuration; 885 blink::WebMediaKeySystemConfiguration accumulated_configuration;
775 CdmConfig cdm_config; 886 CdmConfig cdm_config;
776 ConfigurationSupport support = GetSupportedConfiguration( 887 ConfigurationSupport support = GetSupportedConfiguration(
777 request->key_system, request->candidate_configurations[i], 888 request->key_system, request->candidate_configurations[i],
(...skipping 14 matching lines...) Expand all
792 blink::WebStringToGURL(request->security_origin.toString())); 903 blink::WebStringToGURL(request->security_origin.toString()));
793 media_permission_->RequestPermission( 904 media_permission_->RequestPermission(
794 MediaPermission::PROTECTED_MEDIA_IDENTIFIER, security_origin, 905 MediaPermission::PROTECTED_MEDIA_IDENTIFIER, security_origin,
795 base::Bind(&KeySystemConfigSelector::OnPermissionResult, 906 base::Bind(&KeySystemConfigSelector::OnPermissionResult,
796 weak_factory_.GetWeakPtr(), base::Passed(&request))); 907 weak_factory_.GetWeakPtr(), base::Passed(&request)));
797 } 908 }
798 return; 909 return;
799 case CONFIGURATION_SUPPORTED: 910 case CONFIGURATION_SUPPORTED:
800 cdm_config.allow_distinctive_identifier = 911 cdm_config.allow_distinctive_identifier =
801 (accumulated_configuration.distinctiveIdentifier == 912 (accumulated_configuration.distinctiveIdentifier ==
802 blink::WebMediaKeySystemConfiguration::Requirement::Required); 913 EmeFeatureRequirement::Required);
803 cdm_config.allow_persistent_state = 914 cdm_config.allow_persistent_state =
804 (accumulated_configuration.persistentState == 915 (accumulated_configuration.persistentState ==
805 blink::WebMediaKeySystemConfiguration::Requirement::Required); 916 EmeFeatureRequirement::Required);
806 cdm_config.use_hw_secure_codecs = 917 cdm_config.use_hw_secure_codecs =
807 config_state.AreHwSecureCodecsRequired(); 918 config_state.AreHwSecureCodecsRequired();
808 request->succeeded_cb.Run(accumulated_configuration, cdm_config); 919 request->succeeded_cb.Run(accumulated_configuration, cdm_config);
809 return; 920 return;
810 } 921 }
811 } 922 }
812 923
813 // 7.4. Reject promise with a new DOMException whose name is 924 // 6.4. Reject promise with a NotSupportedError.
814 // NotSupportedError.
815 request->not_supported_cb.Run( 925 request->not_supported_cb.Run(
816 "None of the requested configurations were supported."); 926 "None of the requested configurations were supported.");
817 } 927 }
818 928
819 void KeySystemConfigSelector::OnPermissionResult( 929 void KeySystemConfigSelector::OnPermissionResult(
820 std::unique_ptr<SelectionRequest> request, 930 std::unique_ptr<SelectionRequest> request,
821 bool is_permission_granted) { 931 bool is_permission_granted) {
822 request->was_permission_requested = true; 932 request->was_permission_requested = true;
823 request->is_permission_granted = is_permission_granted; 933 request->is_permission_granted = is_permission_granted;
824 SelectConfigInternal(std::move(request)); 934 SelectConfigInternal(std::move(request));
825 } 935 }
826 936
827 } // namespace media 937 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698