From 33b613699e050a9deae8289974e4020b47e3b116 Mon Sep 17 00:00:00 2001 From: George Kiselev Date: Wed, 25 May 2022 12:23:53 +0300 Subject: [PATCH 01/12] Processing possible absence of an element by selector When creating list of steps, we take into account the possible absence of element by selector If .element is a selector for which there is no element at the configuration stage, then we replace .element specifying a getter/setter for it. In the getter we return the element via document.querySelector Since that moment we assume that .element should return HTMLElement by selector and if there is still not element - throwing Error. Thus to check raw field below we need use ._element --- src/core/fetchIntroSteps.js | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/core/fetchIntroSteps.js b/src/core/fetchIntroSteps.js index 3eb4bac9b..48299c291 100644 --- a/src/core/fetchIntroSteps.js +++ b/src/core/fetchIntroSteps.js @@ -26,14 +26,37 @@ export default function fetchIntroSteps(targetElm) { //use querySelector function only when developer used CSS selector if (typeof currentItem.element === "string") { //grab the element with given selector from the page - currentItem.element = document.querySelector(currentItem.element); - } - - //intro without element - if ( + const el = document.querySelector(currentItem.element); + if (el !== null) { + currentItem.element = el; + } else { + // If element is not exists yet, we'll get it on step + const elSelector = currentItem.element; + Object.defineProperty(currentItem, "element", { + get() { + if (typeof this._element === "string") { + const result = document.querySelector(this._element); + if (result === null) + throw new Error( + "There is no element with given selector: " + this._element + ); + return result; + } else { + return this._element; + } + }, + set(value) { + this._element = value; + }, + enumerable: true, + }); + currentItem.element = elSelector; + } + } else if ( typeof currentItem.element === "undefined" || currentItem.element === null ) { + //intro without element let floatingElementQuery = document.querySelector( ".introjsFloatingElement" ); @@ -58,7 +81,7 @@ export default function fetchIntroSteps(targetElm) { currentItem.disableInteraction = this._options.disableInteraction; } - if (currentItem.element !== null) { + if (currentItem._element !== null || currentItem.element !== null) { introItems.push(currentItem); } }); From 7112475364e16cdb055ad58da8408d752a9fea2c Mon Sep 17 00:00:00 2001 From: George Kiselev Date: Wed, 25 May 2022 13:09:35 +0300 Subject: [PATCH 02/12] Selector without element is now not floating --- tests/core/fetchIntroSteps.test.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/core/fetchIntroSteps.test.js b/tests/core/fetchIntroSteps.test.js index 5b5e95b34..ef92f9540 100644 --- a/tests/core/fetchIntroSteps.test.js +++ b/tests/core/fetchIntroSteps.test.js @@ -10,6 +10,7 @@ describe("fetchIntroSteps", () => { steps: [ { element: "#element_does_not_exist", + position: "top", intro: "hello world", }, { @@ -23,7 +24,7 @@ describe("fetchIntroSteps", () => { expect(steps.length).toBe(2); - expect(steps[0].position).toBe("floating"); + expect(steps[0].position).toBe("top"); expect(steps[0].intro).toBe("hello world"); expect(steps[0].step).toBe(1); @@ -80,7 +81,7 @@ describe("fetchIntroSteps", () => { expect(steps[1].intro).toBe("second"); expect(steps[1].step).toBe(2); - expect(steps[2].position).toBe("floating"); + expect(steps[2].position).toBe("bottom"); expect(steps[2].intro).toBe("third"); expect(steps[2].step).toBe(3); }); From fc3cdfde766b583959fe4dc2ee1fd110a9d1fe4f Mon Sep 17 00:00:00 2001 From: George Kiselev Date: Wed, 25 May 2022 18:00:08 +0300 Subject: [PATCH 03/12] Several tests for elements that are added after configuration --- tests/core/fetchIntroSteps.test.js | 33 +++++++++++++++++ tests/index.test.js | 59 ++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) diff --git a/tests/core/fetchIntroSteps.test.js b/tests/core/fetchIntroSteps.test.js index ef92f9540..dd8f937f7 100644 --- a/tests/core/fetchIntroSteps.test.js +++ b/tests/core/fetchIntroSteps.test.js @@ -86,6 +86,39 @@ describe("fetchIntroSteps", () => { expect(steps[2].step).toBe(3); }); + test("should throw an error on calling step.element if it is not exists yet and return element after adding", () => { + const targetElement = document.createElement("div"); + const elId = "later_added"; + const steps = fetchIntroSteps.call( + { + _options: { + tooltipPosition: "bottom", + steps: [ + { + element: "#" + elId, + }, + ], + }, + }, + targetElement + ); + + expect(steps.length).toBe(1); + + try { + const element = steps[0].element; // jshint ignore:line + } catch (e) { + if (!e.message.includes("There is no element with given selector:")) + throw e; + } + + const laterAdded = document.createElement("div"); + laterAdded.setAttribute("id", elId); + document.body.appendChild(laterAdded); + + expect(steps[0].element).toBe(laterAdded); + }); + test("should find the data-* elements from the DOM", () => { const targetElement = document.createElement("div"); diff --git a/tests/index.test.js b/tests/index.test.js index 2e8d8dfaf..045837e12 100644 --- a/tests/index.test.js +++ b/tests/index.test.js @@ -146,6 +146,37 @@ describe("intro", () => { ); }); + test("should find added later element", () => { + const latterAddedElId = "later_added"; + var laterAddedEl; + var stepCounter = 0; + const intro = introJs() + .setOptions({ + steps: [ + { + intro: "step one", + }, + { + intro: "later aded", + element: "#" + latterAddedElId, + }, + ], + }) + .onchange(function (el) { + if (el && stepCounter === 1) expect(el).toBe(laterAddedEl); + stepCounter++; + }) + .start(); + + laterAddedEl = appendDummyElement(); + laterAddedEl.setAttribute("id", latterAddedElId); + + intro.nextStep(); + const step = intro.currentStep(); + expect(step).toBe(1); + expect(intro._introItems[step].element).toBe(laterAddedEl); + }); + test("should highlight the target element", () => { const p = appendDummyElement(); @@ -164,6 +195,34 @@ describe("intro", () => { expect(p.className).toContain("introjs-relativePosition"); }); + test("should highlight added later target element", (done) => { + const latterAddedElId = "later_added"; + const intro = introJs() + .setOptions({ + steps: [ + { + intro: "step one", + }, + { + intro: "later added", + element: "#" + latterAddedElId, + }, + ], + }) + .start(); + + const laterAdded = appendDummyElement(); + laterAdded.setAttribute("id", latterAddedElId); + + intro.nextStep(); + setTimeout(() => { + // Waiting for animation for avoiding error + expect(laterAdded.className).toContain("introjs-showElement"); + expect(laterAdded.className).toContain("introjs-relativePosition"); + done(); + }, 500); + }); + test("should not highlight the target element if queryString is incorrect", () => { const p = appendDummyElement(); From a0957d77a1c0a2b456c40bbb23cfc3f6d19729e6 Mon Sep 17 00:00:00 2001 From: George Kiselev Date: Thu, 7 Jul 2022 15:59:54 +0300 Subject: [PATCH 04/12] Added new html with button that creates div --- tests/cypress/setup/create_div_btn.html | 121 ++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 tests/cypress/setup/create_div_btn.html diff --git a/tests/cypress/setup/create_div_btn.html b/tests/cypress/setup/create_div_btn.html new file mode 100644 index 000000000..55e4f7caa --- /dev/null +++ b/tests/cypress/setup/create_div_btn.html @@ -0,0 +1,121 @@ + + + + + + Intro.js + + + + + + + + + + + + + Hello, world! + + +
+
+
+ + + Bootstrap + + + Jumbotron example + +
+ +
+
+

Custom jumbotron

+

+ Using a series of utilities, you can create this jumbotron, just + like the one in previous versions of Bootstrap. Check out the + examples below for how you can remix and restyle it to your + liking. +

+ +
+
+ +
© 2021
+
+
+ + + + + + + From a8f94351dd88768f8af1d2bbf993443802686278 Mon Sep 17 00:00:00 2001 From: George Kiselev Date: Mon, 30 May 2022 16:17:50 +0300 Subject: [PATCH 05/12] Cypress test for added later element --- .../integration/tour/added-later-element.js | 47 ++++++++++++++++++ .../added-later-element-end-base.png | Bin 0 -> 70361 bytes tests/cypress/support/commands.js | 4 ++ 3 files changed, 51 insertions(+) create mode 100644 tests/cypress/integration/tour/added-later-element.js create mode 100644 tests/cypress/snapshots/base/tour/added-later-element.js/added-later-element-end-base.png diff --git a/tests/cypress/integration/tour/added-later-element.js b/tests/cypress/integration/tour/added-later-element.js new file mode 100644 index 000000000..66707c383 --- /dev/null +++ b/tests/cypress/integration/tour/added-later-element.js @@ -0,0 +1,47 @@ +context("Added later element", () => { + const addedLaterElId = "later_added"; + const stepOneText = "step one"; + const stepTwoText = "step two, click on create btn"; + const stepThreeText = "added later element"; + const createDivBtnSelector = "#create-div-button"; + beforeEach(() => { + cy.visit("./cypress/setup/create_div_btn.html").then((window) => { + window + .introJs() + .setOptions({ + disableInteraction: false, + steps: [ + { + intro: stepOneText, + }, + { + intro: stepTwoText, + element: createDivBtnSelector, + }, + { + intro: stepThreeText, + element: "#" + addedLaterElId, + }, + ], + }) + .start(); + }); + }); + + it("should find by selector and highlight added later element", () => { + cy.get(".introjs-tooltiptext").contains(stepOneText); + cy.nextStep(); + cy.get(".introjs-tooltiptext").contains(stepTwoText); + cy.wait(500); + cy.get(createDivBtnSelector).click(); + cy.nextStep(); + cy.wait(500); + cy.get("#" + addedLaterElId) + .filter(".introjs-showElement") + .contains("Later added div"); + cy.wait(2000); + cy.compareSnapshot("added-later-element-end", 0.05); + cy.doneButton(); + cy.get(".introjs-showElement").should("not.exist"); + }); +}); diff --git a/tests/cypress/snapshots/base/tour/added-later-element.js/added-later-element-end-base.png b/tests/cypress/snapshots/base/tour/added-later-element.js/added-later-element-end-base.png new file mode 100644 index 0000000000000000000000000000000000000000..1391515742ef05123c1b1d946cc0e820c0697ff4 GIT binary patch literal 70361 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

Djj<)7D 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 literal 0 HcmV?d00001 diff --git a/tests/cypress/support/commands.js b/tests/cypress/support/commands.js index 494643438..c38e4e9ba 100644 --- a/tests/cypress/support/commands.js +++ b/tests/cypress/support/commands.js @@ -34,6 +34,10 @@ Cypress.Commands.add("nextStep", () => { cy.get(".introjs-nextbutton").click(); }); +Cypress.Commands.add("doneButton", () => { + cy.get(".introjs-donebutton").click(); +}); + Cypress.Commands.add("prevStep", () => { cy.get(".introjs-prevbutton").click(); }); From 5f58f8d8106fa53e89132eac744e4241f4f9dd95 Mon Sep 17 00:00:00 2001 From: George Kiselev Date: Thu, 16 Jun 2022 14:27:17 +0300 Subject: [PATCH 06/12] Added function to wait until element appears in DOM --- src/util/waitForElement.js | 64 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/util/waitForElement.js diff --git a/src/util/waitForElement.js b/src/util/waitForElement.js new file mode 100644 index 000000000..bc9705265 --- /dev/null +++ b/src/util/waitForElement.js @@ -0,0 +1,64 @@ +/** + * Waits until Element will appear + * + * @api private + * @method _waitForElement + * @param {string} elSelector Selector to locate Element + * @param {() => void} callback Callback to be called after Element appearance + */ +export default function _waitForElement(elSelector, callback) { + if (document.querySelector(elSelector) !== null) { + callback(); + return; + } + + if (typeof MutationObserver !== "undefined") { + /* jshint ignore:start */ + const observer = new MutationObserver(() => { + if (document.querySelector(elSelector) !== null) { + observer.disconnect(); + callback(); + } + }); + + observer.observe(document.body, { + childList: true, + subtree: true, + attributes: false, + characterData: false, + }); + /* jshint ignore:end */ + } else { + // Old browsers will wait by timeout + waitForElementByTimeout(elSelector, callback, 1000, 10000); + } +} + +/** + * @param {string} elSelector + * @param {() => void} callback + * @param {number} checkInterval In milliseconds + * @param {number} maxTimeout In milliseconds + */ +function waitForElementByTimeout( + elSelector, + callback, + checkInterval, + maxTimeout +) { + let startTimeInMs = Date.now(); + (function loopSearch() { + if (document.querySelector(elSelector) !== null) { + callback(); + return; + } else { + setTimeout(function () { + if (Date.now() - startTimeInMs > maxTimeout) { + callback(); + return; + } + loopSearch(); + }, checkInterval); + } + })(); +} From 6d3765324ac74666155190440df964a90eb5bbc1 Mon Sep 17 00:00:00 2001 From: George Kiselev Date: Tue, 7 Jun 2022 13:00:47 +0300 Subject: [PATCH 07/12] waitforElement function applied in nextStep --- src/core/steps.js | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/core/steps.js b/src/core/steps.js index b8593b695..5502f8491 100644 --- a/src/core/steps.js +++ b/src/core/steps.js @@ -1,6 +1,7 @@ import forEach from "../util/forEach"; import showElement from "./showElement"; import exitIntro from "./exitIntro"; +import waitForElement from "../util/waitForElement"; /** * Go to specific step of introduction @@ -59,7 +60,8 @@ export function nextStep() { if (typeof this._introBeforeChangeCallback !== "undefined") { continueStep = this._introBeforeChangeCallback.call( this, - nextStep && nextStep.element + nextStep && + (elementBySelectorNotExists(nextStep) ? undefined : nextStep.element) ); } @@ -79,7 +81,21 @@ export function nextStep() { return; } - showElement.call(this, nextStep); + if (elementBySelectorNotExists(nextStep)) { + waitForElement(nextStep._element, () => showElement.call(this, nextStep)); + } else { + showElement.call(this, nextStep); + } +} + +/** + * Return true if element locates by selector and doesn't exists yet + */ +function elementBySelectorNotExists(step) { + return ( + typeof step._element === "string" && + document.querySelector(step._element) === null + ); } /** From 87fa6043b8c08d3d19d397160896ea15bd5fb467 Mon Sep 17 00:00:00 2001 From: George Kiselev Date: Thu, 16 Jun 2022 14:35:35 +0300 Subject: [PATCH 08/12] Preventing calling nextStep while waiting for element --- src/core/steps.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/core/steps.js b/src/core/steps.js index 5502f8491..7d4c3f7dc 100644 --- a/src/core/steps.js +++ b/src/core/steps.js @@ -38,6 +38,7 @@ export function goToStepNumber(step) { */ export function nextStep() { this._direction = "forward"; + if (this._waitingNextElement) return; if (typeof this._currentStepNumber !== "undefined") { forEach(this._introItems, ({ step }, i) => { @@ -82,7 +83,11 @@ export function nextStep() { } if (elementBySelectorNotExists(nextStep)) { - waitForElement(nextStep._element, () => showElement.call(this, nextStep)); + this._waitingNextElement = true; + waitForElement(nextStep._element, () => { + this._waitingNextElement = false; + showElement.call(this, nextStep); + }); } else { showElement.call(this, nextStep); } From 2273565f34ca9f93a374337391a704800bc500db Mon Sep 17 00:00:00 2001 From: George Kiselev Date: Mon, 30 May 2022 17:09:27 +0300 Subject: [PATCH 09/12] Added new test for the found error Previously, if you press right arrow button at the end of tour, it ends. Now it doesn't ends and any action after right arrow do nothing --- tests/cypress/integration/tour/navigation.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/cypress/integration/tour/navigation.js b/tests/cypress/integration/tour/navigation.js index cc146831a..1301bec04 100644 --- a/tests/cypress/integration/tour/navigation.js +++ b/tests/cypress/integration/tour/navigation.js @@ -47,6 +47,14 @@ context("Navigation", () => { cy.get(".introjs-showElement").should("not.exist"); }); + it("should exit the tour after right btn pressed at the end", () => { + cy.get(".introjs-tooltiptext").contains("step one"); + cy.nextStep(); + cy.get(".introjs-tooltiptext").contains("step two"); + cy.realPress("ArrowRight"); + cy.get(".introjs-showElement").should("not.exist"); + }); + it("should close the tour after clicking on the exit button", () => { cy.get(".introjs-showElement").should("exist"); cy.get(".introjs-skipbutton").click(); From 758056040ae41a0e8bf87d37d95c1a8adf632ddd Mon Sep 17 00:00:00 2001 From: George Kiselev Date: Tue, 7 Jun 2022 19:01:22 +0300 Subject: [PATCH 10/12] Added test to check waiting for element added later --- tests/index.test.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tests/index.test.js b/tests/index.test.js index 045837e12..caa3883fe 100644 --- a/tests/index.test.js +++ b/tests/index.test.js @@ -177,6 +177,44 @@ describe("intro", () => { expect(intro._introItems[step].element).toBe(laterAddedEl); }); + test("should wait for element added after calling nextStep", (done) => { + const onbeforechangedMock = jest.fn(); + const latterAddedElId = "later_added"; + var laterAddedEl; + var stepCounter = 0; + const intro = introJs() + .setOptions({ + steps: [ + { + intro: "step one", + }, + { + intro: "later aded", + element: "#" + latterAddedElId, + }, + ], + }) + .onchange(function (el) { + if (el && stepCounter === 1) expect(el).toBe(laterAddedEl); + stepCounter++; + }) + .onbeforechange(onbeforechangedMock) + .start(); + + intro.nextStep(); + + laterAddedEl = appendDummyElement(); + laterAddedEl.setAttribute("id", latterAddedElId); + + expect(onbeforechangedMock).toBeCalledTimes(2); + + const step = intro.currentStep(); + expect(step).toBe(1); + expect(intro._introItems[step].element).toBe(laterAddedEl); + // waitForElement waits with waitForElementByTimeout cause there is no MutationObserver in JSDom, so we need to wait a bit longer than waitForElementByTimeout + setTimeout(done, 11500); + }, 15000); + test("should highlight the target element", () => { const p = appendDummyElement(); From 33e560b3f576d99f9d134cc6a317e9945c6f0082 Mon Sep 17 00:00:00 2001 From: kiselev Date: Fri, 5 Aug 2022 15:07:23 +0300 Subject: [PATCH 11/12] Added MutationObserver to globals in jshint config and removed jshint ignore --- .jshintrc | 1 + src/util/waitForElement.js | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.jshintrc b/.jshintrc index 83344265f..e8327ab55 100644 --- a/.jshintrc +++ b/.jshintrc @@ -9,6 +9,7 @@ "exports": true, "define": true, "SVGElement": true, + "MutationObserver": true, "Element": true, "module": true, "console": true, diff --git a/src/util/waitForElement.js b/src/util/waitForElement.js index bc9705265..87a9d5811 100644 --- a/src/util/waitForElement.js +++ b/src/util/waitForElement.js @@ -13,7 +13,6 @@ export default function _waitForElement(elSelector, callback) { } if (typeof MutationObserver !== "undefined") { - /* jshint ignore:start */ const observer = new MutationObserver(() => { if (document.querySelector(elSelector) !== null) { observer.disconnect(); @@ -27,7 +26,6 @@ export default function _waitForElement(elSelector, callback) { attributes: false, characterData: false, }); - /* jshint ignore:end */ } else { // Old browsers will wait by timeout waitForElementByTimeout(elSelector, callback, 1000, 10000); From d5eaf0d3d2f29f3fc6d934c1e99190954b48181a Mon Sep 17 00:00:00 2001 From: kiselev Date: Mon, 8 Aug 2022 12:40:34 +0300 Subject: [PATCH 12/12] Added tests for _waitForElementByTimeout function --- src/util/waitForElement.js | 4 +-- tests/util/waitForElement.test.js | 59 +++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 tests/util/waitForElement.test.js diff --git a/src/util/waitForElement.js b/src/util/waitForElement.js index 87a9d5811..06932d887 100644 --- a/src/util/waitForElement.js +++ b/src/util/waitForElement.js @@ -28,7 +28,7 @@ export default function _waitForElement(elSelector, callback) { }); } else { // Old browsers will wait by timeout - waitForElementByTimeout(elSelector, callback, 1000, 10000); + _waitForElementByTimeout(elSelector, callback, 1000, 10000); } } @@ -38,7 +38,7 @@ export default function _waitForElement(elSelector, callback) { * @param {number} checkInterval In milliseconds * @param {number} maxTimeout In milliseconds */ -function waitForElementByTimeout( +export function _waitForElementByTimeout( elSelector, callback, checkInterval, diff --git a/tests/util/waitForElement.test.js b/tests/util/waitForElement.test.js new file mode 100644 index 000000000..8d3c3d78c --- /dev/null +++ b/tests/util/waitForElement.test.js @@ -0,0 +1,59 @@ +import { _waitForElementByTimeout } from "../../src/util/waitForElement"; +import { appendDummyElement } from "../helper"; + +describe("Testing _waitForElementByTimeout", () => { + const interval = 100; + const maxTimeout = 3000; + + test("Callback call even if element doesn't appear after timeout", (done) => { + const callback = jest.fn(); + _waitForElementByTimeout("#not_existed", callback, interval, maxTimeout); + expect(callback).toBeCalledTimes(0); + setTimeout(function () { + expect(callback).toBeCalledTimes(1); + done(); + }, maxTimeout + interval); + }); + + test("Callback should be called immediately if elements already exists", () => { + const callback = jest.fn(); + const id = "prev_created"; + const el = appendDummyElement(); + el.setAttribute("id", id); + _waitForElementByTimeout("#" + id, callback, interval, maxTimeout); + expect(callback).toBeCalledTimes(1); + }); + + test("Callback must be called after the element appears", (done) => { + const callback = jest.fn(); + const id = "later_created"; + _waitForElementByTimeout("#" + id, callback, interval, maxTimeout); + expect(callback).toBeCalledTimes(0); + const el = appendDummyElement(); + el.setAttribute("id", id); + setTimeout(function () { + expect(callback).toBeCalledTimes(1); + done(); + }, interval); + }); + + test("Check interval is bigger than maximum timeout", (done) => { + _waitForElementByTimeout("#not_existed", done, 1000, 100); + }); + + test("Check interval is equal to maximum timeout", (done) => { + _waitForElementByTimeout("#not_existed", done, 1000, 1000); + }); + + test("Check interval is zero", (done) => { + _waitForElementByTimeout("#not_existed", done, 0, maxTimeout); + }); + + test("Maximum timeout is zero", (done) => { + _waitForElementByTimeout("#not_existed", done, interval, 0); + }); + + test("Maximum timeout and interval are zero", (done) => { + _waitForElementByTimeout("#not_existed", done, 0, 0); + }); +});