Skip to content

Commit 1aa7638

Browse files
committed
finish popup window processing
1 parent 742654a commit 1aa7638

17 files changed

+999
-346
lines changed

dist/IdentityModel.js

Lines changed: 335 additions & 104 deletions
Large diffs are not rendered by default.

sample/public/IdentityModel.js

Lines changed: 335 additions & 104 deletions
Large diffs are not rendered by default.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<!DOCTYPE html>
2+
<html>
3+
4+
<head>
5+
<title>user-manager test</title>
6+
<link rel='stylesheet' href='app.css'>
7+
</head>
8+
9+
<body>
10+
<script src='IdentityModel.js'></script>
11+
<script>
12+
IdentityModel.Log.logger = console;
13+
IdentityModel.Log.logLevel = IdentityModel.Log.INFO;
14+
new IdentityModel.UserManager().signinPopupCallback();
15+
</script>
16+
</body>
17+
18+
</html>

sample/public/user-manager-sample.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<button id='getUser'>get user</button>
1212
<button id='startSigninMainWindow'>start signin main window</button>
1313
<button id='endSigninMainWindow'>end signin main window</button>
14+
<button id='popupSignin'>signin with popup</button>
1415
<button id='iframeSignin'>signin with iframe</button>
1516
<button id='signoutMainWindow'>start signout main window</button>
1617
</div>

sample/public/user-manager-sample.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ document.getElementById('clearState').addEventListener("click", clearState, fals
88
document.getElementById('getUser').addEventListener("click", getUser, false);
99
document.getElementById('startSigninMainWindow').addEventListener("click", startSigninMainWindow, false);
1010
document.getElementById('endSigninMainWindow').addEventListener("click", endSigninMainWindow, false);
11+
document.getElementById('popupSignin').addEventListener("click", popupSignin, false);
1112
document.getElementById('iframeSignin').addEventListener("click", iframeSignin, false);
1213
document.getElementById('signoutMainWindow').addEventListener("click", signoutMainWindow, false);
1314

@@ -25,6 +26,8 @@ var settings = {
2526
response_type: 'id_token token',
2627
scope: 'openid email roles',
2728

29+
popup_redirect_uri:'http://localhost:5000/user-manager-sample-popup.html',
30+
2831
silent_redirect_uri:'http://localhost:5000/user-manager-sample-silent.html',
2932
enableSilentRedirect:true,
3033

@@ -68,6 +71,14 @@ function endSigninMainWindow() {
6871
});
6972
}
7073

