(function() { 'use strict'; function applyStyles(elem,obj) { for (var prop in obj) elem.style[prop]=obj[prop]; } var frame=document.createElement("iframe"); frame.src=document.currentScript.src.slice(0,document.currentScript.src.lastIndexOf('.js')+1)+'html'; applyStyles(frame,{ zIndex:2147483647, border:"none", position:"fixed", bottom:0, left:0, width:"100vw", height:"200px" }); document.body.appendChild(frame); function getDOM(startingFrom) { var stack=[startingFrom],result=[],i=0,parents=[],childIndices=[0]; while (stack.length) { if (stack[0]==="CLOSE") { parents.splice(-1,1); childIndices.splice(-1,1); } else if (stack[0].nodeType===Node.DOCUMENT_NODE) { if (stack[0].childNodes) for (var i=0;i'; nodeData.path+=nodeData.tagName+`:nth-child(${childIndices[childIndices.length-1]})`; for (var attr of stack[0].attributes) nodeData.attributes[attr.name]=attr.value; if (parents.length) result[nodeData.parent].children.push(result.length); break; case Node.TEXT_NODE: case Node.COMMENT_NODE: nodeData.type=stack[0].nodeType===Node.TEXT_NODE?'text':'comment'; nodeData.text=stack[0].data; if (parents.length) result[nodeData.parent].children.push(result.length); break; case Node.DOCUMENT_TYPE_NODE: nodeData.type='doctype'; nodeData.text=stack[0].name; break; } if (stack[0].childNodes) { for (var i=0;i{ frame.contentWindow.postMessage(getDOM(document),"*"); }; function whenIreceive(e) { if (e.data.type) switch (e.data.type) { case "COMPUTED STYLES": var elem=document.querySelector(e.data.path),styles={},computed=window.getComputedStyle(elem); if (e.data.set) { elem.style[e.data.set.prop]=e.data.set.val; } for (var property of computed) styles[property]=computed[property]; frame.contentWindow.postMessage({ type:"RE: COMPUTED STYLES", id:e.data.id, styles:styles },"*"); break; } else { switch (e.data) { case "RESIZE": frame.style.pointerEvents='none'; function resizeFrame(e) { if (e.clientY>0) frame.style.height=(window.innerHeight-e.clientY)+'px'; else frame.style.height=window.innerHeight+'px'; e.preventDefault(); e.stopPropagation(); return false; } function stop(e) { frame.style.pointerEvents='all'; document.removeEventListener("mousemove",resizeFrame,false); document.removeEventListener("mouseup",stop,false); e.preventDefault(); e.stopPropagation(); return false; } document.addEventListener("mousemove",resizeFrame,false); document.addEventListener("mouseup",stop,false); break; case "QUIT": document.body.removeChild(frame); frame=null; window.removeEventListener("message",whenIreceive,false); break; } } } window.addEventListener("message",whenIreceive,false); }());