forked from cory/tildefriends
		
	Hooked up the trace link to perfetto.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3730 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		| @@ -98,6 +98,58 @@ function edit() { | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| function trace() { | ||||
| 	var request = new XMLHttpRequest(); | ||||
| 	request.addEventListener("loadend", function() { | ||||
| 		if (request.status == 200) { | ||||
| 			/* The trace is loaded. */ | ||||
| 			console.log(typeof(request.response)); | ||||
| 			var perfetto = window.open('/perfetto/'); | ||||
| 			var done = false; | ||||
| 			if (perfetto) { | ||||
| 				function message_handler(message) { | ||||
| 					if (message.data == 'PONG') { | ||||
| 						perfetto.postMessage({ | ||||
| 							perfetto: { | ||||
| 								buffer: request.response, | ||||
| 								title: 'Tilde Friends Trace', | ||||
| 								url: window.location.href, | ||||
| 							} | ||||
| 						}, '*'); | ||||
| 						done = true; | ||||
| 					} | ||||
| 				} | ||||
| 				window.addEventListener('message', message_handler); | ||||
| 				function ping_perfetto() { | ||||
| 					perfetto.postMessage('PING', window.location.origin); | ||||
| 					if (!done && !perfetto.closed) { | ||||
| 						setTimeout(ping_perfetto, 50); | ||||
| 					} else { | ||||
| 						window.removeEventListener('message', message_handler); | ||||
| 					} | ||||
| 				} | ||||
| 				setTimeout(ping_perfetto, 50); | ||||
| 			} else { | ||||
| 				alert("Unable to open perfetto."); | ||||
| 			} | ||||
| 		} else { | ||||
| 			alert("Failed to load trace: " + request.status + "."); | ||||
| 		} | ||||
| 	}); | ||||
| 	request.addEventListener("error", function() { | ||||
| 		alert("Error loading trace."); | ||||
| 	}); | ||||
| 	request.addEventListener("timeout", function() { | ||||
| 		alert("Timed out loading trace."); | ||||
| 	}); | ||||
| 	request.addEventListener("abort", function() { | ||||
| 		alert("Loading trace aborted."); | ||||
| 	}); | ||||
| 	request.responseType = 'arraybuffer'; | ||||
| 	request.open("GET", "/trace"); | ||||
| 	request.send(); | ||||
| } | ||||
|  | ||||
| function guessMode(name) { | ||||
| 	return name.endsWith(".js") ? "javascript" : | ||||
| 		name.endsWith(".html") ? "htmlmixed" : | ||||
|   | ||||
							
								
								
									
										40
									
								
								core/core.js
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								core/core.js
									
									
									
									
									
								
							| @@ -333,6 +333,14 @@ async function staticFileHandler(request, response, blobId, uri) { | ||||
| 	response.end("File not found"); | ||||
| } | ||||
|  | ||||
| const k_mime_types = { | ||||
| 	'json': 'text/json', | ||||
| 	'js': 'text/javascript', | ||||
| 	'html': 'text/html', | ||||
| 	'css': 'text/css', | ||||
| 	'map': 'application/json', | ||||
| }; | ||||
|  | ||||
| async function speedScopeHandler(request, response, uri) { | ||||
| 	var filename = uri || 'index.html'; | ||||
| 	if (filename.indexOf('..') != -1) { | ||||
| @@ -340,17 +348,27 @@ async function speedScopeHandler(request, response, uri) { | ||||
| 		response.end("File not found"); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	const types = { | ||||
| 		'json': 'text/json', | ||||
| 		'js': 'text/javascript', | ||||
| 		'html': 'text/html', | ||||
| 		'css': 'text/css', | ||||
| 		'map': 'application/json', | ||||
| 	}; | ||||
| 	try { | ||||
| 		var data = await File.readFile("deps/speedscope/" + filename); | ||||
| 		response.writeHead(200, {"Content-Type": types[filename.split('.').pop()] || 'text/plain', "Content-Length": data.byteLength}); | ||||
| 		response.writeHead(200, {"Content-Type": k_mime_types[filename.split('.').pop()] || 'text/plain', "Content-Length": data.byteLength}); | ||||
| 		response.end(data); | ||||
| 	} catch { | ||||
| 		response.writeHead(404, {"Content-Type": "text/plain; charset=utf-8", "Content-Length": "File not found".length}); | ||||
| 		response.end("File not found"); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| async function perfettoHandler(request, response, uri) { | ||||
| 	var filename = uri || 'index.html'; | ||||
| 	if (filename.indexOf('..') != -1) { | ||||
| 		response.writeHead(404, {"Content-Type": "text/plain; charset=utf-8", "Content-Length": "File not found".length}); | ||||
| 		response.end("File not found"); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	try { | ||||
| 		var data = await File.readFile("deps/perfetto/" + filename); | ||||
| 		response.writeHead(200, {"Content-Type": k_mime_types[filename.split('.').pop()] || 'text/plain', "Content-Length": data.byteLength}); | ||||
| 		response.end(data); | ||||
| 	} catch { | ||||
| 		response.writeHead(404, {"Content-Type": "text/plain; charset=utf-8", "Content-Length": "File not found".length}); | ||||
| @@ -522,11 +540,13 @@ loadSettings().then(function() { | ||||
| 			return response.end(data); | ||||
| 		} else if (match = /^\/speedscope\/([\.\w-]*)$/.exec(request.uri)) { | ||||
| 			return speedScopeHandler(request, response, match[1]); | ||||
| 		} else if (match = /^\/perfetto\/([\.\w-/]*)$/.exec(request.uri)) { | ||||
| 			return perfettoHandler(request, response, match[1]); | ||||
| 		} else if (match = /^(.*)(\/save)$/.exec(request.uri)) { | ||||
| 			return blobHandler(request, response, match[1], match[2]); | ||||
| 		} else if (match = /^\/trace$/.exec(request.uri)) { | ||||
| 			var data = trace(); | ||||
| 			response.writeHead(404, {"Content-Type": "application/json; charset=utf-8", "Content-Length": data.length.toString()}); | ||||
| 			response.writeHead(200, {"Content-Type": "application/json; charset=utf-8", "Content-Length": data.length.toString()}); | ||||
| 			return response.end(data); | ||||
| 		} else if (request.uri == "/robots.txt") { | ||||
| 			return blobHandler(request, response, null, request.uri); | ||||
|   | ||||
| @@ -13,7 +13,7 @@ | ||||
| 			<span id="title">Tilde Friends</span> | ||||
| 			<a href="/">home</a> | ||||
| 			<a href="#" onclick="event.preventDefault(); edit()">edit</a> | ||||
| 			<a href="/trace">trace</a> | ||||
| 			<a href="#" onclick="event.preventDefault(); trace()">trace</a> | ||||
| 			<span id="status"></span> | ||||
| 			<span id="login"></span> | ||||
| 		</div> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user