blob: d50070d5bebac6e513d87d1388df829c5c563c9e [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/permissions/attestation_permission_request.h"
#include "base/functional/callback.h"
#include "chrome/app/vector_icons/vector_icons.h"
#include "chrome/grit/generated_resources.h"
#include "components/permissions/permission_request.h"
#include "components/permissions/request_type.h"
#include "ui/base/l10n/l10n_util.h"
#include "url/origin.h"
// U2fApiPermissionRequest is a delegate class that provides information
// and callbacks to the PermissionRequestManager.
//
// PermissionRequestManager has a reference to this object and so this object
// must outlive it. Since attestation requests are never canceled,
// PermissionRequestManager guarantees that `PermissionRequest::RequestFinished`
// will always, eventually, be called. This object uses that fact to delete
// itself during `DeleteRequest` and thus owns itself.
class U2fApiPermissionRequest : public permissions::PermissionRequest {
public:
U2fApiPermissionRequest(permissions::RequestType type,
const url::Origin& requesting_origin,
base::OnceCallback<void(bool)> callback)
: PermissionRequest(
requesting_origin.GetURL(),
type,
/*has_gesture=*/false,
base::BindRepeating(&U2fApiPermissionRequest::PermissionDecided,
base::Unretained(this)),
base::BindOnce(&U2fApiPermissionRequest::DeleteRequest,
base::Unretained(this))),
callback_(std::move(callback)) {}
~U2fApiPermissionRequest() override = default;
void PermissionDecided(ContentSetting result,
bool is_one_time,
bool is_final_decision) {
DCHECK(!is_one_time);
DCHECK(is_final_decision);
if (callback_) {
std::move(callback_).Run(result == CONTENT_SETTING_ALLOW);
}
}
void DeleteRequest() {
// callback_ may not have run if the prompt was ignored. (I.e. the tab was
// closed while the prompt was displayed.)
if (callback_)
std::move(callback_).Run(false);
delete this;
}
private:
base::OnceCallback<void(bool)> callback_;
};
permissions::PermissionRequest* NewAttestationPermissionRequest(
const url::Origin& origin,
base::OnceCallback<void(bool)> callback) {
return new U2fApiPermissionRequest(
permissions::RequestType::kSecurityAttestation, origin,
std::move(callback));
}
permissions::PermissionRequest* NewU2fApiPermissionRequest(
const url::Origin& origin,
base::OnceCallback<void(bool)> callback) {
return new U2fApiPermissionRequest(permissions::RequestType::kU2fApiRequest,
origin, std::move(callback));
}