var network = null; function draw() { var utg_div = document.getElementById('utg_div'); var utg_details = document.getElementById('utg_details'); showOverall(); var options = { autoResize: true, height: '100%', width: '100%', locale: 'en', nodes: { shapeProperties: { useBorderWithImage: true }, borderWidth: 0, borderWidthSelected: 5, color: { border: '#FFFFFF', background: '#FFFFFF', highlight: { border: '#0000FF', background: '#0000FF', } }, font: { size: 12, color: '#000' } }, edges: { color: 'black', arrows: { to: { enabled: true, scaleFactor: 0.5 } }, font: { size: 12, color: '#000' } } }; // 预处理边:为包含GuiAgent事件的边添加黄色高亮 for (var i = 0; i < utg.edges.length; i++) { var edge = utg.edges[i]; // 检查该边是否包含GuiAgent事件 var hasAgentEvent = false; if (edge.events) { for (var j = 0; j < edge.events.length; j++) { if (edge.events[j].is_guiagent_event) { hasAgentEvent = true; break; } } } // 如果包含GuiAgent事件,设置黄色高亮 if (hasAgentEvent) { edge.color = { color: '#FFD700', highlight: '#FFA500' }; edge.width = 3; } } network = new vis.Network(utg_div, utg, options); network.on("click", function (params) { if (params.nodes.length > 0) { node = params.nodes[0]; if (network.isCluster(node)) { utg_details.innerHTML = getClusterDetails(node); } else { utg_details.innerHTML = getNodeDetails(node); } } else if (params.edges.length > 0) { edge = params.edges[0]; baseEdge = network.clustering.getBaseEdge(edge) if (baseEdge == null || baseEdge == edge) { utg_details.innerHTML = getEdgeDetails(edge); } else { utg_details.innerHTML = getEdgeDetails(baseEdge); } } }); } function showOverall() { var utg_details = document.getElementById('utg_details'); utg_details.innerHTML = getOverallResult(); } function getOverallResult() { var overallInfo = "
"; overallInfo += "\n" overallInfo += "\n"; overallInfo += "\n"; overallInfo += "\n"; overallInfo += "\n"; overallInfo += "\n"; overallInfo += "\n"; overallInfo += "\n"; overallInfo += "\n"; overallInfo += "\n"; overallInfo += "\n"; overallInfo += "\n"; overallInfo += "\n"; overallInfo += "\n"; overallInfo += "\n"; overallInfo += "\n"; activity_coverage = 100 * utg.num_reached_activities / utg.app_num_total_activities; overallInfo += "\n"; overallInfo += "

App information

Package" + utg.app_package + "
SHA-256" + utg.app_sha256 + "
Main activity" + utg.app_main_activity + "
# activities" + utg.app_num_total_activities + "

Device information

Device serial" + utg.device_serial + "
Model number" + utg.device_model_number + "
SDK version" + utg.device_sdk_version + "

DroidBot result

Test date" + utg.test_date + "
Time spent (s)" + utg.time_spent + "
# input events" + utg.num_input_events + "
# UTG states" + utg.num_nodes + "
# UTG edges" + utg.num_edges + "
Activity_coverage
" + utg.num_reached_activities + "/" + utg.app_num_total_activities + "
"; return overallInfo; } function getEdgeDetails(edgeId) { var selectedEdge = getEdge(edgeId); edgeInfo = "

Transition Details


\n"; fromState = getNode(selectedEdge.from); toState = getNode(selectedEdge.to); edgeInfo += "\n" edgeInfo += "
TO
\n" edgeInfo += "\n" edgeInfo += "\n" edgeInfo += "\n"; var i; edgeInfo += "\n" for (i = 0; i < selectedEdge.events.length; i++) { event = selectedEdge.events[i]; eventStr = event.event_str; var viewImg = ""; if (event.view_images != null) { var j; for (j = 0; j < event.view_images.length; j++) { viewImg += "\n" } } var domainsCount = event.new_domains_count || 0; var isAgent = event.is_guiagent_event ? "✓" : ""; edgeInfo += "" } edgeInfo += "

Events

idtypeviewevent_strnew_domainsagent
" + event.event_id + "" + event.event_type + "" + viewImg + "" + event.event_str + "" + domainsCount + "" + isAgent + "
\n" return edgeInfo; } function getNodeDetails(nodeId) { var selectedNode = getNode(nodeId); stateInfo = "

State Details


\n"; stateInfo += ""; stateInfo += "
" + selectedNode.title; // 显示新增域名信息 var domains = selectedNode.new_domains || []; if (domains.length > 0) { stateInfo += "

New Domains (" + domains.length + ")

"; stateInfo += ""; } stateInfo += "
"; return stateInfo; } function getClusterDetails(clusterId) { clusterInfo = "

Cluster Details


\n"; var nodeIds = network.getNodesInCluster(clusterId); for (var i = 0; i < nodeIds.length; i++) { var selectedNode = getNode(nodeIds[i]); clusterInfo += "
\n" clusterInfo += "" clusterInfo += "
" + selectedNode.title + "
"; clusterInfo += "

" } return clusterInfo; } function getEdge(edgeId) { var i, numEdges; numEdges = utg.edges.length; for (i = 0; i < numEdges; i++) { if (utg.edges[i].id == edgeId) { return utg.edges[i]; } } console.log("cannot find edge: " + edgeId); } function getNode(nodeId) { var i, numNodes; numNodes = utg.nodes.length; for (i = 0; i < numNodes; i++) { if (utg.nodes[i].id == nodeId) { return utg.nodes[i]; } } console.log("cannot find node: " + nodeId); } function showAbout() { var utg_details = document.getElementById('utg_details'); utg_details.innerHTML = getAboutInfo(); } function getAboutInfo() { var aboutInfo = "
"; aboutInfo += "

About

\n" aboutInfo += "

This report is generated using DroidBot.

\n"; aboutInfo += "

Please find copyright information in the project page.

"; return aboutInfo; } function searchUTG() { var searchKeyword = document.getElementById("utgSearchBar").value.toUpperCase(); if (searchKeyword == null || searchKeyword == "") { network.unselectAll() } else { var i, numNodes; nodes = utg.nodes; numNodes = nodes.length; selectedNodes = [] for (i = 0; i < numNodes; i++) { if (nodes[i].content.toUpperCase().indexOf(searchKeyword) > -1) { selectedNodes.push(nodes[i].id) } } network.unselectAll() // console.log("Selecting: " + selectedNodes) network.selectNodes(selectedNodes, false) } } function clusterStructures() { network.setData(utg) var structures = []; for (var i = 0; i < utg.nodes.length; i++) { node = utg.nodes[i] if (structures.indexOf(node.structure_str) < 0) { structures.push(node.structure_str) } } var clusterOptionsByData; for (var i = 0; i < structures.length; i++) { var structure = structures[i]; clusterOptionsByData = { joinCondition: function (childOptions) { return childOptions.structure_str == structure; }, processProperties: function (clusterOptions, childNodes, childEdges) { clusterOptions.title = childNodes[0].title; clusterOptions.state_str = childNodes[0].state_str; clusterOptions.label = childNodes[0].label; clusterOptions.image = childNodes[0].image; return clusterOptions; }, clusterNodeProperties: { id: 'structure:' + structure, shape: 'image' } }; network.cluster(clusterOptionsByData); } } function clusterActivities() { network.setData(utg) var activities = []; for (var i = 0; i < utg.nodes.length; i++) { node = utg.nodes[i] if (activities.indexOf(node.activity) < 0) { activities.push(node.activity) } } var clusterOptionsByData; for (var i = 0; i < activities.length; i++) { var activity = activities[i]; clusterOptionsByData = { joinCondition: function (childOptions) { return childOptions.activity == activity; }, processProperties: function (clusterOptions, childNodes, childEdges) { clusterOptions.title = childNodes[0].title; clusterOptions.state_str = childNodes[0].state_str; clusterOptions.label = childNodes[0].label; clusterOptions.image = childNodes[0].image; return clusterOptions; }, clusterNodeProperties: { id: 'activity:' + activity, shape: 'image' } }; network.cluster(clusterOptionsByData); } } function showOriginalUTG() { network.setData(utg) network.redraw() }