Index: third_party/WebKit/Source/modules/credentialmanager/CredentialsContainer.cpp |
diff --git a/third_party/WebKit/Source/modules/credentialmanager/CredentialsContainer.cpp b/third_party/WebKit/Source/modules/credentialmanager/CredentialsContainer.cpp |
index ff35965185a0314d8dca14c145930f627e48eadc..8b69934a5aae0e7754d57b57ac8b6bc58881049e 100644 |
--- a/third_party/WebKit/Source/modules/credentialmanager/CredentialsContainer.cpp |
+++ b/third_party/WebKit/Source/modules/credentialmanager/CredentialsContainer.cpp |
@@ -15,6 +15,7 @@ |
#include "core/dom/ExecutionContext.h" |
#include "core/frame/Frame.h" |
#include "core/frame/UseCounter.h" |
+#include "core/inspector/ConsoleMessage.h" |
#include "core/page/FrameTree.h" |
#include "modules/credentialmanager/Credential.h" |
#include "modules/credentialmanager/CredentialManagerClient.h" |
@@ -28,6 +29,7 @@ |
#include "public/platform/WebCredential.h" |
#include "public/platform/WebCredentialManagerClient.h" |
#include "public/platform/WebCredentialManagerError.h" |
+#include "public/platform/WebCredentialMediationRequirement.h" |
#include "public/platform/WebFederatedCredential.h" |
#include "public/platform/WebPasswordCredential.h" |
@@ -168,6 +170,27 @@ ScriptPromise CredentialsContainer::get( |
if (!CheckBoilerplate(resolver)) |
return promise; |
+ ExecutionContext* context = ExecutionContext::From(script_state); |
+ // Set the default mediation option if none is provided. |
+ // If both 'unmediated' and 'mediation' are set log a warning if they are |
+ // contradicting. |
+ // Also sets 'mediation' appropriately when only 'unmediated' is set. |
+ // TODO(http://crbug.com/715077): Remove this when 'unmediated' is removed. |
+ String mediation = "optional"; |
+ if (options.hasUnmediated() && !options.hasMediation()) { |
+ mediation = options.unmediated() ? "silent" : "optional"; |
+ } else if (options.hasMediation()) { |
+ mediation = options.mediation(); |
Mike West
2017/05/19 15:29:56
Please add a test for invalid values.
jdoerrie
2017/05/19 16:22:37
That already exists in credentialscontainer-get-er
|
+ if (options.hasUnmediated() && |
+ ((options.unmediated() && options.mediation() != "silent") || |
+ (!options.unmediated() && options.mediation() != "optional"))) { |
+ context->AddConsoleMessage(ConsoleMessage::Create( |
+ kJSMessageSource, kWarningMessageLevel, |
+ "mediation: '" + options.mediation() + "' overrides unmediated: " + |
+ (options.unmediated() ? "true" : "false") + ".")); |
Mike West
2017/05/19 15:29:57
Please add a test for this behavior.
jdoerrie
2017/05/19 16:22:37
Done, please see
credentialscontainer-get-warning
|
+ } |
+ } |
+ |
Vector<KURL> providers; |
if (options.hasFederated() && options.federated().hasProviders()) { |
for (const auto& string : options.federated().providers()) { |
@@ -177,14 +200,26 @@ ScriptPromise CredentialsContainer::get( |
} |
} |
- UseCounter::Count(ExecutionContext::From(script_state), |
- options.unmediated() |
- ? UseCounter::kCredentialManagerGetWithoutUI |
- : UseCounter::kCredentialManagerGetWithUI); |
+ UseCounter::Feature feature; |
+ WebCredentialMediationRequirement requirement; |
+ |
+ if (mediation == "silent") { |
+ feature = UseCounter::kCredentialManagerGetMediationSilent; |
+ requirement = WebCredentialMediationRequirement::kSilent; |
+ } else if (mediation == "optional") { |
+ feature = UseCounter::kCredentialManagerGetMediationOptional; |
+ requirement = WebCredentialMediationRequirement::kOptional; |
+ } else { |
+ DCHECK_EQ("required", mediation); |
+ feature = UseCounter::kCredentialManagerGetMediationRequired; |
+ requirement = WebCredentialMediationRequirement::kRequired; |
+ } |
- CredentialManagerClient::From(ExecutionContext::From(script_state)) |
- ->DispatchGet(options.unmediated(), options.password(), providers, |
- new RequestCallbacks(resolver)); |
+ UseCounter::Count(context, feature); |
Mike West
2017/05/19 15:29:57
Optional nit: I think it's simpler to just call `C
jdoerrie
2017/05/19 16:22:37
Done.
|
+ |
+ CredentialManagerClient::From(context)->DispatchGet( |
+ requirement, options.password(), providers, |
+ new RequestCallbacks(resolver)); |
return promise; |
} |