(window["webpackJsonpGUI"] = window["webpackJsonpGUI"] || []).push([["addon-entry-editor-stepping"],{ /***/ "./src/addons/addons/editor-stepping/_runtime_entry.js": /*!*************************************************************!*\ !*** ./src/addons/addons/editor-stepping/_runtime_entry.js ***! \*************************************************************/ /*! exports provided: resources */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resources", function() { return resources; }); /* harmony import */ var _userscript_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./userscript.js */ "./src/addons/addons/editor-stepping/userscript.js"); /* generated by pull.js */ const resources = { "userscript.js": _userscript_js__WEBPACK_IMPORTED_MODULE_0__["default"] }; /***/ }), /***/ "./src/addons/addons/editor-stepping/highlighter.js": /*!**********************************************************!*\ !*** ./src/addons/addons/editor-stepping/highlighter.js ***! \**********************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); const SVG_NS = "http://www.w3.org/2000/svg"; const containerSvg = document.createElementNS(SVG_NS, "svg"); // unfortunately we can't use display: none on this as that breaks filters containerSvg.style.position = "fixed"; containerSvg.style.top = "-999999px"; containerSvg.style.width = "0"; containerSvg.style.height = "0"; document.body.appendChild(containerSvg); let nextGlowerId = 0; const highlightsPerElement = new WeakMap(); const getHighlightersForElement = element => { if (!highlightsPerElement.get(element)) { highlightsPerElement.set(element, new Set()); } return highlightsPerElement.get(element); }; const updateHighlight = (element, highlighters) => { let result; for (const i of highlighters) { if (!result || i.priority > result.priority) { result = i; } } if (result) { element.style.filter = result.filter; } else { element.style.filter = ""; } }; const addHighlight = (element, highlighter) => { const highlighters = getHighlightersForElement(element); highlighters.add(highlighter); updateHighlight(element, highlighters); }; const removeHighlight = (element, highlighter) => { const highlighters = getHighlightersForElement(element); highlighters.delete(highlighter); updateHighlight(element, highlighters); }; class Highlighter { constructor(priority, color) { this.priority = priority; const id = "sa_glower_filter".concat(nextGlowerId++); this.filter = "url(\"#".concat(id, "\")"); this.previousElements = new Set(); const filterElement = document.createElementNS(SVG_NS, "filter"); filterElement.id = id; filterElement.setAttribute("width", "180%"); filterElement.setAttribute("height", "160%"); filterElement.setAttribute("x", "-40%"); filterElement.setAttribute("y", "-30%"); const filterBlur = document.createElementNS(SVG_NS, "feGaussianBlur"); filterBlur.setAttribute("in", "SourceGraphic"); filterBlur.setAttribute("stdDeviation", "4"); filterElement.appendChild(filterBlur); const filterTransfer = document.createElementNS(SVG_NS, "feComponentTransfer"); filterTransfer.setAttribute("result", "outBlur"); filterElement.appendChild(filterTransfer); const filterTransferTable = document.createElementNS(SVG_NS, "feFuncA"); filterTransferTable.setAttribute("type", "table"); filterTransferTable.setAttribute("tableValues", "0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"); filterTransfer.appendChild(filterTransferTable); const filterFlood = document.createElementNS(SVG_NS, "feFlood"); filterFlood.setAttribute("flood-opacity", "1"); filterFlood.setAttribute("result", "outColor"); filterElement.appendChild(filterFlood); this.filterFlood = filterFlood; const filterComposite = document.createElementNS(SVG_NS, "feComposite"); filterComposite.setAttribute("in", "outColor"); filterComposite.setAttribute("in2", "outBlur"); filterComposite.setAttribute("operator", "in"); filterComposite.setAttribute("result", "outGlow"); filterElement.appendChild(filterComposite); const filterFinalComposite = document.createElementNS(SVG_NS, "feComposite"); filterFinalComposite.setAttribute("in", "SourceGraphic"); filterFinalComposite.setAttribute("in2", "outGlow"); filterFinalComposite.setAttribute("operator", "over"); filterElement.appendChild(filterFinalComposite); containerSvg.appendChild(filterElement); this.setColor(color); } setColor(color) { this.filterFlood.setAttribute("flood-color", color); } setGlowingThreads(threads) { const elementsToHighlight = new Set(); const workspace = Blockly.getMainWorkspace(); if (workspace) { for (const thread of threads) { thread.stack.forEach(blockId => { const block = workspace.getBlockById(blockId); if (!block) { return; } const childblock = thread.stack.find(i => { let b = block; while (b.childBlocks_.length) { b = b.childBlocks_[b.childBlocks_.length - 1]; if (i === b.id) return true; } return false; }); if (!childblock && block.svgPath_) { const svgPath = block.svgPath_; elementsToHighlight.add(svgPath); } }); } } for (const element of this.previousElements) { if (!elementsToHighlight.has(element)) { removeHighlight(element, this); } } for (const element of elementsToHighlight) { if (!this.previousElements.has(element)) { addHighlight(element, this); } } this.previousElements = elementsToHighlight; } } /* harmony default export */ __webpack_exports__["default"] = (Highlighter); /***/ }), /***/ "./src/addons/addons/editor-stepping/userscript.js": /*!*********************************************************!*\ !*** ./src/addons/addons/editor-stepping/userscript.js ***! \*********************************************************/ /*! exports provided: default */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony import */ var _debugger_module_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../debugger/module.js */ "./src/addons/addons/debugger/module.js"); /* harmony import */ var _highlighter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./highlighter.js */ "./src/addons/addons/editor-stepping/highlighter.js"); /* harmony default export */ __webpack_exports__["default"] = (async function ({ addon, console }) { const vm = addon.tab.traps.vm; const highlighter = new _highlighter_js__WEBPACK_IMPORTED_MODULE_1__["default"](0, addon.settings.get("highlight-color")); addon.settings.addEventListener("change", () => { highlighter.setColor(addon.settings.get("highlight-color")); }); addon.self.addEventListener("disabled", () => { highlighter.setGlowingThreads([]); }); const oldStep = vm.runtime._step; vm.runtime._step = function (...args) { oldStep.call(this, ...args); if (!addon.self.disabled) { const runningThread = Object(_debugger_module_js__WEBPACK_IMPORTED_MODULE_0__["getRunningThread"])(); const threads = vm.runtime.threads.filter(thread => thread !== runningThread && !thread.target.blocks.forceNoGlow && !thread.isCompiled); highlighter.setGlowingThreads(threads); } }; }); /***/ }) }]); //# sourceMappingURL=addon-entry-editor-stepping.js.map