@openui5/sap.ui.core
Version:
OpenUI5 Core Library sap.ui.core
331 lines (295 loc) • 11.5 kB
JavaScript
/*!
* OpenUI5
* (c) Copyright 2009-2023 SAP SE or an SAP affiliate company.
* Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
*/
// A core plugin that bundles debug features and connects with an embedding testsuite
sap.ui.define('sap/ui/debug/DebugEnv', ['sap/ui/base/Interface', './ControlTree', './LogViewer', './PropertyList', "sap/base/Log", "sap/ui/thirdparty/jquery", "sap/ui/core/Configuration"],
function(Interface, ControlTree, LogViewer, PropertyList, Log, jQuery, Configuration) {
"use strict";
/**
* Creates an instance of the class <code>sap.ui.debug.DebugEnv</code>
*
* @class Central Class for the Debug Environment
*
* @author Martin Schaus, Frank Weigel
* @version 1.111.5
* @private
* @alias sap.ui.debug.DebugEnv
*/
var DebugEnv = function() {
};
/**
* Will be invoked by <code>sap.ui.core.Core</code> to notify the plugin to start.
*
* @param {sap.ui.core.Core} oCore reference to the Core
* @param {boolean} [bOnInit] whether the hook is called during core initialization
* @public
*/
DebugEnv.prototype.startPlugin = function(oCore, bOnInit) {
this.oCore = oCore;
this.oWindow = window;
/**
* Whether the debugenv should run embedded in application page (true) or in testsuite (false).
* @private
*/
try {
this.bRunsEmbedded = typeof window.top.testfwk === "undefined"; // window || !top.frames["sap-ui-TraceWindow"];
Log.info("Starting DebugEnv plugin (" + (this.bRunsEmbedded ? "embedded" : "testsuite") + ")");
// initialize only if running in testsuite or when debug views are not disabled via URL parameter
if (!this.bRunsEmbedded || oCore.getConfiguration().getInspect()) {
this.init(bOnInit);
}
if (!this.bRunsEmbedded || oCore.getConfiguration().getTrace()) {
this.initLogger(Log, bOnInit);
}
} catch (oException) {
Log.warning("DebugEnv plugin can not be started outside the Testsuite.");
}
};
/**
* Will be invoked by <code>sap.ui.core.Core</code> to notify the plugin to start
* @public
*/
DebugEnv.prototype.stopPlugin = function() {
Log.info("Stopping DebugEnv plugin.");
this.oCore = null;
};
/**
* Initializes the ControlTreeView and PropertyListView of the <code>sap.ui.debug.DebugEnv</code>
* @private
*/
DebugEnv.prototype.init = function(bOnInit) {
this.oControlTreeWindow = this.bRunsEmbedded ? this.oWindow : (top.document.getElementById("sap-ui-ControlTreeWindow") || top.frames["sap-ui-ControlTreeWindow"] || top);
this.oPropertyListWindow = this.bRunsEmbedded ? this.oWindow : (top.document.getElementById("sap-ui-PropertyListWindow") || top.frames["sap-ui-PropertyListWindow"] || top);
var bRtl = Configuration.getRTL();
/* TODO enable switch to testsuite
if ( this.bRunsEmbedded ) {
var div = this.oWindow.document.createElement("DIV");
div.style.position = "absolute";
div.style.right = '202px';
div.style.top = '1px';
div.style.width = '32px';
div.style.height = '32px';
div.style.border = '1px solid black';
div.style.backgroundColor = 'blue';
div.style.backgroundImage = "url(" + sap.ui.global.resourceRoot + "testsuite/images/full.png)";
div.style.zIndex = 5;
div.style.opacity = '0.2';
jQuery(div).on("click",function(evt) {
alert("click!");
});
/ *
jQuery(div).on("mouseover",function(evt) {
alert("click!");
});
jQuery(div).on("mouseout",function(evt) {
alert("click!");
}); * /
this.oWindow.document.body.appendChild(div);
}
*/
var oControlTreeRoot = (this.oControlTreeWindow.document || this.oControlTreeWindow).querySelector("#sap-ui-ControlTreeRoot"),
oPropertyWindowRoot = (this.oPropertyListWindow.document || this.oPropertyListWindow).querySelector("#sap-ui-PropertyWindowRoot");
if ( !oControlTreeRoot ) {
oControlTreeRoot = this.oControlTreeWindow.document.createElement("DIV");
oControlTreeRoot.setAttribute("id", "sap-ui-ControlTreeRoot");
oControlTreeRoot.setAttribute("tabindex", -1);
oControlTreeRoot.style.position = "absolute";
oControlTreeRoot.style.fontFamily = "Arial";
oControlTreeRoot.style.fontSize = "8pt";
oControlTreeRoot.style.backgroundColor = "white";
oControlTreeRoot.style.color = "black";
oControlTreeRoot.style.border = "1px solid gray";
oControlTreeRoot.style.overflow = "auto";
oControlTreeRoot.style.zIndex = "999999";
oControlTreeRoot.style.top = "1px";
if (bRtl) {
oControlTreeRoot.style.left = "1px";
} else {
oControlTreeRoot.style.right = "1px";
}
oControlTreeRoot.style.height = "49%";
oControlTreeRoot.style.width = "200px";
this.oControlTreeWindow.document.body.appendChild(oControlTreeRoot);
} else {
oControlTreeRoot.innerHTML = "";
}
this.oControlTreeRoot = oControlTreeRoot;
if ( !oPropertyWindowRoot ) {
oPropertyWindowRoot = this.oPropertyListWindow.document.createElement("DIV");
oPropertyWindowRoot.setAttribute("id", "sap-ui-PropertyWindowRoot");
oPropertyWindowRoot.setAttribute("tabindex", -1);
oPropertyWindowRoot.style.position = "absolute";
oPropertyWindowRoot.style.fontFamily = "Arial";
oPropertyWindowRoot.style.fontSize = "8pt";
oPropertyWindowRoot.style.backgroundColor = "white";
oPropertyWindowRoot.style.color = "black";
oPropertyWindowRoot.style.border = "1px solid gray";
oPropertyWindowRoot.style.overflow = "auto";
oPropertyWindowRoot.style.zIndex = "99999";
oPropertyWindowRoot.style.width = "196px";
oPropertyWindowRoot.style.height = "49%";
if (bRtl) {
oPropertyWindowRoot.style.left = "1px";
} else {
oPropertyWindowRoot.style.right = "1px";
}
oPropertyWindowRoot.style.bottom = "1px";
this.oPropertyListWindow.document.body.appendChild(oPropertyWindowRoot);
} else {
oPropertyWindowRoot.innerHTML = "";
}
this.oPropertyWindowRoot = oPropertyWindowRoot;
this.oControlTree = new ControlTree(this.oCore, this.oWindow, oControlTreeRoot, this.bRunsEmbedded);
this.oPropertyList = new PropertyList(this.oCore, this.oWindow, oPropertyWindowRoot);
this.oControlTree.attachEvent(ControlTree.M_EVENTS.SELECT, this.oPropertyList.update,
this.oPropertyList);
if ( !bOnInit ) {
this.oControlTree.renderDelayed();
}
window.addEventListener("unload", function(oEvent) {
this.oControlTree.exit();
this.oPropertyList.exit();
}.bind(this));
};
/**
* Initializes the LogViewer of the <code>sap.ui.debug.DebugEnv</code>
* @private
*/
DebugEnv.prototype.initLogger = function(oLogger, bOnInit) {
this.oLogger = oLogger;
this.oLogger.setLogEntriesLimit(Infinity);
if ( !this.bRunsEmbedded ) {
// attach test suite log viewer to our Log
this.oTraceWindow = top.document.getElementById("sap-ui-TraceWindow");
if ( this.oTraceWindow ) {
this.oTraceViewer = top.oLogViewer = new LogViewer(this.oTraceWindow, 'sap-ui-TraceWindowRoot');
} else {
this.oTraceWindow = top.frames["sap-ui-TraceWindow"];
this.oTraceViewer = this.oTraceWindow.oLogViewer = new LogViewer(this.oTraceWindow, 'sap-ui-TraceWindowRoot');
}
this.oTraceViewer.sLogEntryClassPrefix = "lvl"; // enforce use of CSS instead of DOM styles
this.oTraceViewer.lock();
} else {
// create an embedded log viewer
this.oTraceWindow = this.oWindow;
this.oTraceViewer = new LogViewer(this.oTraceWindow, 'sap-ui-TraceWindowRoot');
}
this.oLogger.addLogListener(this.oTraceViewer);
// When debug.js is injected (testsuite), it is not initialized during Core.init() but later.
// In Chrome the startPlugin happens after rendering, therefore the first 'UIUpdated' is missed.
// To compensate this, we register for both, the UIUpdated and for a timer (if we are not called during Core.init)
// Whatever happens first.
// TODO should be part of core
this.oCore.attachUIUpdated(this.enableLogViewer, this);
if ( !bOnInit ) {
var that = this;
this.oTimer = setTimeout(function() {
that.enableLogViewer();
}, 0);
}
};
DebugEnv.prototype.enableLogViewer = function() {
// clear timeout (necessary in case we have been notified via attachUIUpdated)
if ( this.oTimer ) {
clearTimeout(this.oTimer);
this.oTimer = undefined;
}
// clear listener (necessary to avoid multiple calls and in case we are called via timer)
this.oCore.detachUIUpdated(this.enableLogViewer, this);
// real action: enable the LogViewer
if ( this.oTraceViewer) {
this.oTraceViewer.unlock();
}
};
/**
* Whether the DebugEnv is running embedded in app page or not (which then means running in a test suite)
*/
DebugEnv.prototype.isRunningEmbedded = function() {
return this.bRunsEmbedded;
};
/**
* Whether the ControlTree is visible
*/
DebugEnv.prototype.isControlTreeShown = function() {
return jQuery(this.oControlTreeRoot).css("visibility") === "visible" || jQuery(this.oControlTreeRoot).css("visibility") === "inherit";
};
/**
* Will be called to show the ControlTree
*/
DebugEnv.prototype.showControlTree = function() {
if (!this.oControlTreeRoot) {
this.init(false);
}
jQuery(this.oControlTreeRoot).css("visibility", "visible");
};
/**
* Will be called to hide the ControlTree
*/
DebugEnv.prototype.hideControlTree = function() {
jQuery(this.oControlTreeRoot).css("visibility", "hidden");
};
/**
* Whether the LogViewer is shown
*/
DebugEnv.prototype.isTraceWindowShown = function() {
var oLogViewer = this.oTraceWindow && this.oTraceWindow.document.getElementById('sap-ui-TraceWindowRoot');
return oLogViewer && (jQuery(oLogViewer).css("visibility") === "visible" || jQuery(oLogViewer).css("visibility") === "inherit");
};
/**
* Will be called to show the TraceWindow
*/
DebugEnv.prototype.showTraceWindow = function() {
if ( !this.oTraceWindow ) {
this.initLogger(Log, false);
}
var oLogViewer = this.oTraceWindow && this.oTraceWindow.document.getElementById('sap-ui-TraceWindowRoot');
if ( oLogViewer ) {
jQuery(oLogViewer).css("visibility", "visible");
}
};
/**
* Will be called to hide the TraceWindow
*/
DebugEnv.prototype.hideTraceWindow = function() {
var oLogViewer = this.oTraceWindow && this.oTraceWindow.document.getElementById('sap-ui-TraceWindowRoot');
if ( oLogViewer ) {
jQuery(oLogViewer).css("visibility", "hidden");
}
};
/**
* Will be called to show the PropertyList
*/
DebugEnv.prototype.isPropertyListShown = function() {
return jQuery(this.oPropertyWindowRoot).css("visibility") === "visible" || jQuery(this.oPropertyWindowRoot).css("visibility") === "inherit";
};
/**
* Will be called to show the PropertyList
*/
DebugEnv.prototype.showPropertyList = function() {
if (!this.oPropertyWindowRoot) {
this.init(false);
}
jQuery(this.oPropertyWindowRoot).css("visibility", "visible");
};
/**
* Will be called to hide the PropertyList
*/
DebugEnv.prototype.hidePropertyList = function() {
jQuery(this.oPropertyWindowRoot).css("visibility", "hidden");
};
/**
* Create the <code>sap.ui.debug.DebugEnv</code> plugin and register
* it within the <code>sap.ui.core.Core</code>.
*/
(function(){
var oThis = new DebugEnv();
sap.ui.getCore().registerPlugin(oThis);
var oInterface = new Interface(oThis, ["isRunningEmbedded", "isControlTreeShown", "showControlTree", "hideControlTree", "isTraceWindowShown", "showTraceWindow", "hideTraceWindow", "isPropertyListShown", "showPropertyList", "hidePropertyList"]);
DebugEnv.getInstance = function() {
return oInterface;
};
}());
return DebugEnv;
}, /* bExport= */ true);