oidc-client
Version:
OpenID Connect (OIDC) & OAuth2 client library
135 lines (109 loc) • 4.3 kB
JavaScript
// Copyright (c) Brock Allen & Dominick Baier. All rights reserved.
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
import { Log } from './Log.js';
import { UrlUtility } from './UrlUtility.js';
const CheckForPopupClosedInterval = 500;
const DefaultPopupFeatures = 'location=no,toolbar=no,width=500,height=500,left=100,top=100;';
//const DefaultPopupFeatures = 'location=no,toolbar=no,width=500,height=500,left=100,top=100;resizable=yes';
const DefaultPopupTarget = "_blank";
export class PopupWindow {
constructor(params) {
this._promise = new Promise((resolve, reject) => {
this._resolve = resolve;
this._reject = reject;
});
let target = params.popupWindowTarget || DefaultPopupTarget;
let features = params.popupWindowFeatures || DefaultPopupFeatures;
this._popup = window.open('', target, features);
if (this._popup) {
Log.debug("PopupWindow.ctor: popup successfully created");
this._checkForPopupClosedTimer = window.setInterval(this._checkForPopupClosed.bind(this), CheckForPopupClosedInterval);
}
}
get promise() {
return this._promise;
}
navigate(params) {
if (!this._popup) {
this._error("PopupWindow.navigate: Error opening popup window");
}
else if (!params || !params.url) {
this._error("PopupWindow.navigate: no url provided");
this._error("No url provided");
}
else {
Log.debug("PopupWindow.navigate: Setting URL in popup");
this._id = params.id;
if (this._id) {
window["popupCallback_" + params.id] = this._callback.bind(this);
}
this._popup.focus();
this._popup.window.location = params.url;
}
return this.promise;
}
_success(data) {
Log.debug("PopupWindow.callback: Successful response from popup window");
this._cleanup();
this._resolve(data);
}
_error(message) {
Log.error("PopupWindow.error: ", message);
this._cleanup();
this._reject(new Error(message));
}
close() {
this._cleanup(false);
}
_cleanup(keepOpen) {
Log.debug("PopupWindow.cleanup");
window.clearInterval(this._checkForPopupClosedTimer);
this._checkForPopupClosedTimer = null;
delete window["popupCallback_" + this._id];
if (this._popup && !keepOpen) {
this._popup.close();
}
this._popup = null;
}
_checkForPopupClosed() {
if (!this._popup || this._popup.closed) {
this._error("Popup window closed");
}
}
_callback(url, keepOpen) {
this._cleanup(keepOpen);
if (url) {
Log.debug("PopupWindow.callback success");
this._success({ url: url });
}
else {
Log.debug("PopupWindow.callback: Invalid response from popup");
this._error("Invalid response from popup");
}
}
static notifyOpener(url, keepOpen, delimiter) {
if (window.opener) {
url = url || window.location.href;
if (url) {
var data = UrlUtility.parseUrlFragment(url, delimiter);
if (data.state) {
var name = "popupCallback_" + data.state;
var callback = window.opener[name];
if (callback) {
Log.debug("PopupWindow.notifyOpener: passing url message to opener");
callback(url, keepOpen);
}
else {
Log.warn("PopupWindow.notifyOpener: no matching callback found on opener");
}
}
else {
Log.warn("PopupWindow.notifyOpener: no state found in response url");
}
}
}
else {
Log.warn("PopupWindow.notifyOpener: no window.opener. Can't complete notification.");
}
}
}