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

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

Issue 1124863005: Restrict use of hardware-secure codecs based on the RendererPreference. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@setsecurity
Patch Set: Rename secure_codec -> secure_surface in some cases. Created 5 years, 7 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 "key_system_config_selector.h" 5 #include "key_system_config_selector.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/strings/string_util.h" 9 #include "base/strings/string_util.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 struct KeySystemConfigSelector::SelectionRequest { 129 struct KeySystemConfigSelector::SelectionRequest {
130 std::string key_system; 130 std::string key_system;
131 blink::WebVector<blink::WebMediaKeySystemConfiguration> 131 blink::WebVector<blink::WebMediaKeySystemConfiguration>
132 candidate_configurations; 132 candidate_configurations;
133 blink::WebSecurityOrigin security_origin; 133 blink::WebSecurityOrigin security_origin;
134 base::Callback<void(const blink::WebMediaKeySystemConfiguration&)> 134 base::Callback<void(const blink::WebMediaKeySystemConfiguration&)>
135 succeeded_cb; 135 succeeded_cb;
136 base::Callback<void(const blink::WebString&)> not_supported_cb; 136 base::Callback<void(const blink::WebString&)> not_supported_cb;
137 bool was_permission_requested = false; 137 bool was_permission_requested = false;
138 bool is_permission_granted = false; 138 bool is_permission_granted = false;
139 #if defined(OS_ANDROID)
140 bool allow_secure_surfaces = false;
141 #endif // defined(OS_ANDROID)
139 }; 142 };
140 143
141 // Accumulates configuration rules to determine if a feature (additional 144 // Accumulates configuration rules to determine if a feature (additional
142 // configuration rule) can be added to an accumulated configuration. 145 // configuration rule) can be added to an accumulated configuration.
143 class KeySystemConfigSelector::ConfigState { 146 class KeySystemConfigSelector::ConfigState {
144 public: 147 public:
145 ConfigState(bool was_permission_requested, bool is_permission_granted) 148 ConfigState(bool was_permission_requested, bool is_permission_granted)
146 : was_permission_requested_(was_permission_requested), 149 : was_permission_requested_(was_permission_requested),
147 is_permission_granted_(is_permission_granted) {} 150 is_permission_granted_(is_permission_granted) {}
148 151
149 bool IsPermissionGranted() const { return is_permission_granted_; } 152 bool IsPermissionGranted() const { return is_permission_granted_; }
150 153
151 // Permission is possible if it has not been denied. 154 // Permission is possible if it has not been denied.
152 bool IsPermissionPossible() const { 155 bool IsPermissionPossible() const {
153 return is_permission_granted_ || !was_permission_requested_; 156 return is_permission_granted_ || !was_permission_requested_;
154 } 157 }
155 158
156 bool IsIdentifierRequired() const { return is_identifier_required_; } 159 bool IsIdentifierRequired() const { return is_identifier_required_; }
157 160
158 bool IsIdentifierRecommended() const { return is_identifier_recommended_; } 161 bool IsIdentifierRecommended() const { return is_identifier_recommended_; }
159 162
163 bool AreSecureCodecsRequired() const { return are_secure_codecs_required_; }
164
160 // Checks whether a rule is compatible with all previously added rules. 165 // Checks whether a rule is compatible with all previously added rules.
161 bool IsRuleSupported(EmeConfigRule rule) const { 166 bool IsRuleSupported(EmeConfigRule rule) const {
162 switch (rule) { 167 switch (rule) {
163 case EmeConfigRule::NOT_SUPPORTED: 168 case EmeConfigRule::NOT_SUPPORTED:
164 return false; 169 return false;
165 case EmeConfigRule::IDENTIFIER_NOT_ALLOWED: 170 case EmeConfigRule::IDENTIFIER_NOT_ALLOWED:
166 return !is_identifier_required_; 171 return !is_identifier_required_;
167 case EmeConfigRule::IDENTIFIER_REQUIRED: 172 case EmeConfigRule::IDENTIFIER_REQUIRED:
168 // TODO(sandersd): Confirm if we should be refusing these rules when 173 // TODO(sandersd): Confirm if we should be refusing these rules when
169 // permission has been denied (as the spec currently says). 174 // permission has been denied (as the spec currently says).
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 // 5. Return media type capabilities. 390 // 5. Return media type capabilities.
386 return true; 391 return true;
387 } 392 }
388 393
389 KeySystemConfigSelector::ConfigurationSupport 394 KeySystemConfigSelector::ConfigurationSupport
390 KeySystemConfigSelector::GetSupportedConfiguration( 395 KeySystemConfigSelector::GetSupportedConfiguration(
391 const std::string& key_system, 396 const std::string& key_system,
392 const blink::WebMediaKeySystemConfiguration& candidate, 397 const blink::WebMediaKeySystemConfiguration& candidate,
393 ConfigState* config_state, 398 ConfigState* config_state,
394 blink::WebMediaKeySystemConfiguration* accumulated_configuration) { 399 blink::WebMediaKeySystemConfiguration* accumulated_configuration) {
395 // TODO(sandersd): Set state of SECURE_CODECS from renderer pref.
396 // From https://w3c.github.io/encrypted-media/#get-supported-configuration 400 // From https://w3c.github.io/encrypted-media/#get-supported-configuration
397 // 1. Let accumulated configuration be empty. (Done by caller.) 401 // 1. Let accumulated configuration be empty. (Done by caller.)
398 // 2. If the initDataTypes member is present in candidate configuration, run 402 // 2. If the initDataTypes member is present in candidate configuration, run
399 // the following steps: 403 // the following steps:
400 if (candidate.hasInitDataTypes) { 404 if (candidate.hasInitDataTypes) {
401 // 2.1. Let supported types be empty. 405 // 2.1. Let supported types be empty.
402 std::vector<blink::WebEncryptedMediaInitDataType> supported_types; 406 std::vector<blink::WebEncryptedMediaInitDataType> supported_types;
403 407
404 // 2.2. For each value in candidate configuration's initDataTypes member: 408 // 2.2. For each value in candidate configuration's initDataTypes member:
405 for (size_t i = 0; i < candidate.initDataTypes.size(); i++) { 409 for (size_t i = 0; i < candidate.initDataTypes.size(); i++) {
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
663 // value of the candidate configuration's label member to accumulated 667 // value of the candidate configuration's label member to accumulated
664 // configuration. 668 // configuration.
665 accumulated_configuration->label = candidate.label; 669 accumulated_configuration->label = candidate.label;
666 670
667 // 17. Return accumulated configuration. 671 // 17. Return accumulated configuration.
668 return CONFIGURATION_SUPPORTED; 672 return CONFIGURATION_SUPPORTED;
669 } 673 }
670 674
671 void KeySystemConfigSelector::SelectConfig( 675 void KeySystemConfigSelector::SelectConfig(
672 const blink::WebString& key_system, 676 const blink::WebString& key_system,
677 #if defined(OS_ANDROID)
678 const bool allow_secure_surfaces,
679 #endif // defined(OS_ANDROID)
673 const blink::WebVector<blink::WebMediaKeySystemConfiguration>& 680 const blink::WebVector<blink::WebMediaKeySystemConfiguration>&
674 candidate_configurations, 681 candidate_configurations,
675 const blink::WebSecurityOrigin& security_origin, 682 const blink::WebSecurityOrigin& security_origin,
676 base::Callback<void(const blink::WebMediaKeySystemConfiguration&)> 683 base::Callback<void(const blink::WebMediaKeySystemConfiguration&)>
677 succeeded_cb, 684 succeeded_cb,
678 base::Callback<void(const blink::WebString&)> not_supported_cb) { 685 base::Callback<void(const blink::WebString&)> not_supported_cb) {
679 // Continued from requestMediaKeySystemAccess(), step 7, from 686 // Continued from requestMediaKeySystemAccess(), step 7, from
680 // https://w3c.github.io/encrypted-media/#requestmediakeysystemaccess 687 // https://w3c.github.io/encrypted-media/#requestmediakeysystemaccess
681 // 688 //
682 // 7.1. If keySystem is not one of the Key Systems supported by the user 689 // 7.1. If keySystem is not one of the Key Systems supported by the user
683 // agent, reject promise with with a new DOMException whose name is 690 // agent, reject promise with with a new DOMException whose name is
684 // NotSupportedError. String comparison is case-sensitive. 691 // NotSupportedError. String comparison is case-sensitive.
685 if (!base::IsStringASCII(key_system)) { 692 if (!base::IsStringASCII(key_system)) {
686 not_supported_cb.Run("Only ASCII keySystems are supported"); 693 not_supported_cb.Run("Only ASCII keySystems are supported");
687 return; 694 return;
688 } 695 }
689 696
690 std::string key_system_ascii = base::UTF16ToASCII(key_system); 697 std::string key_system_ascii = base::UTF16ToASCII(key_system);
691 if (!key_systems_->IsSupportedKeySystem(key_system_ascii)) { 698 if (!key_systems_->IsSupportedKeySystem(key_system_ascii)) {
692 not_supported_cb.Run("Unsupported keySystem"); 699 not_supported_cb.Run("Unsupported keySystem");
693 return; 700 return;
694 } 701 }
695 702
696 // 7.2-7.4. Implemented by OnSelectConfig(). 703 // 7.2-7.4. Implemented by OnSelectConfig().
697 // TODO(sandersd): This should be async, ideally not on the main thread. 704 // TODO(sandersd): This should be async, ideally not on the main thread.
698 scoped_ptr<SelectionRequest> request(new SelectionRequest()); 705 scoped_ptr<SelectionRequest> request(new SelectionRequest());
699 request->key_system = key_system_ascii; 706 request->key_system = key_system_ascii;
707 #if defined(OS_ANDROID)
708 request->allow_secure_surfaces = allow_secure_surfaces;
709 #endif // defined(OS_ANDROID)
700 request->candidate_configurations = candidate_configurations; 710 request->candidate_configurations = candidate_configurations;
701 request->security_origin = security_origin; 711 request->security_origin = security_origin;
702 request->succeeded_cb = succeeded_cb; 712 request->succeeded_cb = succeeded_cb;
703 request->not_supported_cb = not_supported_cb; 713 request->not_supported_cb = not_supported_cb;
704 SelectConfigInternal(request.Pass()); 714 SelectConfigInternal(request.Pass());
705 } 715 }
706 716
707 void KeySystemConfigSelector::SelectConfigInternal( 717 void KeySystemConfigSelector::SelectConfigInternal(
708 scoped_ptr<SelectionRequest> request) { 718 scoped_ptr<SelectionRequest> request) {
709 // Continued from requestMediaKeySystemAccess(), step 7.1, from 719 // Continued from requestMediaKeySystemAccess(), step 7.1, from
710 // https://w3c.github.io/encrypted-media/#requestmediakeysystemaccess 720 // https://w3c.github.io/encrypted-media/#requestmediakeysystemaccess
711 // 721 //
712 // 7.2. Let implementation be the implementation of keySystem. 722 // 7.2. Let implementation be the implementation of keySystem.
713 // (|key_systems_| fills this role.) 723 // (|key_systems_| fills this role.)
714 // 7.3. For each value in supportedConfigurations: 724 // 7.3. For each value in supportedConfigurations:
715 for (size_t i = 0; i < request->candidate_configurations.size(); i++) { 725 for (size_t i = 0; i < request->candidate_configurations.size(); i++) {
716 // 7.3.1. Let candidate configuration be the value. 726 // 7.3.1. Let candidate configuration be the value.
717 // 7.3.2. Let supported configuration be the result of executing the Get 727 // 7.3.2. Let supported configuration be the result of executing the Get
718 // Supported Configuration algorithm on implementation, candidate 728 // Supported Configuration algorithm on implementation, candidate
719 // configuration, and origin. 729 // configuration, and origin.
720 // 7.3.3. If supported configuration is not null, [initialize and return a 730 // 7.3.3. If supported configuration is not null, [initialize and return a
721 // new MediaKeySystemAccess object.] 731 // new MediaKeySystemAccess object.]
722 ConfigState config_state(request->was_permission_requested, 732 ConfigState config_state(request->was_permission_requested,
723 request->is_permission_granted); 733 request->is_permission_granted);
734 #if defined(OS_ANDROID)
735 // On Android, hardware-secure codecs are not allowed when the renderer
736 // preference is not enabled.
ddorwin 2015/05/06 02:17:11 This comment is specific to code outside the funct
sandersd (OOO until July 31) 2015/05/08 00:37:42 Done.
737 DCHECK(config_state.IsRuleSupported(
738 EmeConfigRule::SECURE_CODECS_NOT_ALLOWED);
739 if (!request->allow_secure_surfaces)
740 config_state.AddRule(EmeConfigRule::SECURE_CODECS_NOT_ALLOWED);
741 #endif // defined(OS_ANDROID)
724 blink::WebMediaKeySystemConfiguration accumulated_configuration; 742 blink::WebMediaKeySystemConfiguration accumulated_configuration;
725 ConfigurationSupport support = GetSupportedConfiguration( 743 ConfigurationSupport support = GetSupportedConfiguration(
726 request->key_system, request->candidate_configurations[i], 744 request->key_system, request->candidate_configurations[i],
727 &config_state, &accumulated_configuration); 745 &config_state, &accumulated_configuration);
728 switch (support) { 746 switch (support) {
729 case CONFIGURATION_NOT_SUPPORTED: 747 case CONFIGURATION_NOT_SUPPORTED:
730 continue; 748 continue;
731 case CONFIGURATION_REQUIRES_PERMISSION: 749 case CONFIGURATION_REQUIRES_PERMISSION:
732 if (request->was_permission_requested) { 750 if (request->was_permission_requested) {
733 DVLOG(2) << "Rejecting requested configuration because " 751 DVLOG(2) << "Rejecting requested configuration because "
734 << "permission was denied."; 752 << "permission was denied.";
735 continue; 753 continue;
736 } 754 }
737 media_permission_->RequestPermission( 755 media_permission_->RequestPermission(
738 MediaPermission::PROTECTED_MEDIA_IDENTIFIER, 756 MediaPermission::PROTECTED_MEDIA_IDENTIFIER,
739 GURL(request->security_origin.toString()), 757 GURL(request->security_origin.toString()),
740 base::Bind(&KeySystemConfigSelector::OnPermissionResult, 758 base::Bind(&KeySystemConfigSelector::OnPermissionResult,
741 weak_factory_.GetWeakPtr(), base::Passed(&request))); 759 weak_factory_.GetWeakPtr(), base::Passed(&request)));
742 return; 760 return;
743 case CONFIGURATION_SUPPORTED: 761 case CONFIGURATION_SUPPORTED:
762 #if defined(OS_ANDROID)
763 request->succeeded_cb.Run(accumulated_configuration,
764 config_state.AreSecureCodecsRequired());
765 #else
744 request->succeeded_cb.Run(accumulated_configuration); 766 request->succeeded_cb.Run(accumulated_configuration);
767 #endif // defined(OS_ANDROID)
745 return; 768 return;
746 } 769 }
747 } 770 }
748 771
749 // 7.4. Reject promise with a new DOMException whose name is 772 // 7.4. Reject promise with a new DOMException whose name is
750 // NotSupportedError. 773 // NotSupportedError.
751 request->not_supported_cb.Run( 774 request->not_supported_cb.Run(
752 "None of the requested configurations were supported."); 775 "None of the requested configurations were supported.");
753 } 776 }
754 777
755 void KeySystemConfigSelector::OnPermissionResult( 778 void KeySystemConfigSelector::OnPermissionResult(
756 scoped_ptr<SelectionRequest> request, 779 scoped_ptr<SelectionRequest> request,
757 bool is_permission_granted) { 780 bool is_permission_granted) {
758 request->was_permission_requested = true; 781 request->was_permission_requested = true;
759 request->is_permission_granted = is_permission_granted; 782 request->is_permission_granted = is_permission_granted;
760 SelectConfigInternal(request.Pass()); 783 SelectConfigInternal(request.Pass());
761 } 784 }
762 785
763 } // namespace media 786 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698