IdentityProvider.cpp (2657B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "mozilla/dom/IdentityProvider.h" 8 9 #include "mozilla/dom/WebIdentityHandler.h" 10 #include "nsIGlobalObject.h" 11 12 namespace mozilla { 13 namespace dom { 14 15 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(IdentityProvider, mOwner) 16 17 IdentityProvider::~IdentityProvider() = default; 18 19 JSObject* IdentityProvider::WrapObject(JSContext* aCx, 20 JS::Handle<JSObject*> aGivenProto) { 21 return IdentityProvider_Binding::Wrap(aCx, this, aGivenProto); 22 } 23 24 IdentityProvider::IdentityProvider(nsIGlobalObject* aGlobal) : mOwner(aGlobal) { 25 MOZ_ASSERT(mOwner); 26 } 27 28 // static 29 void IdentityProvider::Close(const GlobalObject& aGlobal) { 30 nsCOMPtr<nsPIDOMWindowInner> window = 31 do_QueryInterface(aGlobal.GetAsSupports()); 32 NS_ENSURE_TRUE_VOID(window); 33 (void)window->Close(); 34 } 35 36 // static 37 already_AddRefed<Promise> IdentityProvider::Resolve( 38 const GlobalObject& aGlobal, const nsACString& aToken, 39 const IdentityResolveOptions& aOptions, ErrorResult& aRv) { 40 nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(aGlobal.GetAsSupports()); 41 MOZ_ASSERT(global); 42 RefPtr<Promise> promise = Promise::Create(global, aRv); 43 if (NS_WARN_IF(aRv.Failed() || !promise)) { 44 return nullptr; 45 } 46 RefPtr<nsPIDOMWindowInner> window = global->GetAsInnerWindow(); 47 MOZ_ASSERT(window); 48 if (!window) { 49 promise->MaybeRejectWithNotAllowedError( 50 "IdentityProvider.resolve be called within a window."); 51 return promise.forget(); 52 } 53 WebIdentityHandler* identityHandler = window->GetOrCreateWebIdentityHandler(); 54 if (!identityHandler) { 55 promise->MaybeRejectWithNotAllowedError( 56 "IdentityProvider.resolve could not find a pending request to resolve"); 57 return promise.forget(); 58 } 59 identityHandler->ResolveContinuationWindow(aToken, aOptions) 60 ->Then( 61 GetCurrentSerialEventTarget(), __func__, 62 [promise, window](nsresult aSuccess) { 63 MOZ_ASSERT(NS_SUCCEEDED(aSuccess)); 64 promise->MaybeResolveWithUndefined(); 65 window->Close(); 66 }, 67 [promise](nsresult aFailure) { 68 promise->MaybeRejectWithNotAllowedError( 69 "IdentityProvider.resolve could not find a pending request to " 70 "resolve"); 71 }); 72 return promise.forget(); 73 } 74 75 } // namespace dom 76 } // namespace mozilla