1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/modules/credentialmanagement/federated_credential.h"
#include "base/metrics/histogram_macros.h"
#include "third_party/blink/public/web/modules/credentialmanagement/throttle_helper.h"
#include "third_party/blink/public/web/web_frame.h"
#include "third_party/blink/public/web/web_local_frame.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_credential_request_options.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_federated_credential_init.h"
#include "third_party/blink/renderer/core/dom/dom_exception.h"
#include "third_party/blink/renderer/modules/credentialmanagement/credential_manager_proxy.h"
#include "third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.h"
#include "third_party/blink/renderer/platform/bindings/exception_state.h"
#include "third_party/blink/renderer/platform/wtf/wtf.h"
namespace blink {
namespace {
constexpr char kFederatedCredentialType[] = "federated";
} // namespace
FederatedCredential* FederatedCredential::Create(
const FederatedCredentialInit* data,
ExceptionState& exception_state) {
if (data->id().empty()) {
exception_state.ThrowTypeError("'id' must not be empty.");
return nullptr;
}
if (data->provider().empty()) {
exception_state.ThrowTypeError("'provider' must not be empty.");
return nullptr;
}
KURL icon_url;
if (data->hasIconURL())
icon_url = ParseStringAsURLOrThrow(data->iconURL(), exception_state);
if (exception_state.HadException())
return nullptr;
KURL provider_url =
ParseStringAsURLOrThrow(data->provider(), exception_state);
if (exception_state.HadException())
return nullptr;
String name;
if (data->hasName())
name = data->name();
return MakeGarbageCollected<FederatedCredential>(
data->id(), SecurityOrigin::Create(provider_url), name, icon_url);
}
FederatedCredential* FederatedCredential::Create(
const String& id,
scoped_refptr<const SecurityOrigin> provider,
const String& name,
const KURL& icon_url) {
return MakeGarbageCollected<FederatedCredential>(
id, provider, name, icon_url.IsEmpty() ? blink::KURL() : icon_url);
}
FederatedCredential::FederatedCredential(
const String& id,
scoped_refptr<const SecurityOrigin> provider_origin,
const String& name,
const KURL& icon_url)
: Credential(id, kFederatedCredentialType),
provider_origin_(provider_origin),
name_(name),
icon_url_(icon_url) {
DCHECK(provider_origin);
}
bool FederatedCredential::IsFederatedCredential() const {
return true;
}
void SetIdpSigninStatus(const blink::LocalFrameToken& local_frame_token,
const url::Origin& origin,
mojom::blink::IdpSigninStatus status) {
CHECK(WTF::IsMainThread());
LocalFrame* local_frame = LocalFrame::FromFrameToken(local_frame_token);
// Null checking DomWindow() and GetFrame() for detached frame case. See
// https://crbug.com/382646175 for details.
if (!local_frame || !local_frame->DomWindow() ||
!local_frame->DomWindow()->GetFrame()) {
return;
}
auto* auth_request = CredentialManagerProxy::From(local_frame->DomWindow())
->FederatedAuthRequest();
auth_request->SetIdpSigninStatus(SecurityOrigin::CreateFromUrlOrigin(origin),
status, /*options=*/nullptr,
base::DoNothing());
}
} // namespace blink
|