var showAnalysis = function() { //console.log("showAnalysis test") var isAnalysis = document.getElementById("analysis").style.display; var isResize = document.getElementById("resize").style.display; //console.log(isAnalysis); var top = document.getElementById("contractCode"); var down = document.getElementById("analysis"); var box = document.getElementById("box"); if (isAnalysis == "none") { document.getElementById("analysis").style.display = "block"; document.getElementById("resize").style.display = "block"; var moveLen=300; top.style.height = moveLen + "px"; $("#contractCode .CodeMirror").css("height",moveLen + "px"); down.style.height = (box.clientHeight - moveLen - 10) + "px"; staticAnalysis(); } else { document.getElementById("analysis").style.display = "none"; document.getElementById("resize").style.display = "none"; top.style.height="100%"; $("#contractCode .CodeMirror").css("height","100%"); } //document.getElementById("analysis").style.display = ""; }; var staticAnalysis = function() { var req = {}; req.action = "getControlFlowByFileName"; req.isPrivate = global.currentFile.isPrivate; var path = global.currentFile.path; if (path.startsWith("/")) path = path.substr(1); path = path.replace(/\/.*$/g,""); req.projectName = path; array = $("#form").serializeArray(); req.formData=JSON.stringify(array); global.wssocket.send(JSON.stringify(req)); }; window.onload = function(){ var resize = document.getElementById("resize"); var top = document.getElementById("contractCode"); var down = document.getElementById("analysis"); var box = document.getElementById("box"); resize.onmousedown = function(e){ var startY = e.clientY; resize.top = resize.offsetTop; document.onmousemove = function(e){ var endY = e.clientY; var moveLen = resize.top + (endY - startY); var maxT = box.clientHeight - resize.offsetHeight; if(moveLen<150) moveLen = 150; if(moveLen>maxT-150) moveLen = maxT-150; resize.style.top = moveLen; top.style.height = moveLen + "px"; $("#contractCode .CodeMirror").css("height",top.style.height); down.style.height = (box.clientHeight - moveLen - 5) + "px"; } document.onmouseup = function(evt){ document.onmousemove = null; document.onmouseup = null; resize.releaseCapture && resize.releaseCapture(); } resize.setCapture && resize.setCapture(); return false; } } var onGetControlFlow = function(obj) { var data = {}; data.name = data.path = "/tmp/result_" + (new Date().getTime() % 1000) + ".txt"; obj = JSON.parse(obj.result); global.analysisResult = obj; $("#analysisFunction").html(""); for (var key in obj){ $("#analysisFunction").append(""); }; data.val = JSON.stringify(obj, null, 4); mainVue.openedFiles.push(data); setTimeout(function() { clickTab(data.path); }, 100); } var showAnalysisResult = function(){ var functionName = $("#analysisFunction")[0].value; if (global.analysisResult[functionName]!=undefined){ drawMethod(global.analysisResult[functionName]); } }; var drawMethod = function(method) { var states = {}; for (var i = 0; i < method.blocks.length; i++) { var block = method.blocks[i]; var desp = {}; desp.description = "字节码指令:"+"
"+ stmt2Str(block.stmts); desp.description += "

" + "后续分析结果:" +"
" + block.result; desp.description += "

" + "源码:"+"
"+ block.original; desp.description += "

" + "数据依赖:"+"
"+ block.blockDep; if (block.type != "Continuous") desp.fill = "#f77"; states[block.name] = desp; } drawCFGraph(states, method.edges); var retDesp = "数据值传递依赖:"; //retDesp += method.ret; var tmp1 = method.ret; retDesp += tmp1.split(":")[tmp1.split(',').length]; retDesp += "\n"; retDesp += "数据控制依赖:"; var tmp2= method.blocks[method.blocks.length-1].blockDep; //retDesp += tmp.split(":")[tmp.split(',').length]; retDesp += tmp2; retDesp += "\n"; retDesp += method.finalRet; document.getElementById("ret").value = retDesp; }; var stmt2Str = function(l) { var str = ""; for (var i = 0; i < l.length; i++) str += "" + l[i].replace(/\//g, ".") + "" + "
"; return str; } var drawCFGraph = function(states, edges) { var g = new dagreD3.graphlib.Graph().setGraph({}); // Add states to the graph, set labels, and style Object.keys(states).forEach(function(state) { var value = states[state]; value.label = state; value.rx = value.ry = 5; value.style = "fill:white;stroke:"+primaryColor; g.setNode(state, value); }); for (var i = 0; i < edges.length; i++){ edges[i].label.style= "fill:#fff;stroke:"+primaryColor+";stroke-width:2px"; if (edges[i].label.label=='e') edges[i].label.label = ""; g.setEdge(edges[i].from, edges[i].to,edges[i].label); } // Set up the edges // Create the renderer var render = new dagreD3.render(); $("svg").html(""); // Set up an SVG group so that we can translate the final graph. var svg = d3.select("svg"), inner = svg.append("g"); // Set up zoom support var zoom = d3.zoom().on("zoom", function() { inner.attr("transform", d3.event.transform); }); svg.call(zoom); // Simple function to style the tooltip for the given node. var styleTooltip = function(name, description) { return "

" + name + "

" + description + "

"; }; // Run the renderer. This is what draws the final graph. render(inner, g); inner.selectAll("g.node").attr("title", function(v) { return styleTooltip(v, g.node(v).description) }).each(function(v) { $(this).tipsy({ gravity : "w", opacity : 1, html : true }); }); // Center the graph var initialScale = 0.75; var width =$("#svgCanvas").css("width").replace("px","")/1; svg.call(zoom.transform, d3.zoomIdentity.translate( (width - g.graph().width * initialScale) / 2, 20) .scale(initialScale)); svg.attr('height', g.graph().height * initialScale + 40); } var downloadAnalysis = function() { var pdf = new jsPDF('p', 'pt', 'a4'); //page1 /* pdf.addFont('NotoSansCJKtc-Regular.ttf', 'NotoSansCJKtc', 'normal'); pdf.setFont('NotoSansCJKtc'); */ pdf.text('Analysis Report', 10, 20); var res = document.getElementById("ret").value; pdf.text(res, 10, 20); //page2 pdf.addPage(); //method1:add text //get svg var svg = $("#svgCanvas")[0].outerHTML; if (svg) svg = svg.replace(/\r?\n|\r/g, '').trim(); //change svg to canvas var canvas = document.createElement('canvas'); ctx = canvas.getContext('2d'); var v = canvg.Canvg.fromString(ctx, svg); //create image var imgData = canvas.toDataURL('image/png'); pdf.addImage(imgData, 'PNG', 0, 0, 595.28, 841.89); /* //method2:add text to image var canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); var svg = document.getElementById('svg-container').innerHTML; var v = canvg.Canvg.fromString(ctx, svg); v.start(); ctx.font="20px Georgia"; ctx.fillText(res, 10, 20); var imgData = canvas.toDataURL('image/png'); pdf.addImage(imgData, 'PNG', 0, 0, 595.28, 841.89); */ pdf.save('report.pdf'); }