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

Unified Diff: chrome/browser/media/protected_media_identifier_permission_context.cc

Issue 881983003: media: Invoke PlatformVerificationDialog from ProtectedMediaIdentifierPermissionContext. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: added todo + bug Created 5 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/media/protected_media_identifier_permission_context.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/media/protected_media_identifier_permission_context.cc
diff --git a/chrome/browser/media/protected_media_identifier_permission_context.cc b/chrome/browser/media/protected_media_identifier_permission_context.cc
index 990be4c913e70ad32e41955653b9c0b37cf8ebbb..ddea1247fc4c5af803bbf0dc32c76bdc04bdb74c 100644
--- a/chrome/browser/media/protected_media_identifier_permission_context.cc
+++ b/chrome/browser/media/protected_media_identifier_permission_context.cc
@@ -13,14 +13,34 @@
#include "content/public/browser/web_contents.h"
#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/attestation/platform_verification_dialog.h"
#include "chrome/browser/chromeos/settings/cros_settings.h"
#include "chromeos/settings/cros_settings_names.h"
+#include "ui/views/widget/widget.h"
+
+using chromeos::attestation::PlatformVerificationDialog;
+using chromeos::attestation::PlatformVerificationFlow;
+#endif
+
+#if defined(OS_CHROMEOS)
+namespace {
+PermissionRequestID GetInvalidPendingId() {
+ return PermissionRequestID(-1, -1, -1, GURL());
+}
+}
#endif
ProtectedMediaIdentifierPermissionContext::
ProtectedMediaIdentifierPermissionContext(Profile* profile)
: PermissionContextBase(profile,
- CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER) {
+ CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER)
+#if defined(OS_CHROMEOS)
+ ,
+ pending_id_(GetInvalidPendingId()),
+ widget_(nullptr),
+ weak_factory_(this)
+#endif
+{
}
ProtectedMediaIdentifierPermissionContext::
@@ -30,23 +50,61 @@ ProtectedMediaIdentifierPermissionContext::
void ProtectedMediaIdentifierPermissionContext::RequestPermission(
content::WebContents* web_contents,
const PermissionRequestID& id,
- const GURL& requesting_frame_origin,
+ const GURL& requesting_origin,
bool user_gesture,
const BrowserPermissionCallback& callback) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
- if (!IsProtectedMediaIdentifierEnabled()) {
- NotifyPermissionSet(id,
- requesting_frame_origin,
- web_contents->GetLastCommittedURL().GetOrigin(),
- callback, false, false);
+ GURL embedding_origin = web_contents->GetLastCommittedURL().GetOrigin();
+
+ if (!requesting_origin.is_valid() || !embedding_origin.is_valid() ||
+ !IsProtectedMediaIdentifierEnabled()) {
+ NotifyPermissionSet(id, requesting_origin, embedding_origin, callback,
+ false /* persist */, false /* granted */);
return;
}
- PermissionContextBase::RequestPermission(web_contents, id,
- requesting_frame_origin,
- user_gesture,
- callback);
+#if defined(OS_CHROMEOS)
+ // On ChromeOS, we don't use PermissionContextBase::RequestPermission() which
+ // uses the standard permission infobar/bubble UI. See http://crbug.com/454847
+ // Instead, we check the content setting and show the existing platform
+ // verification UI.
+ // TODO(xhwang): Remove when http://crbug.com/454847 is fixed.
+ ContentSetting content_setting =
+ GetPermissionStatus(requesting_origin, embedding_origin);
+
+ switch (content_setting) {
+ case CONTENT_SETTING_BLOCK:
+ NotifyPermissionSet(id, requesting_origin, embedding_origin, callback,
+ false /* persist */, false /* granted */);
+ return;
+ case CONTENT_SETTING_ALLOW:
+ NotifyPermissionSet(id, requesting_origin, embedding_origin, callback,
+ false /* persist */, true /* granted */);
+ return;
+ default:
+ break;
+ }
+
+ // We only support one prompt and one pending permission request.
+ // Reject the new one if there is already one pending. See
+ // http://crbug.com/447005
+ if (!pending_id_.Equals(GetInvalidPendingId())) {
+ callback.Run(false);
+ return;
+ }
+
+ pending_id_ = id;
+ widget_ = PlatformVerificationDialog::ShowDialog(
+ web_contents, requesting_origin,
+ base::Bind(&ProtectedMediaIdentifierPermissionContext::
+ OnPlatformVerificationResult,
+ weak_factory_.GetWeakPtr(), id, requesting_origin,
+ embedding_origin, callback));
+#else
+ PermissionContextBase::RequestPermission(web_contents, id, requesting_origin,
+ user_gesture, callback);
+#endif
}
ContentSetting ProtectedMediaIdentifierPermissionContext::GetPermissionStatus(
@@ -59,6 +117,26 @@ ContentSetting ProtectedMediaIdentifierPermissionContext::GetPermissionStatus(
embedding_origin);
}
+void ProtectedMediaIdentifierPermissionContext::CancelPermissionRequest(
+ content::WebContents* web_contents,
+ const PermissionRequestID& id) {
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+#if defined(OS_CHROMEOS)
+ if (!widget_ || !pending_id_.Equals(id))
+ return;
+
+ // Close the |widget_|. OnPlatformVerificationResult() will be fired
+ // during this process, but since |pending_id_| is cleared, the callback will
+ // be dropped.
+ pending_id_ = GetInvalidPendingId();
+ widget_->Close();
+ return;
+#else
+ PermissionContextBase::CancelPermissionRequest(web_contents, id);
+#endif
+}
+
void ProtectedMediaIdentifierPermissionContext::UpdateTabContext(
const PermissionRequestID& id,
const GURL& requesting_frame,
@@ -73,7 +151,6 @@ void ProtectedMediaIdentifierPermissionContext::UpdateTabContext(
content_settings->OnProtectedMediaIdentifierPermissionSet(
requesting_frame.GetOrigin(), allowed);
}
-
}
// TODO(xhwang): We should consolidate the "protected content" related pref
@@ -101,3 +178,34 @@ bool ProtectedMediaIdentifierPermissionContext::
<< "Protected media identifier disabled by the user or by device policy.";
return enabled;
}
+
+#if defined(OS_CHROMEOS)
+void ProtectedMediaIdentifierPermissionContext::OnPlatformVerificationResult(
+ const PermissionRequestID& id,
+ const GURL& requesting_origin,
+ const GURL& embedding_origin,
+ const BrowserPermissionCallback& callback,
+ chromeos::attestation::PlatformVerificationFlow::ConsentResponse response) {
+ DCHECK(widget_);
+ widget_ = nullptr;
+
+ // The request may have been canceled. Drop the callback here.
+ if (!pending_id_.Equals(id))
+ return;
+
+ pending_id_ = GetInvalidPendingId();
+
+ if (response == PlatformVerificationFlow::CONSENT_RESPONSE_NONE) {
+ // Deny request and do not save to content settings.
+ NotifyPermissionSet(id, requesting_origin, embedding_origin, callback,
+ false, // Do not save to content settings.
+ false); // Do not allow the permission.
+ return;
+ }
+
+ NotifyPermissionSet(
+ id, requesting_origin, embedding_origin, callback,
+ true, // Save to content settings.
+ response == PlatformVerificationFlow::CONSENT_RESPONSE_ALLOW);
+}
+#endif
« no previous file with comments | « chrome/browser/media/protected_media_identifier_permission_context.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698