#include "core/dom/ExceptionCode.h"
#include "core/dom/ExecutionContext.h"
#include "modules/credentialmanager/Credential.h"
+#include "modules/credentialmanager/CredentialManagerClient.h"
+#include "modules/credentialmanager/LocalCredential.h"
#include "platform/weborigin/SecurityOrigin.h"
#include "public/platform/Platform.h"
#include "public/platform/WebCredential.h"
-#include "public/platform/WebCredentialManager.h"
+#include "public/platform/WebCredentialManagerClient.h"
#include "public/platform/WebCredentialManagerError.h"
+#include "public/platform/WebLocalCredential.h"
namespace blink {
static void rejectDueToCredentialManagerError(PassRefPtr<ScriptPromiseResolver> resolver, WebCredentialManagerError* reason)
{
-
switch (reason->errorType) {
case WebCredentialManagerError::ErrorTypeDisabled:
resolver->reject(DOMException::create(InvalidStateError, "The credential manager is disabled."));
}
}
-class NotificationCallbacks : public WebCredentialManager::NotificationCallbacks {
+class NotificationCallbacks : public WebCredentialManagerClient::NotificationCallbacks {
WTF_MAKE_NONCOPYABLE(NotificationCallbacks);
public:
explicit NotificationCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) : m_resolver(resolver) { }
const RefPtr<ScriptPromiseResolver> m_resolver;
};
-class RequestCallbacks : public WebCredentialManager::RequestCallbacks {
+class RequestCallbacks : public WebCredentialManagerClient::RequestCallbacks {
WTF_MAKE_NONCOPYABLE(RequestCallbacks);
public:
explicit RequestCallbacks(PassRefPtr<ScriptPromiseResolver> resolver) : m_resolver(resolver) { }
virtual void onSuccess(WebCredential* credential) OVERRIDE
{
- // FIXME: Split this into Local/Federated types.
- m_resolver->resolve(Credential::create(credential->id(), credential->name(), credential->avatarURL()));
+ if (!credential) {
+ m_resolver->resolve();
+ return;
+ }
+
+ // FIXME: Split this into Local/Federated types. Right now it's hard-coded to be a LocalCredential. :(
+ m_resolver->resolve(LocalCredential::create(static_cast<WebLocalCredential*>(credential)));
}
virtual void onError(WebCredentialManagerError* reason) OVERRIDE
CredentialsContainer::CredentialsContainer()
{
- ScriptWrappable::init(this);
}
-static bool canAccessCredentialManagerAPI(ScriptState* scriptState, PassRefPtr<ScriptPromiseResolver> resolver)
+static bool checkBoilerplate(PassRefPtr<ScriptPromiseResolver> resolver)
{
- SecurityOrigin* securityOrigin = scriptState->executionContext()->securityOrigin();
+ CredentialManagerClient* client = CredentialManagerClient::from(resolver->scriptState()->executionContext());
+ if (!client) {
+ resolver->reject(DOMException::create(InvalidStateError, "Could not establish connection to the credential manager."));
+ return false;
+ }
+
+ SecurityOrigin* securityOrigin = resolver->scriptState()->executionContext()->securityOrigin();
String errorMessage;
if (!securityOrigin->canAccessFeatureRequiringSecureOrigin(errorMessage)) {
resolver->reject(DOMException::create(SecurityError, errorMessage));
return false;
}
+
return true;
}
-static ScriptPromise stubImplementation(ScriptState* scriptState)
+ScriptPromise CredentialsContainer::request(ScriptState* scriptState, const Dictionary&)
{
RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
-
- if (!canAccessCredentialManagerAPI(scriptState, resolver))
+ if (!checkBoilerplate(resolver))
return promise;
- resolver->resolve();
+ WebVector<WebURL> tempVector;
+ CredentialManagerClient::from(scriptState->executionContext())->dispatchRequest(false, tempVector, new RequestCallbacks(resolver));
return promise;
}
-ScriptPromise CredentialsContainer::request(ScriptState* scriptState, const Dictionary&)
-{
- return stubImplementation(scriptState);
-}
-
ScriptPromise CredentialsContainer::notifySignedIn(ScriptState* scriptState, Credential* credential)
{
- return stubImplementation(scriptState);
+ RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
+ ScriptPromise promise = resolver->promise();
+ if (!checkBoilerplate(resolver))
+ return promise;
+
+ CredentialManagerClient::from(scriptState->executionContext())->dispatchSignedIn(WebCredential(credential->platformCredential()), new NotificationCallbacks(resolver));
+ return promise;
}
ScriptPromise CredentialsContainer::notifyFailedSignIn(ScriptState* scriptState, Credential* credential)
{
- return stubImplementation(scriptState);
+ RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
+ ScriptPromise promise = resolver->promise();
+ if (!checkBoilerplate(resolver))
+ return promise;
+
+ CredentialManagerClient::from(scriptState->executionContext())->dispatchFailedSignIn(WebCredential(credential->platformCredential()), new NotificationCallbacks(resolver));
+ return promise;
}
ScriptPromise CredentialsContainer::notifySignedOut(ScriptState* scriptState)
{
- return stubImplementation(scriptState);
+ RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
+ ScriptPromise promise = resolver->promise();
+ if (!checkBoilerplate(resolver))
+ return promise;
+
+ CredentialManagerClient::from(scriptState->executionContext())->dispatchSignedOut(new NotificationCallbacks(resolver));
+ return promise;
}
} // namespace blink