From fc0a1978655a24328074db8446b0021d15e4fa0d Mon Sep 17 00:00:00 2001 From: Pazheva Date: Mon, 2 Jul 2018 15:29:15 +0300 Subject: [PATCH] [INTERNAL] sap.m.Fiori20Adapter: Property change listener checks property name Background: The Header Adapter registers property change listener for changes in the property values of the adapted sap.m.Text/sap.m.Title and sap.n.Button controls Problem: Check for the exact name of the property name in the property change listener was omitted => resulted in processing of unrelated property changes Solution: Ensured check for the name of the changed property Change-Id: I2681a8d87953ab26749e9a57c09a3154db710864 BCP: 002075129400002890412018 (cherry picked from commit 28ca1e1c19f5a5099adc76de392157ac7c5c4be9) CR-Id: 002075125900002474022018 --- src/sap.m/src/sap/m/Fiori20Adapter.js | 16 +++-- .../sap/m/qunit/Fiori20Adapter.qunit.html | 68 +++++++++++++++++++ 2 files changed, 80 insertions(+), 4 deletions(-) diff --git a/src/sap.m/src/sap/m/Fiori20Adapter.js b/src/sap.m/src/sap/m/Fiori20Adapter.js index ce222551b392..eb9a2a99a9ec 100644 --- a/src/sap.m/src/sap/m/Fiori20Adapter.js +++ b/src/sap.m/src/sap/m/Fiori20Adapter.js @@ -140,7 +140,8 @@ sap.ui.define(['jquery.sap.global', 'sap/ui/base/Object', 'sap/ui/base/EventProv id: oTitle.getId(), text: oTitle.getText(), oControl: oTitle, - sChangeEventId: "_change" + sChangeEventId: "_change", + sPropertyName: "text" }; } } @@ -157,7 +158,8 @@ sap.ui.define(['jquery.sap.global', 'sap/ui/base/Object', 'sap/ui/base/EventProv id: oHeaderTitle.getId(), text: oHeaderTitle.getObjectTitle(), oControl: oHeaderTitle, - sChangeEventId: "_titleChange" + sChangeEventId: "_titleChange", + sPropertyName: "objectTitle" }; } } @@ -174,7 +176,8 @@ sap.ui.define(['jquery.sap.global', 'sap/ui/base/Object', 'sap/ui/base/EventProv return { id: oBackButton.getId(), oControl: oBackButton, - sChangeEventId: "_change" + sChangeEventId: "_change", + sPropertyName: "visible" }; } } @@ -693,6 +696,9 @@ sap.ui.define(['jquery.sap.global', 'sap/ui/base/Object', 'sap/ui/base/EventProv var fnChangeListener = function (oEvent) { var oTitleInfo = aTitleInfoCache[sViewId]; + if (oEvent.getParameter("name") !== oTitleInfo.sPropertyName) { + return; // different property changed + } oTitleInfo.text = oEvent.getParameter("newValue"); this._fireViewChange(sViewId, oAdaptOptions); }.bind(this); @@ -709,7 +715,9 @@ sap.ui.define(['jquery.sap.global', 'sap/ui/base/Object', 'sap/ui/base/EventProv if (oControlInfo && oControlInfo.oControl && oControlInfo.sChangeEventId && !oInfoToMerge.aChangeListeners[oControlInfo.id]) { var fnChangeListener = function (oEvent) { - + if (oEvent.getParameter("name") !== oControlInfo.sPropertyName) { + return; // different property changed + } bVisible = oEvent.getParameter("newValue"); //actualize the value if (!bVisible) { jQuery.each(aControlInfoCache, function(iIndex, oCachedControlInfo) { diff --git a/src/sap.m/test/sap/m/qunit/Fiori20Adapter.qunit.html b/src/sap.m/test/sap/m/qunit/Fiori20Adapter.qunit.html index 5353cf403ebc..74f976f133ad 100644 --- a/src/sap.m/test/sap/m/qunit/Fiori20Adapter.qunit.html +++ b/src/sap.m/test/sap/m/qunit/Fiori20Adapter.qunit.html @@ -495,6 +495,55 @@ Fiori20Adapter.detachViewChange(oSpy); }); + QUnit.test("Button visibility is post adapted", function(assert) { + var oAdaptOptions = {bHideBackButton: true}, + oBackButton = new sap.m.Button("newBackButton", {type: "Back", visible: false}), + oChangedBackButton, + fnViewListener = function(oEvent) { + oChangedBackButton = oEvent.getParameter("oBackButton"); + }, + oSpy = sinon.spy(fnViewListener); + + this.oPage.setCustomHeader(new sap.m.Bar({ + contentLeft: [oBackButton] + })); + Fiori20Adapter.traverse(this.oApp, oAdaptOptions); + Fiori20Adapter.attachViewChange(oSpy); + + oBackButton.setVisible(true); + + // Assert + assert.strictEqual(oSpy.callCount, 1, "change is fired"); + assert.strictEqual(oChangedBackButton.getVisible(), true, "correct change is fired"); + + // cleanup + Fiori20Adapter.detachViewChange(oSpy); + }); + + QUnit.test("Unrelated button properties are skipped in post adaptation", function(assert) { + var oAdaptOptions = {bHideBackButton: true}, + oBackButton = new sap.m.Button("newBackButton", {type: "Back", visible: false}), + oChangedBackButton, + fnViewListener = function(oEvent) { + oChangedBackButton = oEvent.getParameter("oBackButton"); + }, + oSpy = sinon.spy(fnViewListener); + + this.oPage.setCustomHeader(new sap.m.Bar({ + contentLeft: [oBackButton] + })); + Fiori20Adapter.traverse(this.oApp, oAdaptOptions); + Fiori20Adapter.attachViewChange(oSpy); + + // Act: change unrelated property + oBackButton.setText("Back"); + + // Assert + assert.strictEqual(oSpy.callCount, 0, "no change is fired"); + + // cleanup + Fiori20Adapter.detachViewChange(oSpy); + }); QUnit.test("Header is adapted if page body content is inserted at a later time", function(assert) { var oAdaptOptions = {bMoveTitle: true, bHideBackButton: true, bCollapseHeader: true}, @@ -1610,6 +1659,25 @@ Fiori20Adapter.detachViewChange(fnTitleListener); }); + QUnit.test("Only text of title is adapted if changed at a later time", function(assert) { + var oAdaptOptions = {bMoveTitle: true, bHideBackButton: true, bCollapseHeader: true}, + oTitleInfo, + fnTitleListener = function(oEvent) { + oTitleInfo = oEvent.getParameter("oTitleInfo"); + }; + Fiori20Adapter.traverse(this.oPage, oAdaptOptions); + Fiori20Adapter.attachViewChange(fnTitleListener); + + // Act: change unrelated property + this.oPage.byId("title").setMaxLines(1); + + // Assert + assert.ok(!oTitleInfo, "no change is fired"); + + //cleanup + Fiori20Adapter.detachViewChange(fnTitleListener); + }); + QUnit.test("Header is adapted if changed at a later time", function(assert) { var oAdaptOptions = {bMoveTitle: true, bHideBackButton: true, bCollapseHeader: true}, oTitleInfo,