From d0fc08b4325dc3c29321484f5a7470b16dded5a8 Mon Sep 17 00:00:00 2001 From: yflory Date: Tue, 19 Feb 2019 14:31:05 +0100 Subject: [PATCH] Generate dot graph from the debug app --- www/common/cryptpad-common.js | 2 +- www/common/translations/messages.json | 3 ++ www/debug/inner.js | 78 ++++++++++++++++++++++++++- www/debug/main.js | 4 ++ 4 files changed, 85 insertions(+), 2 deletions(-) diff --git a/www/common/cryptpad-common.js b/www/common/cryptpad-common.js index 06e216d58..22f54f17d 100644 --- a/www/common/cryptpad-common.js +++ b/www/common/cryptpad-common.js @@ -958,7 +958,7 @@ define([ common.autoStore.onStoreRequest = Util.mkEvent(); common.getFullHistory = function (data, cb) { - postMessage("GET_FULL_HISTORY", data, cb); + postMessage("GET_FULL_HISTORY", data, cb, {timeout: 180000}); }; common.getHistoryRange = function (data, cb) { postMessage("GET_HISTORY_RANGE", data, cb); diff --git a/www/common/translations/messages.json b/www/common/translations/messages.json index 27c01e5c4..0b0edb28c 100644 --- a/www/common/translations/messages.json +++ b/www/common/translations/messages.json @@ -307,6 +307,9 @@ "contacts_rooms": "Rooms", "contacts_leaveRoom": "Leave this room", "contacts_online": "Another user from this room is online", + "debug_getGraph":"Get the code to generate a graph of this document", + "debug_getGraphWait":"Generating the graph... Please Wait.", + "debug_getGraphText":"This is the DOT code to generate a graph of this document's history:", "fm_rootName": "Documents", "fm_trashName": "Trash", "fm_unsortedName": "Unsorted files", diff --git a/www/debug/inner.js b/www/debug/inner.js index 5efffd8fe..4610e0628 100644 --- a/www/debug/inner.js +++ b/www/debug/inner.js @@ -7,10 +7,12 @@ define([ '/bower_components/nthen/index.js', '/common/sframe-common.js', '/common/common-interface.js', + '/common/hyperscript.js', '/api/config', '/common/common-realtime.js', '/customize/messages.js', '/customize/application_config.js', + '/debug/chainpad.dist.js', '/bower_components/secure-fabric.js/dist/fabric.min.js', @@ -26,10 +28,12 @@ define([ nThen, SFCommon, UI, + h, ApiConfig, CommonRealtime, Messages, - AppConfig) + AppConfig, + ChainWalk) { var APP = window.APP = { $: $, @@ -54,6 +58,53 @@ define([ var cpNfInner; var metadataMgr; var readOnly = true; + var sframeChan = common.getSframeChannel(); + + var getGraph = function (cb) { + var chainpad = ChainWalk.create({ + userName: 'debug', + initialState: '', + logLevel: 0, + noPrune: true + }); + var makeGraph = function () { + var out = [ + 'digraph {' + ]; + var parseBlock = function (x) { + let c = x.getChildren(); + let label = x.hashOf.slice(0,8) + ' (' + x.parentCount + ' - ' + x.recvOrder + ')'; + var p = x.getParent(); + if (p && p.getChildren().length === 1 && c.length === 1) { + label = '...'; + let gc = c; + while (gc.length === 1) { + c = gc; + gc = c[0].getChildren(); + } + } + var nodeInfo = [' p' + x.hashOf + '[label="' + label + '"']; + if (x.isCheckpoint && label !== '...') { nodeInfo.push(',color=red,weight=0.5'); } + nodeInfo.push(']'); + out.push(nodeInfo.join('')); + c.forEach(function (child) { + out.push(' p' + x.hashOf + ' -> p' + child.hashOf); + parseBlock(child); + }); + }; + parseBlock(chainpad.getRootBlock()); + out.push('}'); + return out.join('\n'); + }; + sframeChan.query('Q_GET_FULL_HISTORY', null, function (err, data) { + console.log(err, data); + if (err) { return void cb(err); } + data.forEach(function (m) { + chainpad.message(m); + cb(null, makeGraph()) + }); + }, {timeout: 180000}); + }; var config = APP.config = { readOnly: readOnly, @@ -114,6 +165,31 @@ define([ var $hist = common.createButton('history', true, {histConfig: histConfig}); $hist.addClass('cp-hidden-if-readonly'); toolbar.$rightside.append($hist); + + var $graph = common.createButton(null, true, { + icon: 'fa-bug', + title: Messages.debug_getGraph, + name: 'graph', + id: 'cp-app-debug-get-graph' + }); + $graph.click(function () { + var p = h('p', [ + Messages.debug_getGraphWait, + h('br'), + h('span.fa-circle-o-notch.fa-spin.fa-3x.fa-fw.fa') + ]); + var code = h('code'); + var content = h('div', [p, code]); + getGraph(function (err, data) { + if (err) { + return p.innerHTML = err; + } + p.innerHTML = Messages.debug_getGraph; + code.innerHTML = data; + }); + UI.alert(content); + }); + toolbar.$rightside.append($graph); }; config.onReady = function (info) { diff --git a/www/debug/main.js b/www/debug/main.js index 7c136898a..904787b1e 100644 --- a/www/debug/main.js +++ b/www/debug/main.js @@ -53,6 +53,10 @@ define([ }; window.addEventListener('message', onMsg); }).nThen(function (/*waitFor*/) { + if (!window.location.hash) { + window.location.hash = localStorage[Constants.userHashKey] || + localStorage[Constants.fileHashKey]; + } SFCommonO.start(); }); });