Skip to content

Commit 018f2b0

Browse files
committed
- Removes callback flicker when there is no pending redirect.
- Adds the ability to use spinners instead of progress bars. This is used only for the nascar screen. - Updates Readme for customizing country selector. PiperOrigin-RevId: 207748692 Change-Id: Iaebc5cd3a514fb065e4c901dc00348755daf2bab
1 parent eaef32b commit 018f2b0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+417
-48
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,8 @@ for a more in-depth example, showcasing a Single Page Application mode.
217217

218218
When redirecting back from accountchooser.com or Identity Providers like Google
219219
and Facebook, `start()` method needs to be called to finish the sign-in flow.
220-
If it requires a user interaction to start the initial sign-in process, you need to
221-
check if there is a pending redirect operation going on on page load to check whether `start()`
220+
If it requires a user interaction to start the initial sign-in process, you need to
221+
check if there is a pending redirect operation going on on page load to check whether `start()`
222222
needs to be called.
223223

224224
To check if there is a pending redirect operation to complete a sign-in attempt,

javascript/ui/element/elementtesthelper.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,12 @@ firebaseui.auth.ui.element.ElementTestHelper = function(name) {
4444
/**
4545
* Sets the component to test.
4646
* @param {goog.ui.Component} c The component to test.
47+
* @return {!firebaseui.auth.ui.element.ElementTestHelper}
4748
*/
4849
firebaseui.auth.ui.element.ElementTestHelper.prototype.setComponent =
4950
function(c) {
5051
this.component = c;
52+
return this;
5153
};
5254

5355

javascript/ui/page/base.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ goog.require('firebaseui.auth.ui.element.infoBar');
2727
goog.require('firebaseui.auth.ui.element.progressDialog');
2828
goog.require('firebaseui.auth.ui.mdl');
2929
goog.require('goog.dom');
30+
goog.require('goog.dom.classlist');
3031
goog.require('goog.events.Event');
3132
goog.require('goog.object');
3233
goog.require('goog.soy');
@@ -199,12 +200,18 @@ firebaseui.auth.ui.page.Base.prototype.startProcessing_ = function() {
199200
// pages that load quickly do not display the indicator.
200201
var self = this;
201202
this.inProcessing_ = true;
203+
// Check whether component uses default progress bar or spinner for busy
204+
// indicator.
205+
var useSpinner =
206+
goog.dom.classlist.contains(self.getElement(), 'firebaseui-use-spinner');
202207
this.showProcessingTimeout_ = window.setTimeout(function() {
203208
if (!self.getElement() || self.busyIndicator_ !== null) {
204209
return;
205210
}
206211
self.busyIndicator_ = goog.soy.renderAsElement(
207-
firebaseui.auth.soy2.element.busyIndicator, null, null,
212+
firebaseui.auth.soy2.element.busyIndicator,
213+
// Pass whether a spanner is to be used instead of a progress bar.
214+
{useSpinner: useSpinner}, null,
208215
self.getDomHelper());
209216
self.getElement().appendChild(self.busyIndicator_);
210217
firebaseui.auth.ui.mdl.upgrade(self.busyIndicator_);

javascript/ui/page/callback_test.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,24 @@ goog.require('firebaseui.auth.ui.page.Callback');
2323
goog.require('firebaseui.auth.ui.page.PageTestHelper');
2424
goog.require('goog.dom');
2525
goog.require('goog.dom.TagName');
26+
goog.require('goog.testing.MockClock');
2627
goog.require('goog.testing.jsunit');
2728

2829

30+
var mockClock;
2931
var root;
3032
var component;
33+
var pageTestHelper = new firebaseui.auth.ui.page.PageTestHelper()
34+
// Callback already has a progress bar. No need to use
35+
// executePromiseRequest.
36+
.excludeTests('testExecutePromiseRequest_')
37+
.registerTests();
3138

3239

3340
function setUp() {
41+
// Set up clock.
42+
mockClock = new goog.testing.MockClock();
43+
mockClock.install();
3444
root = goog.dom.createDom(goog.dom.TagName.DIV);
3545
document.body.appendChild(root);
3646
component = new firebaseui.auth.ui.page.Callback();
@@ -39,6 +49,9 @@ function setUp() {
3949

4050

4151
function tearDown() {
52+
// Tear down clock.
53+
mockClock.tick(Infinity);
54+
mockClock.reset();
4255
component.dispose();
4356
goog.dom.removeNode(root);
4457
}
@@ -51,7 +64,6 @@ function testCallback_getPageId() {
5164

5265
function testCallback_pageEvents() {
5366
// Run page event tests.
54-
var pageTestHelper = new firebaseui.auth.ui.page.PageTestHelper();
5567
// Dispose previously created container since test must run before rendering
5668
// the component in docoument.
5769
component.dispose();

javascript/ui/page/emailchangerevoke_test.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,30 @@ goog.require('firebaseui.auth.ui.page.EmailChangeRevoke');
2525
goog.require('firebaseui.auth.ui.page.PageTestHelper');
2626
goog.require('goog.dom');
2727
goog.require('goog.dom.TagName');
28+
goog.require('goog.testing.MockClock');
29+
goog.require('goog.testing.events');
2830
goog.require('goog.testing.jsunit');
2931

3032

33+
var mockClock;
3134
var root;
3235
var component;
3336
var formTestHelper = new firebaseui.auth.ui.element.FormTestHelper().
3437
excludeTests('testOnLinkClick_', 'testOnLinkEnter_').
3538
registerTests();
3639
var infoBarTestHelper =
3740
new firebaseui.auth.ui.element.InfoBarTestHelper().registerTests();
41+
var pageTestHelper =
42+
new firebaseui.auth.ui.page.PageTestHelper().registerTests();
3843

3944
var updateClicked;
4045
var onClick;
4146

4247

4348
function setUp() {
49+
// Set up clock.
50+
mockClock = new goog.testing.MockClock();
51+
mockClock.install();
4452
updateClicked = false;
4553
onClick = function() {
4654
updateClicked = true;
@@ -58,10 +66,14 @@ function setUp() {
5866
// Reset previous state of form helper.
5967
formTestHelper.resetState();
6068
infoBarTestHelper.setComponent(component);
69+
pageTestHelper.setClock(mockClock).setComponent(component);
6170
}
6271

6372

6473
function tearDown() {
74+
// Tear down clock.
75+
mockClock.tick(Infinity);
76+
mockClock.reset();
6577
component.dispose();
6678
goog.dom.removeNode(root);
6779
}
@@ -78,7 +90,6 @@ function testEmailChangeRevoke_resetPassword() {
7890

7991
function testEmailChangeRevoke_pageEvents() {
8092
// Run page event tests.
81-
var pageTestHelper = new firebaseui.auth.ui.page.PageTestHelper();
8293
// Dispose previously created container since test must run before rendering
8394
// the component in document.
8495
component.dispose();

javascript/ui/page/emailmismatch_test.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,27 @@ goog.require('firebaseui.auth.ui.page.EmailMismatch');
2525
goog.require('firebaseui.auth.ui.page.PageTestHelper');
2626
goog.require('goog.dom');
2727
goog.require('goog.dom.TagName');
28+
goog.require('goog.testing.MockClock');
2829
goog.require('goog.testing.jsunit');
2930
goog.require('goog.userAgent');
3031

3132

33+
var mockClock;
3234
var root;
3335
var component;
3436
// Test helper for submit button and secondary link.
3537
var formTestHelper =
3638
new firebaseui.auth.ui.element.FormTestHelper().registerTests();
3739
var tosPpTestHelper =
3840
new firebaseui.auth.ui.element.TosPpTestHelper().registerTests();
41+
var pageTestHelper =
42+
new firebaseui.auth.ui.page.PageTestHelper().registerTests();
3943

4044

4145
function setUp() {
46+
// Set up clock.
47+
mockClock = new goog.testing.MockClock();
48+
mockClock.install();
4249
root = goog.dom.createDom(goog.dom.TagName.DIV);
4350
document.body.appendChild(root);
4451
// Render email mismatch page with test helper onSubmit and onLinkClick
@@ -57,12 +64,16 @@ function setUp() {
5764
component.render(root);
5865
formTestHelper.setComponent(component);
5966
tosPpTestHelper.setComponent(component);
67+
pageTestHelper.setClock(mockClock).setComponent(component);
6068
// Reset previous state of form helper.
6169
formTestHelper.resetState();
6270
}
6371

6472

6573
function tearDown() {
74+
// Tear down clock.
75+
mockClock.tick(Infinity);
76+
mockClock.reset();
6677
component.dispose();
6778
goog.dom.removeNode(root);
6879
}
@@ -81,7 +92,6 @@ function testInitialFocus() {
8192

8293
function testEmailMismatch_pageEvents() {
8394
// Run page event tests.
84-
var pageTestHelper = new firebaseui.auth.ui.page.PageTestHelper();
8595
// Dispose previously created container since test must run before rendering
8696
// the component in docoument.
8797
component.dispose();

javascript/ui/page/federatedlinking_test.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@ goog.require('firebaseui.auth.ui.page.FederatedLinking');
2626
goog.require('firebaseui.auth.ui.page.PageTestHelper');
2727
goog.require('goog.dom');
2828
goog.require('goog.dom.TagName');
29+
goog.require('goog.testing.MockClock');
2930
goog.require('goog.testing.jsunit');
3031
goog.require('goog.userAgent');
3132

3233

34+
var mockClock;
3335
var root;
3436
var component;
3537
var formTestHelper = new firebaseui.auth.ui.element.FormTestHelper().
@@ -39,9 +41,14 @@ var infoBarTestHelper =
3941
new firebaseui.auth.ui.element.InfoBarTestHelper().registerTests();
4042
var tosPpTestHelper =
4143
new firebaseui.auth.ui.element.TosPpTestHelper().registerTests();
44+
var pageTestHelper =
45+
new firebaseui.auth.ui.page.PageTestHelper().registerTests();
4246

4347

4448
function setUp() {
49+
// Set up clock.
50+
mockClock = new goog.testing.MockClock();
51+
mockClock.install();
4552
root = goog.dom.createDom(goog.dom.TagName.DIV);
4653
document.body.appendChild(root);
4754
component = new firebaseui.auth.ui.page.FederatedLinking(
@@ -58,10 +65,14 @@ function setUp() {
5865
formTestHelper.resetState();
5966
infoBarTestHelper.setComponent(component);
6067
tosPpTestHelper.setComponent(component);
68+
pageTestHelper.setClock(mockClock).setComponent(component);
6169
}
6270

6371

6472
function tearDown() {
73+
// Tear down clock.
74+
mockClock.tick(Infinity);
75+
mockClock.reset();
6576
component.dispose();
6677
goog.dom.removeNode(root);
6778
}
@@ -79,7 +90,6 @@ function testInitialFocus() {
7990

8091
function testFederatedLinking_pageEvents() {
8192
// Run page event tests.
82-
var pageTestHelper = new firebaseui.auth.ui.page.PageTestHelper();
8393
// Dispose previously created container since test must run before rendering
8494
// the component in docoument.
8595
component.dispose();

javascript/ui/page/notice_test.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@ goog.require('firebaseui.auth.ui.page.PasswordResetSuccess');
3232
goog.require('firebaseui.auth.ui.page.UnrecoverableError');
3333
goog.require('goog.dom');
3434
goog.require('goog.dom.TagName');
35+
goog.require('goog.testing.MockClock');
3536
goog.require('goog.testing.jsunit');
3637
goog.require('goog.userAgent');
3738

3839

40+
var mockClock;
3941
var root;
4042
var component;
4143
var formTestHelper = new firebaseui.auth.ui.element.FormTestHelper().
@@ -45,9 +47,14 @@ var infoBarTestHelper =
4547
new firebaseui.auth.ui.element.InfoBarTestHelper().registerTests();
4648
var tosPpTestHelper =
4749
new firebaseui.auth.ui.element.TosPpTestHelper().registerTests();
50+
var pageTestHelper =
51+
new firebaseui.auth.ui.page.PageTestHelper().registerTests();
4852

4953

5054
function setUp() {
55+
// Set up clock.
56+
mockClock = new goog.testing.MockClock();
57+
mockClock.install();
5158
root = goog.dom.createDom(goog.dom.TagName.DIV);
5259
document.body.appendChild(root);
5360
component = new firebaseui.auth.ui.page.PasswordRecoveryEmailSent(
@@ -63,10 +70,14 @@ function setUp() {
6370
formTestHelper.resetState();
6471
infoBarTestHelper.setComponent(component);
6572
tosPpTestHelper.setComponent(component);
73+
pageTestHelper.setClock(mockClock).setComponent(component);
6674
}
6775

6876

6977
function tearDown() {
78+
// Tear down clock.
79+
mockClock.tick(Infinity);
80+
mockClock.reset();
7081
component.dispose();
7182
goog.dom.removeNode(root);
7283
}
@@ -84,7 +95,6 @@ function testInitialFocus() {
8495

8596
function testPasswordRecoveryEmailSent_pageEvents() {
8697
// Run page event tests.
87-
var pageTestHelper = new firebaseui.auth.ui.page.PageTestHelper();
8898
// Dispose previously created container since test must run before rendering
8999
// the component in docoument.
90100
component.dispose();

javascript/ui/page/pagetesthelper.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@ goog.provide('firebaseui.auth.ui.page.PageTestHelper');
2121
goog.setTestOnly('firebaseui.auth.ui.page.PageTestHelper');
2222

2323
goog.require('firebaseui.auth.EventDispatcher');
24+
goog.require('firebaseui.auth.ui.element.ElementTestHelper');
2425
goog.require('firebaseui.auth.ui.page.Base');
26+
goog.require('goog.Promise');
27+
goog.require('goog.dom');
28+
goog.require('goog.dom.classlist');
2529
goog.require('goog.events');
2630

2731

@@ -32,13 +36,17 @@ var page = firebaseui.auth.ui.page;
3236
/**
3337
* Initializes page test helper.
3438
* @constructor
39+
* @extends {firebaseui.auth.ui.element.ElementTestHelper}
3540
*/
3641
page.PageTestHelper = function() {
42+
page.PageTestHelper.base(this, 'constructor', 'Page');
3743
this.entered_ = false;
3844
this.exited_ = false;
3945
this.enteredEvent_ = null;
4046
this.exitedEvent_ = null;
4147
};
48+
goog.inherits(
49+
page.PageTestHelper, firebaseui.auth.ui.element.ElementTestHelper);
4250

4351

4452
/**
@@ -150,4 +158,54 @@ page.PageTestHelper.prototype.runTests = function(component, container) {
150158
this.assertExited(component.getPageId());
151159
this.resetState();
152160
};
161+
162+
163+
/**
164+
* @param {!goog.testing.MockClock} clock The mock clock to use for testing.
165+
* @return {!page.PageTestHelper} THe current page test helper instance.
166+
*/
167+
page.PageTestHelper.prototype.setClock = function(clock) {
168+
this.mockClock = clock;
169+
return this;
170+
};
171+
172+
173+
/**
174+
* Tests executePromiseRequest and the busy indicators that gets displayed.
175+
* @return {!goog.Promise} Promise that resolves when the test completes.
176+
* @private
177+
*/
178+
page.PageTestHelper.prototype.testExecutePromiseRequest_ = function() {
179+
var root = this.component.getContainer();
180+
var resolveBusyIndicator;
181+
var pending = new goog.Promise(function(resolve, reject) {
182+
resolveBusyIndicator= resolve;
183+
});
184+
var p = this.component.executePromiseRequest(
185+
function() {
186+
return pending;
187+
},
188+
[],
189+
function() {},
190+
function(error) {});
191+
this.mockClock.tick(500);
192+
var elements =
193+
goog.dom.getElementsByClass('firebaseui-busy-indicator', root);
194+
assertEquals(1, elements.length);
195+
var busyIndicator = elements[0];
196+
if (goog.dom.classlist.contains(root.firstChild, 'firebaseui-use-spinner')) {
197+
// Confirm mdl-spinner used instead of mdl-progress.
198+
assertTrue(goog.dom.classlist.contains(busyIndicator, 'mdl-spinner'));
199+
} else {
200+
// Confirm mdl-progress bar used instead of mdl-spinner.
201+
assertTrue(goog.dom.classlist.contains(busyIndicator, 'mdl-progress'));
202+
}
203+
// Resolve pending task.
204+
resolveBusyIndicator();
205+
return p.then(function() {
206+
// Busy indicator should be removed when promise resolves.
207+
assertEquals(0, goog.dom.getElementsByClass(
208+
'firebaseui-busy-indicator', root).length);
209+
});
210+
};
153211
});

0 commit comments

Comments
 (0)