74+
function popupSignin() {
75+
mgr.signinPopup().then(function(user) {
76+
log("signed in", user);
77+
}, function(err) {
78+
log(err);
79+
});
80+
}
81+
7182
function iframeSignin() {
7283
mgr.signinSilent().then(function(user) {
7384
log("signed in", user);

src/IFrameNavigator.js

Lines changed: 10 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,24 @@
22
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
33

44
import Log from './Log';
5-
import IFrameLoader from './IFrameLoader';
6-
7-
const DefaultTimeout = 5000;
5+
import IFrameWindow from './IFrameWindow';
86

97
export default class IFrameNavigator {
10-
constructor(timeout = DefaultTimeout){
11-
this._timeout = timeout;
12-
}
13-
14-
navigate(url) {
15-
Log.info("IFrameNavigator.navigate");
16-
17-
if (!url) {
18-
Log.error("No url provided");
19-
return Promise.reject(new Error("No url provided"));
20-
}
21-
22-
return new Promise((resolve, reject) => {
23-
new IFrameLoader(resolve, reject, this._timeout, url);
24-
});
25-
}
268

27-
get url() {
28-
Log.error("url should not be used with IFrameNavigator");
29-
throw new Error("url should not be used with IFrameNavigator");
9+
prepare() {
10+
let frame = new IFrameWindow();
11+
return Promise.resolve(frame);
3012
}
3113

3214
callback(url) {
3315
Log.info("IFrameNavigator.callback");
34-
35-
try{
36-
IFrameLoader.notifyParent(url);
37-
return Promose.resolve();
16+
17+
try {
18+
IFrameWindow.notifyParent(url);
19+
return Promise.resolve();
3820
}
39-
catch(e){
40-
return Promose.reject(e);
21+
catch (e) {
22+
return Promise.reject(e);
4123
}
4224
}
4325
}
Lines changed: 51 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,59 @@
33

44
import Log from './Log';
55

6-
export default class IFrameLoader {
6+
const DefaultTimeout = 5000;
77

8-
constructor(resolve, reject, timeout, url) {
9-
Log.info("IFrameLoader.ctor");
8+
export default class IFrameWindow {
109

11-
this._resolve = resolve;
12-
this._reject = reject;
10+
constructor() {
11+
Log.info("IFrameWindow.ctor");
1312

14-
this._frame = window.document.createElement("iframe");
15-
this._frame.style.display = "none";
13+
this._promise = new Promise((resolve, reject) => {
14+
this._resolve = resolve;
15+
this._reject = reject;
16+
});
1617

1718
this._boundMessageEvent = this._message.bind(this);
1819
window.addEventListener("message", this._boundMessageEvent, false);
20+
21+
this._frame = window.document.createElement("iframe");
22+
this._frame.style.display = "none";
23+
window.document.body.appendChild(this._frame);
24+
}
1925

20-
this._timer = window.setTimeout(this._timeout.bind(this), timeout);
26+
navigate(params) {
27+
Log.info("IFrameWindow.navigate");
2128

22-
window.document.body.appendChild(this._frame);
23-
this._frame.src = url;
29+
if (!params || !params.url) {
30+
this._error("No url provided");
31+
}
32+
else {
33+
this._timer = window.setTimeout(this._timeout.bind(this), DefaultTimeout);
34+
this._frame.src = params.url;
35+
}
36+
37+
return this.promise;
38+
}
39+
40+
get promise() {
41+
return this._promise;
42+
}
43+
44+
_success(data) {
45+
this._cleanup();
46+
47+
Log.info("Successful response from frame window");
48+
this._resolve(data);
49+
}
50+
_error(message) {
51+
this._cleanup();
52+
53+
Log.error(message);
54+
this._reject(new Error(message));
2455
}
2556

2657
_cleanup() {
27-
Log.info("IFrameLoader._cleanup");
58+
Log.info("IFrameWindow._cleanup");
2859

2960
window.removeEventListener("message", this._boundMessageEvent, false);
3061
window.clearTimeout(this._timer);
@@ -36,32 +67,23 @@ export default class IFrameLoader {
3667
}
3768

3869
_timeout() {
39-
Log.info("IFrameLoader._timeout");
40-
41-
this._cleanup();
42-
43-
Log.error("Frame loader timed out");
44-
this._reject(new Error("Frame loader timed out"));
70+
Log.info("IFrameWindow._timeout");
71+
this._error("Frame window timed out");
4572
}
4673

4774
_message(e) {
48-
Log.info("IFrameLoader._message");
75+
Log.info("IFrameWindow._message");
4976

5077
if (this._timer &&
5178
e.origin === this._origin &&
5279
e.source === this._frame.contentWindow
5380
) {
5481
let url = e.data.url;
55-
56-
this._cleanup();
57-
5882
if (url) {
59-
Log.info("Successful response from frame");
60-
this._resolve({ url: url });
83+
this._success({ url: url });
6184
}
6285
else {
63-
Log.error("Invalid response from frame", e.data);
64-
this._reject(new Error("Invalid response from frame"));
86+
this._error("Invalid response from frame");
6587
}
6688
}
6789
}
@@ -71,10 +93,13 @@ export default class IFrameLoader {
7193
}
7294

7395
static notifyParent(url) {
96+
Log.info("IFrameWindow.notifyParent");
97+
7498
if (window.parent && window !== window.parent) {
7599
url = url || window.location.href;
76100
if (url) {
77-
window.parent.postMessage({url:url}, location.protocol + "//" + location.host);
101+
Log.info("posting url message to parent");
102+
window.parent.postMessage({ url: url }, location.protocol + "//" + location.host);
78103
}
79104
}
80105
}

src/OidcClient.js

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,11 @@ import ResponseValidator from './ResponseValidator';
1313
import State from './State';
1414

1515
export default class OidcClient {
16-
constructor(settings,
17-
{
18-
stateStore = new WebStorageStateStore(),
19-
ResponseValidatorCtor = ResponseValidator,
20-
MetadataServiceCtor = MetadataService
21-
}
22-
){
16+
constructor(settings, {
17+
stateStore = new WebStorageStateStore(),
18+
ResponseValidatorCtor = ResponseValidator,
19+
MetadataServiceCtor = MetadataService
20+
} = {}){
2321
if (settings instanceof OidcClientSettings){
2422
this._settings = settings;
2523
}

src/OidcClientSettings.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export default class OidcClientSettings {
2020
prompt, display, max_age, ui_locales, acr_values,
2121
// behavior flags
2222
filterProtocolClaims = true, loadUserInfo = true, staleStateAge = DefaultStaleStateAge
23-
}) {
23+
} = {}) {
2424

2525
this._authority = authority;
2626
this._metadataUrl = metadataUrl;

src/PopupNavigator.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,24 @@
22
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.
33

44
import Log from './Log';
5+
import PopupWindow from './PopupWindow';
56

67
export default class PopupNavigator {
7-
8-
navigate(url) {
9-
Log.info("PopupNavigator.navigate");
10-
11-
return Promise.resolve();
8+
9+
prepare() {
10+
let popup = new PopupWindow();
11+
return Promise.resolve(popup);
1212
}
13-
13+
1414
callback(url) {
1515
Log.info("PopupNavigator.callback");
16-
16+
1717
try {
1818
PopupWindow.notifyOpener(url);
19-
return Promose.resolve();
19+
return Promise.resolve();
2020
}
2121
catch (e) {
22-
return Promose.reject(e);
22+
return Promise.reject(e);
2323
}
2424
}
2525
}

0 commit comments

Comments
 (0)