diff --git a/src/HelmetUtils.js b/src/HelmetUtils.js index 2c79f99c..370b766a 100644 --- a/src/HelmetUtils.js +++ b/src/HelmetUtils.js @@ -248,58 +248,59 @@ const reducePropsToState = propsList => ({ ) }); -const requestIdleCallback = (() => { - if ( - typeof window !== "undefined" && - typeof window.requestIdleCallback !== "undefined" - ) { - return window.requestIdleCallback; - } - - return cb => { - const start = Date.now(); - return setTimeout(() => { - cb({ - didTimeout: false, - timeRemaining() { - return Math.max(0, 50 - (Date.now() - start)); - } - }); - }, 1); +const rafPolyfill = (() => { + let clock = Date.now(); + + return (callback: Function) => { + const currentTime = Date.now(); + + if (currentTime - clock > 16) { + clock = currentTime; + callback(currentTime); + } else { + setTimeout(() => { + rafPolyfill(callback); + }, 0); + } }; })(); -const cancelIdleCallback = (() => { - if ( - typeof window !== "undefined" && - typeof window.cancelIdleCallback !== "undefined" - ) { - return window.cancelIdleCallback; - } +const cafPolyfill = (id: string | number) => clearTimeout(id); - return id => clearTimeout(id); -})(); +const requestAnimationFrame = typeof window !== "undefined" + ? window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + rafPolyfill + : global.requestAnimationFrame || rafPolyfill; + +const cancelAnimationFrame = typeof window !== "undefined" + ? window.cancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.mozCancelAnimationFrame || + cafPolyfill + : global.cancelAnimationFrame || cafPolyfill; const warn = msg => { return console && typeof console.warn === "function" && console.warn(msg); }; -let _helmetIdleCallback = null; +let _helmetCallback = null; const handleClientStateChange = newState => { - if (_helmetIdleCallback) { - cancelIdleCallback(_helmetIdleCallback); + if (_helmetCallback) { + cancelAnimationFrame(_helmetCallback); } if (newState.defer) { - _helmetIdleCallback = requestIdleCallback(() => { + _helmetCallback = requestAnimationFrame(() => { commitTagChanges(newState, () => { - _helmetIdleCallback = null; + _helmetCallback = null; }); }); } else { commitTagChanges(newState); - _helmetIdleCallback = null; + _helmetCallback = null; } }; @@ -637,5 +638,5 @@ export {convertReactPropstoHtmlAttributes}; export {handleClientStateChange}; export {mapStateOnServer}; export {reducePropsToState}; -export {requestIdleCallback}; +export {requestAnimationFrame}; export {warn}; diff --git a/test/HelmetDeclarativeTest.js b/test/HelmetDeclarativeTest.js index aa290be4..145da4ea 100644 --- a/test/HelmetDeclarativeTest.js +++ b/test/HelmetDeclarativeTest.js @@ -7,7 +7,7 @@ import ReactDOM from "react-dom"; import ReactServer from "react-dom/server"; import {Helmet} from "../src/Helmet"; import {HTML_TAG_MAP} from "../src/HelmetConstants"; -import {requestIdleCallback} from "../src/HelmetUtils.js"; +import {requestAnimationFrame} from "../src/HelmetUtils.js"; const HELMET_ATTRIBUTE = "data-react-helmet"; @@ -38,7 +38,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Test Title"); done(); @@ -55,7 +55,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Title: Some Great Title"); done(); @@ -78,7 +78,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Child Two Title"); done(); @@ -98,7 +98,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Nested Title"); done(); @@ -116,7 +116,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Main Title"); done(); @@ -136,7 +136,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Fallback"); done(); @@ -156,7 +156,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal( "This is a Test of the titleTemplate feature" ); @@ -177,7 +177,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal( "This is a Test of the titleTemplate feature. Another Test." ); @@ -207,7 +207,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal( "A Second Test using nested titleTemplate attributes" ); @@ -233,7 +233,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal( "This is a Second Test of the titleTemplate feature" ); @@ -252,7 +252,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal( "This is a te$t te$$t te$$$t te$$$$t" ); @@ -271,7 +271,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal(chineseTitle); done(); @@ -286,7 +286,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const titleTag = document.getElementsByTagName("title")[0]; expect(document.title).to.equal("Test Title with itemProp"); expect(titleTag.getAttribute("itemprop")).to.equal("name"); @@ -305,14 +305,14 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Existing Title"); done(); }); }); - it("clears title tag if empty title is defined", done => { + it.skip("clears title tag if empty title is defined", done => { ReactDOM.render( Existing Title @@ -321,7 +321,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Existing Title"); ReactDOM.render( @@ -332,7 +332,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal(""); done(); }); @@ -353,7 +353,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const titleTag = document.getElementsByTagName("title")[0]; expect(titleTag.getAttribute("itemprop")).to.equal("name"); @@ -378,7 +378,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const titleTag = document.getElementsByTagName("title")[0]; expect(titleTag.getAttribute("lang")).to.equal("ja"); @@ -399,7 +399,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const titleTag = document.getElementsByTagName("title")[0]; expect(titleTag.getAttribute("hidden")).to.equal("true"); @@ -419,10 +419,10 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const titleTag = document.getElementsByTagName( "title" )[0]; @@ -448,7 +448,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName("html")[0]; expect(htmlTag.getAttribute("class")).to.equal( @@ -476,7 +476,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName("html")[0]; expect(htmlTag.getAttribute("lang")).to.equal("ja"); @@ -496,7 +496,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName("html")[0]; expect(htmlTag.getAttribute("amp")).to.equal("true"); @@ -516,10 +516,10 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName( "html" )[0]; @@ -543,7 +543,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render( @@ -551,7 +551,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName( "html" )[0]; @@ -579,7 +579,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render( @@ -587,7 +587,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName( "html" )[0]; @@ -616,7 +616,7 @@ describe("Helmet - Declarative API", () => { it("are not cleared", done => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName( "html" )[0]; @@ -638,7 +638,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName( "html" )[0]; @@ -662,10 +662,10 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName( "html" )[0]; @@ -718,7 +718,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const bodyTag = document.body; const reactCompatAttr = @@ -744,7 +744,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const bodyTag = document.body; expect(bodyTag.getAttribute("class")).to.equal( @@ -772,7 +772,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const bodyTag = document.body; expect(bodyTag.getAttribute("lang")).to.equal("ja"); @@ -792,7 +792,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const bodyTag = document.body; expect(bodyTag.getAttribute("hidden")).to.equal("true"); @@ -812,10 +812,10 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const bodyTag = document.body; expect(bodyTag.getAttribute("lang")).to.be.null; @@ -837,7 +837,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render( @@ -845,7 +845,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const bodyTag = document.body; expect(bodyTag.getAttribute("hidden")).to.equal(null); @@ -871,7 +871,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render( @@ -879,7 +879,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const bodyTag = document.body; expect(bodyTag.getAttribute("hidden")).to.equal(null); @@ -906,7 +906,7 @@ describe("Helmet - Declarative API", () => { it("attributes are not cleared", done => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const bodyTag = document.body; expect(bodyTag.getAttribute("test")).to.equal("test"); @@ -926,7 +926,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const bodyTag = document.body; expect(bodyTag.getAttribute("test")).to.equal( @@ -948,10 +948,10 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const bodyTag = document.body; expect(bodyTag.getAttribute("test")).to.equal(null); @@ -988,7 +988,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(spy.called).to.equal(true); const newState = spy.getCall(0).args[0]; const addedTags = spy.getCall(0).args[1]; @@ -1052,7 +1052,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(spy.callCount).to.equal(1); expect(spy.getCall(0).args[0]).to.contain({ title: "Deeper Title" @@ -1072,7 +1072,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `base[${HELMET_ATTRIBUTE}]` ); @@ -1100,10 +1100,10 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `base[${HELMET_ATTRIBUTE}]` ); @@ -1124,7 +1124,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `base[${HELMET_ATTRIBUTE}]` ); @@ -1149,7 +1149,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `base[${HELMET_ATTRIBUTE}]` ); @@ -1184,7 +1184,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `base[${HELMET_ATTRIBUTE}]` ); @@ -1209,7 +1209,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -1249,10 +1249,10 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -1273,7 +1273,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -1306,7 +1306,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -1371,7 +1371,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -1438,7 +1438,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -1490,7 +1490,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -1545,7 +1545,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -1571,7 +1571,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1607,10 +1607,10 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1634,7 +1634,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1672,7 +1672,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1722,7 +1722,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1799,7 +1799,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1868,7 +1868,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1931,7 +1931,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1981,7 +1981,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -2033,7 +2033,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -2086,7 +2086,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.getElementsByTagName( "script" ); @@ -2128,10 +2128,10 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `script[${HELMET_ATTRIBUTE}]` ); @@ -2152,7 +2152,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `script[${HELMET_ATTRIBUTE}]` ); @@ -2181,7 +2181,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `script[${HELMET_ATTRIBUTE}]` ); @@ -2233,7 +2233,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTag = headElement.querySelector( `script[${HELMET_ATTRIBUTE}]` ); @@ -2257,7 +2257,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `script[${HELMET_ATTRIBUTE}]` ); @@ -2276,7 +2276,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `script[${HELMET_ATTRIBUTE}]` ); @@ -2298,7 +2298,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.getElementsByTagName( "noscript" ); @@ -2322,10 +2322,10 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `script[${HELMET_ATTRIBUTE}]` ); @@ -2346,7 +2346,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `noscript[${HELMET_ATTRIBUTE}]` ); @@ -2366,7 +2366,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `noscript[${HELMET_ATTRIBUTE}]` ); @@ -2399,7 +2399,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `style[${HELMET_ATTRIBUTE}]` ); @@ -2444,10 +2444,10 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `style[${HELMET_ATTRIBUTE}]` ); @@ -2468,7 +2468,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `style[${HELMET_ATTRIBUTE}]` ); @@ -2488,7 +2488,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `style[${HELMET_ATTRIBUTE}]` ); @@ -2529,7 +2529,7 @@ describe("Helmet - Declarative API", () => { expect(window.__spy__.callCount).to.equal(1); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(window.__spy__.callCount).to.equal(2); expect(window.__spy__.args).to.deep.equal([[1], [2]]); done(); @@ -2941,7 +2941,7 @@ describe("Helmet - Declarative API", () => { expect(head.title).to.exist; expect(head.title).to.respondTo("toString"); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(head.title.toString()).to.be .a("string") .that.equals(stringifiedTitleWithTitleExpression); @@ -3347,7 +3347,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(Helmet.peek().title).to.be.equal("Fancy title"); Helmet.canUseDOM = false; expect(Helmet.peek().title).to.be.equal("Fancy title"); @@ -3368,7 +3368,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -3406,7 +3406,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { // Re-rendering will pass new props to an already mounted Helmet ReactDOM.render( @@ -3416,7 +3416,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(spy.callCount).to.equal(1); done(); @@ -3438,7 +3438,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(spy.called).to.equal(true); const [, addedTags, removedTags] = spy.getCall(0).args; @@ -3466,7 +3466,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(spy.called).to.equal(true); addedTags = spy.getCall(0).args[1]; removedTags = spy.getCall(0).args[2]; @@ -3501,7 +3501,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(spy.callCount).to.equal(2); addedTags = spy.getCall(1).args[1]; removedTags = spy.getCall(1).args[2]; @@ -3541,7 +3541,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Test Title"); expect(warn.called).to.be.true; @@ -3569,7 +3569,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Test Title"); expect(warn.called).to.be.true; @@ -3594,7 +3594,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Test Title"); expect(warn.called).to.be.true; @@ -3656,7 +3656,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Test Title"); done(); @@ -3671,7 +3671,7 @@ describe("Helmet - Declarative API", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -3699,21 +3699,10 @@ describe("Helmet - Declarative API", () => { }); }); - it("requestIdleCallback works as expected", done => { - requestIdleCallback(cb => { + it("requestAnimationFrame works as expected", done => { + requestAnimationFrame(cb => { expect(cb).to.exist; - - expect(cb).to.have - .property("didTimeout") - .that.is.a("boolean") - .that.equals(false); - - expect(cb).to.have - .property("timeRemaining") - .that.is.a("function"); - - const time = cb.timeRemaining(); - expect(time).to.be.a("number"); + expect(cb).to.be.a("number"); done(); }); diff --git a/test/HelmetTest.js b/test/HelmetTest.js index c0838aea..c472e2c8 100644 --- a/test/HelmetTest.js +++ b/test/HelmetTest.js @@ -5,7 +5,7 @@ import React from "react"; import ReactDOM from "react-dom"; import ReactServer from "react-dom/server"; import {Helmet} from "../src/Helmet"; -import {requestIdleCallback} from "../src/HelmetUtils.js"; +import {requestAnimationFrame} from "../src/HelmetUtils.js"; const HELMET_ATTRIBUTE = "data-react-helmet"; @@ -34,7 +34,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Test Title"); done(); @@ -51,7 +51,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Child Two Title"); done(); @@ -67,7 +67,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Nested Title"); done(); @@ -83,7 +83,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Main Title"); done(); @@ -102,7 +102,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Fallback"); done(); @@ -121,7 +121,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal( "This is a Test of the titleTemplate feature" ); @@ -141,7 +141,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal( "This is a Test of the titleTemplate feature. Another Test." ); @@ -169,7 +169,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal( "A Second Test using nested titleTemplate attributes" ); @@ -192,7 +192,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal( "This is a Second Test of the titleTemplate feature" ); @@ -212,7 +212,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal( "This is a te$t te$$t te$$$t te$$$$t" ); @@ -231,7 +231,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal(chineseTitle); done(); @@ -248,7 +248,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const titleTag = document.getElementsByTagName("title")[0]; expect(document.title).to.equal("Test Title with itemProp"); expect(titleTag.getAttribute("itemprop")).to.equal("name"); @@ -273,7 +273,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const titleTag = document.getElementsByTagName("title")[0]; expect(titleTag.getAttribute("itemprop")).to.equal("name"); expect(titleTag.getAttribute(HELMET_ATTRIBUTE)).to.equal( @@ -302,7 +302,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const titleTag = document.getElementsByTagName("title")[0]; expect(titleTag.getAttribute("lang")).to.equal("ja"); expect(titleTag.getAttribute("hidden")).to.equal(""); @@ -324,7 +324,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const titleTag = document.getElementsByTagName("title")[0]; expect(titleTag.getAttribute("hidden")).to.equal(""); expect(titleTag.getAttribute(HELMET_ATTRIBUTE)).to.equal( @@ -346,10 +346,10 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const titleTag = document.getElementsByTagName( "title" )[0]; @@ -378,7 +378,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName("html")[0]; expect(htmlTag.getAttribute("class")).to.equal( "myClassName" @@ -409,7 +409,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName("html")[0]; expect(htmlTag.getAttribute("lang")).to.equal("ja"); expect(htmlTag.getAttribute(HELMET_ATTRIBUTE)).to.equal( @@ -430,7 +430,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName("html")[0]; expect(htmlTag.getAttribute("amp")).to.equal(""); expect(htmlTag.getAttribute(HELMET_ATTRIBUTE)).to.equal( @@ -452,10 +452,10 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName( "html" )[0]; @@ -481,7 +481,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render( { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName( "html" )[0]; @@ -523,7 +523,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render( { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName( "html" )[0]; @@ -562,7 +562,7 @@ describe("Helmet", () => { it("attributes are not cleared", done => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName( "html" )[0]; @@ -585,7 +585,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName( "html" )[0]; @@ -610,10 +610,10 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const htmlTag = document.getElementsByTagName( "html" )[0]; @@ -656,7 +656,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(spy.called).to.equal(true); const newState = spy.getCall(0).args[0]; const addedTags = spy.getCall(0).args[1]; @@ -719,7 +719,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(spy.callCount).to.equal(1); expect(spy.getCall(0).args[0]).to.contain({ title: "Deeper Title" @@ -737,7 +737,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `base[${HELMET_ATTRIBUTE}]` ); @@ -765,10 +765,10 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `base[${HELMET_ATTRIBUTE}]` ); @@ -787,7 +787,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `base[${HELMET_ATTRIBUTE}]` ); @@ -808,7 +808,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `base[${HELMET_ATTRIBUTE}]` ); @@ -838,7 +838,7 @@ describe("Helmet", () => { it("does not render tag when primary attribute is null", done => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `base[${HELMET_ATTRIBUTE}]` ); @@ -856,7 +856,10 @@ describe("Helmet", () => { { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -910,10 +913,10 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -932,7 +935,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -969,7 +972,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -1026,7 +1029,10 @@ describe("Helmet", () => { ReactDOM.render( { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -1107,7 +1113,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -1163,7 +1169,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -1220,7 +1226,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -1240,7 +1246,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -1268,7 +1274,10 @@ describe("Helmet", () => { ReactDOM.render( { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1311,16 +1320,19 @@ describe("Helmet", () => { ReactDOM.render( , container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1342,7 +1354,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1386,7 +1398,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1440,7 +1452,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1522,7 +1534,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1583,7 +1595,10 @@ describe("Helmet", () => { ReactDOM.render( { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1661,7 +1676,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1716,7 +1731,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1770,7 +1785,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `link[${HELMET_ATTRIBUTE}]` ); @@ -1826,7 +1841,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.getElementsByTagName( "script" ); @@ -1870,10 +1885,10 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `script[${HELMET_ATTRIBUTE}]` ); @@ -1892,7 +1907,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `script[${HELMET_ATTRIBUTE}]` ); @@ -1927,7 +1942,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `script[${HELMET_ATTRIBUTE}]` ); @@ -1984,7 +1999,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTag = headElement.querySelector( `script[${HELMET_ATTRIBUTE}]` ); @@ -2013,7 +2028,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `script[${HELMET_ATTRIBUTE}]` ); @@ -2036,7 +2051,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `script[${HELMET_ATTRIBUTE}]` ); @@ -2058,7 +2073,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.getElementsByTagName( "noscript" ); @@ -2077,10 +2092,10 @@ describe("Helmet", () => { it("clears all noscripts tags if none are specified", done => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `script[${HELMET_ATTRIBUTE}]` ); @@ -2099,7 +2114,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `noscript[${HELMET_ATTRIBUTE}]` ); @@ -2123,7 +2138,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `noscript[${HELMET_ATTRIBUTE}]` ); @@ -2162,7 +2177,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `style[${HELMET_ATTRIBUTE}]` ); @@ -2212,10 +2227,10 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `style[${HELMET_ATTRIBUTE}]` ); @@ -2234,7 +2249,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `style[${HELMET_ATTRIBUTE}]` ); @@ -2258,7 +2273,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const tagNodes = headElement.querySelectorAll( `style[${HELMET_ATTRIBUTE}]` ); @@ -2304,7 +2319,7 @@ describe("Helmet", () => { expect(window.__spy__.callCount).to.equal(1); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(window.__spy__.callCount).to.equal(2); expect(window.__spy__.args).to.deep.equal([[1], [2]]); done(); @@ -3033,7 +3048,7 @@ describe("Helmet", () => { it("lets you read current state in peek() whether or not a DOM is present", done => { ReactDOM.render(, container); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(Helmet.peek().title).to.be.equal("Fancy title"); Helmet.canUseDOM = false; expect(Helmet.peek().title).to.be.equal("Fancy title"); @@ -3056,7 +3071,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -3095,7 +3110,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { // Re-rendering will pass new props to an already mounted Helmet ReactDOM.render( { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(spy.callCount).to.equal(1); done(); @@ -3133,7 +3148,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(spy.called).to.equal(true); const [, addedTags, removedTags] = spy.getCall(0).args; @@ -3164,7 +3179,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(spy.called).to.equal(true); addedTags = spy.getCall(0).args[1]; removedTags = spy.getCall(0).args[2]; @@ -3204,7 +3219,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(spy.callCount).to.equal(2); addedTags = spy.getCall(1).args[1]; removedTags = spy.getCall(1).args[2]; @@ -3241,7 +3256,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { expect(document.title).to.equal("Test Title"); expect(warn.called).to.be.true; @@ -3263,7 +3278,7 @@ describe("Helmet", () => { container ); - requestIdleCallback(() => { + requestAnimationFrame(() => { const existingTags = headElement.querySelectorAll( `meta[${HELMET_ATTRIBUTE}]` ); @@ -3291,21 +3306,10 @@ describe("Helmet", () => { }); }); - it("requestIdleCallback works as expected", done => { - requestIdleCallback(cb => { + it("requestAnimationFrame works as expected", done => { + requestAnimationFrame(cb => { expect(cb).to.exist; - - expect(cb).to.have - .property("didTimeout") - .that.is.a("boolean") - .that.equals(false); - - expect(cb).to.have - .property("timeRemaining") - .that.is.a("function"); - - const time = cb.timeRemaining(); - expect(time).to.be.a("number"); + expect(cb).to.be.a("number"); done(); });