UNPKG

siesta-lite

Version:

Stress-free JavaScript unit testing and functional testing tool, works in NodeJS and browsers

351 lines (264 loc) 13.5 kB
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>The source code</title> <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" /> <script type="text/javascript" src="../resources/prettify/prettify.js"></script> <style type="text/css"> .highlight { display: block; background-color: #ddd; } </style> <script type="text/javascript"> function highlight() { document.getElementById(location.hash.replace(/#/, "")).className = "highlight"; } </script> </head> <body onload="prettyPrint(); highlight();"> <pre class="prettyprint lang-js">/* Siesta 5.6.1 Copyright(c) 2009-2022 Bryntum AB https://bryntum.com/contact https://bryntum.com/products/siesta/license */ Ext.define(&#39;Siesta.Project.Browser.UI.ComponentInspector&#39;, { extend : &#39;Ext.util.Observable&#39;, inspectedComponent : null, inspectedComponentXType : null, boxIndicatorEl : null, active : false, window : null, trackMouse : true, showSelectorText : true, bufferTime : 30, injectIntoTestFrame : false, getIndicatorEl : function () { return this.boxIndicatorEl; }, getExt : function () { return this.window.Ext; }, start : function (window, containerEl) { window = window || this.window; if (!window) throw &#39;Must provide a window context for the inspector&#39;; this.window = window; var _Ext = this.getExt(); var me = this; var wrap = this.injectIntoTestFrame ? window.document.body : (containerEl || window.document.body); var boxSizingStyle = &#39;box-sizing: border-box;-moz-box-sizing: border-box;-ms-box-sizing: border-box;-webkit-box-sizing: border-box;&#39;; me.boxIndicatorEl = me.boxIndicatorEl || Ext.fly(wrap).createChild({ cls : &#39;target-inspector-box&#39;, style : &#39;position : absolute;left:0;top:0;pointer-events : none;z-index : 100001; border : 2px solid red;transition-property : transform,border-color;transition-duration : 0.3s;&#39;, children : [ { tag : &#39;div&#39;, style : &#39;border:1px solid;border-color:inherit;width : 13px; height : 13px;position : absolute;margin-top : -8px;margin-left : -8px;border-radius:19px;transition-property : transform;transition-duration : 0.3s;&#39; + boxSizingStyle, cls : &#39;target-inspector-coordinate&#39;, html : &#39;&lt;div style=&quot;border-left: 1px solid;border-color:inherit;position: absolute;top: -3px;left: 5px;height: 6px;&#39; + boxSizingStyle +&#39;&quot;&gt;&lt;/div&gt;&#39; + &#39;&lt;div style=&quot;border-left: 1px solid;border-color:inherit;position: absolute;bottom: -3px;left: 5px;height: 6px;&#39; + boxSizingStyle +&#39;&quot;&gt;&lt;/div&gt;&#39; + &#39;&lt;div style=&quot;border-top: 1px solid;border-color:inherit;position: absolute;top: 5px;left: -3px;width: 6px;&#39; + boxSizingStyle +&#39;&quot;&gt;&lt;/div&gt;&#39; + &#39;&lt;div style=&quot;border-top: 1px solid;border-color:inherit;position: absolute;top: 5px;right: -3px;width: 6px;&#39; + boxSizingStyle +&#39;&quot;&gt;&lt;/div&gt;&#39; } ].concat(this.showSelectorText ? { tag : &#39;a&#39;, cls : &#39;target-inspector-label&#39;, target : &#39;_blank&#39; } : []) }); if (this.trackMouse &amp;&amp; _Ext &amp;&amp; _Ext.getBody) { this.toggleMouseMoveListener(true); _Ext.getBody().on(&#39;click&#39;, this.onInspectionClick, { me : this }); } this.fireEvent(&#39;start&#39;, this); this.active = true; }, stop : function (suppressEvent) { if (!this.active) return; this.active = false; var _Ext = this.getExt(); Ext.destroy(this.boxIndicatorEl); this.boxIndicatorEl = null; if (!suppressEvent) { this.fireEvent(&#39;stop&#39;, this); } if (_Ext &amp;&amp; _Ext.getBody) { this.toggleMouseMoveListener(false); _Ext.getBody().un(&#39;click&#39;, this.onInspectionClick, { me : this }); } this.inspectedComponent = this.inspectedComponentXType = null; }, // Listen for mousemove in the frame and any direct iframe children too toggleMouseMoveListener : function (enabled) { var _Ext = this.getExt(); if (!_Ext) return; var frames = _Ext.getBody().select(&#39;iframe&#39;); var fn = enabled ? &#39;on&#39; : &#39;un&#39;; // Avoid using &quot;this&quot; directly due to Touch incompatibilities with Ext _Ext.getBody()[fn](&#39;mousemove&#39;, this.onMouseMove, { me : this }, { buffer : this.bufferTime }); for (var i = 0; i &lt; frames.getCount(); i++) { var innerExt = frames.item(i).dom.contentWindow.Ext; // Avoid using &quot;this&quot; directly due to Touch incompatibilities with Ext innerExt &amp;&amp; innerExt.getBody &amp;&amp; innerExt.getBody()[fn](&#39;mousemove&#39;, this.onMouseMove, { me : this }, { buffer : this.bufferTime }); } }, onInspectionClick : function (e, t) { if (!this.boxIndicatorEl) return; // Avoid using &quot;this&quot; directly due to Touch incompatibilities with Ext var me = this.me; me.toggleMouseMoveListener(false); // If user clicks on a non-component, or clicking outside currently selected component - we abort if (!me.inspectedComponent || me.findComponentByTarget(t) !== me.inspectedComponent) { me.stop(); } else { me.fireEvent(&#39;targetselected&#39;, me, me.inspectedComponent, me.inspectedComponentXType); } }, onMouseMove : function (e, t) { //Have to avoid using &quot;this&quot; directly due to Touch incompatibilities with Ext var me = this.me; if (!me.boxIndicatorEl) return; var cmp = me.findComponentByTarget(t); if (cmp) { if (cmp === me.inspectedComponent) return; var xtype = me.resolveComponentXtype(cmp); me.inspectedComponent = cmp; me.inspectedComponentXType = xtype; me.highlightTarget(cmp.el.dom); me.updateHighlightContent(cmp, xtype); me.fireEvent(&#39;targethover&#39;, me, me.inspectedComponent, me.inspectedComponentXType); } }, resolveComponentXtype : function (cmp) { var xtype = (cmp.getXType &amp;&amp; cmp.getXType()) || cmp.xtype; // If the found component doesn&#39;t have an own xtype, look up the superclass chain to find one if (!xtype) { var cls = cmp; for (var i = 0; i &lt; 10 &amp;&amp; !xtype; i++) { cls = cmp.superclass; xtype = cls.xtype; } } return xtype; }, updateHighlightContent : function (cmp, xtype) { var html; var link = { tag : &#39;a&#39;, cls : &#39;target-inspector-label&#39;, href : &#39;#&#39; }; if (typeof cmp === &#39;string&#39;) { html = cmp; } else if (Ext.ClassManager) { // If recorder is visible, let&#39;s add some targeting suggestions var recorderPanel = Ext.ComponentQuery.query(&#39;recorderpanel&#39;)[0]; var targetWindow = cmp.el.dom.ownerDocument.defaultView; var pageExtHasCQ = targetWindow &amp;&amp; targetWindow.Ext &amp;&amp; targetWindow.Ext.ComponentQuery; if (recorderPanel &amp;&amp; recorderPanel.isVisible()) { var cq; // Make sure this is an Ext JS page and the recorder used is the Ext JS recorder (not the generic one) if (pageExtHasCQ &amp;&amp; recorderPanel.recorder.extractor.findComponentQueryFor) { cq = recorderPanel.recorder.extractor.findComponentQueryFor(cmp); cq = (cq &amp;&amp; cq.query) || xtype; } html = &#39;&gt;&gt;&#39; + (cq || xtype); } else { var clsName = this.findExtAncestorClassName(cmp); if (clsName) { var docsPath = Siesta.Resource(&#39;Siesta.Project.Browser.UI.DomContainer&#39;, &#39;docsUrlText&#39;); var framework; if (Ext.versions.touch) { framework = &#39;touch&#39;; } else { framework = &#39;extjs&#39;; } link.target = &#39;_blank&#39;; link.href = Ext.String.format(docsPath, framework, clsName); link.title = Siesta.Resource(&#39;Siesta.Project.Browser.UI.DomContainer&#39;, &#39;viewDocsText&#39;) + clsName; } html = xtype; } } if (html) { link.html = html; var linkEl = this.boxIndicatorEl.down(&#39;.target-inspector-label&#39;, true); linkEl.href = link.href; linkEl.title = link.title; linkEl.innerHTML = html; } }, highlightTarget : function (node, content, point) { var boxStyle = this.boxIndicatorEl.dom.style; if (!this.active) { this.start(); } if (node) { var offsets = this.getOffsets(node); var left = (Ext.fly(node).getX() - 2 + offsets[0]); var top = (Ext.fly(node).getY() - 2 + offsets[1]); var width = ((Ext.fly(node).getWidth() || (parseInt(node.style.width.substring(0, node.style.width.length - 2), 10))) + 2); var height = ((Ext.fly(node).getHeight() || (parseInt(node.style.height.substring(0, node.style.height.length - 2), 10))) + 2); if (this.injectIntoTestFrame) { left += this.window.document.body.scrollLeft; top += this.window.document.body.scrollTop; } var translateStyle = bowser.opera ? (&#39;translate(&#39; + left + &#39;px,&#39; + top + &#39;px)&#39;) : (&#39;translate3d(&#39; + left + &#39;px,&#39; + top + &#39;px, 0)&#39;); // Regular getWidth/getHeight doesn&#39;t work if another iframe is on the page boxStyle.setProperty(&#39;transform&#39;, translateStyle) boxStyle.width = width + &#39;px&#39;; boxStyle.height = height + &#39;px&#39;; boxStyle[&#39;border-color&#39;] = &#39;red&#39;; if (this.showSelectorText &amp;&amp; content) { this.updateHighlightContent(content); } } else { boxStyle[&#39;border-color&#39;] = &#39;#ccc&#39;; } var crosshair = this.boxIndicatorEl.down(&#39;.target-inspector-coordinate&#39;, true); if (point) { translateStyle = bowser.opera ? (&#39;translate(&#39; + point[0] + &#39;px,&#39; + point[1] + &#39;px)&#39;) : (&#39;translate3d(&#39; + point[0] + &#39;px, &#39; + point[1] + &#39;px, 0)&#39;); crosshair.style.setProperty(&#39;display&#39;, &#39;block&#39;); crosshair.style.setProperty(&#39;transform&#39;, translateStyle) } else { crosshair.style.setProperty(&#39;display&#39;, &#39;none&#39;); } }, findComponentByTarget : function (target) { var Ext = this.getExt(); var testDoc = this.window.document; // Handle potentially having another Ext copy loaded in another frame if (target.ownerDocument !== testDoc) { var innerFrame = (target.ownerDocument.parentWindow || target.ownerDocument.defaultView).frameElement; Ext = innerFrame.contentWindow.Ext; } var cmp while (!cmp &amp;&amp; target &amp;&amp; target.nodeName !== &#39;BODY&#39;) { cmp = Ext.getCmp(target.id); target = target.parentNode; } return cmp; }, getOffsets : function (node) { var targetDoc = this.window.document; var offsets = [0, 0] if (node.ownerDocument !== targetDoc) { var innerFrame = (node.ownerDocument.parentWindow || node.ownerDocument.defaultView).frameElement; offsets = Ext.fly(innerFrame).getXY(); offsets[0] -= node.ownerDocument.body.scrollLeft; offsets[1] -= node.ownerDocument.body.scrollTop; } return offsets; }, findExtAncestorClassName : function (cmp) { while (cmp) { var name = Ext.ClassManager.getName(cmp); if (name.match(/^Ext./)) return name; cmp = cmp.superclass; } return &#39;&#39;; } });</pre> </body> </html>