mirror of
https://github.com/radareorg/radare2-webui.git
synced 2026-11-07 06:36:01 -10:00
Settings with MDL
* Save/load conf from localStorage * Propagate conf to r2
This commit is contained in:
1 parent
6541840adc
commit
5d18b1bf99
7 files changed
+403
-272
No files matched your search
@@ -44,6 +44,7 @@ material (responsive) interface
|
||||
* [dialog-polyfill](https://github.com/GoogleChrome/dialog-polyfill) (BSD)
|
||||
* [DataTables](https://datatables.net/) (MIT)
|
||||
* [FileSaver](https://github.com/eligrey/FileSaver.js) (MIT)
|
||||
* [mdl-selectfield](https://github.com/mebibou/mdl-selectfield) (MIT)
|
||||
|
||||
panels (desktop) interface
|
||||
-----------
|
||||
|
||||
+2
-1
@@ -22,6 +22,7 @@
|
||||
"dialog-polyfill": "^0.4.3",
|
||||
"datatables.net": "^1.10.12",
|
||||
"datatables.net-dt": "^1.10.12",
|
||||
"file-saver": "^1.3.2"
|
||||
"file-saver": "^1.3.2",
|
||||
"mdl-selectfield": "^1.0.2"
|
||||
}
|
||||
}
|
||||
@@ -26,6 +26,7 @@ gulp.task('dependencies', ['bower'], function() {
|
||||
'./vendors/material-design-lite/material.min.js',
|
||||
'./vendors/dialog-polyfill/dialog-polyfill.js',
|
||||
'./vendors/datatables.net/js/jquery.dataTables.min.js',
|
||||
'./vendors/mdl-selectfield/dist/mdl-selectfield.min.js',
|
||||
'./vendors/file-saver/FileSaver.min.js'])
|
||||
.pipe(gulp.dest(DEST + 'vendors/'));
|
||||
});
|
||||
@@ -50,6 +51,7 @@ gulp.task('js', ['jscs'], function() {
|
||||
gulp.task('cssdeps', ['bower'], function() {
|
||||
gulp.src([
|
||||
'./vendors/dialog-polyfill/dialog-polyfill.css',
|
||||
'./vendors/mdl-selectfield/dist/mdl-selectfield.min.css',
|
||||
'./vendors/material-design-lite/material.min.css'])
|
||||
.pipe(gulp.dest(DEST + 'vendors/'));
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
<link rel="stylesheet" href="./vendors/material.min.css">
|
||||
<link rel="stylesheet" href="./vendors/jquery.dataTables.min.css">
|
||||
<link rel="stylesheet" href="./vendors/material-design-icons.css">
|
||||
<link rel="stylesheet" href="./vendors/mdl-selectfield.min.css">
|
||||
<link rel="stylesheet" href="./vendors/dialog-polyfill.css">
|
||||
<link rel="stylesheet" href="./vendors/fonts/fonts.css">
|
||||
|
||||
@@ -239,6 +240,7 @@
|
||||
<script type="application/javascript" src="./vendors/jquery.min.js"></script>
|
||||
<script type="application/javascript" src="./vendors/jquery.dataTables.min.js"></script>
|
||||
<script type="application/javascript" src="./vendors/material.min.js"></script>
|
||||
<script type="application/javascript" src="./vendors/mdl-selectfield.min.js"></script>
|
||||
<script type="application/javascript" src="./vendors/FileSaver.min.js"></script>
|
||||
<script type="application/javascript" src="./index.js"></script>
|
||||
</body>
|
||||
|
||||
+3
-271
@@ -2,16 +2,6 @@ var update = function() {/* nop */};
|
||||
var inColor = true;
|
||||
var lastView = panelDisasm;
|
||||
|
||||
function uiButton(href, label, type) {
|
||||
var classes = 'mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect ';
|
||||
classes += 'mdl-color--accent mdl-color-text--accent-contrast';
|
||||
if (type == 'active') {
|
||||
var st = 'style="background-color:#f04040 !important"';
|
||||
return ' <a href="' + href.replace(/"/g, '\'') + '" class="' + classes + '" ' + st + '>' + label + '</a>';
|
||||
}
|
||||
return ' <a href="' + href.replace(/"/g, '\'') + '" class="' + classes + '">' + label + '</a>';
|
||||
}
|
||||
|
||||
function write() {
|
||||
var str = prompt('hexpairs, quoted string or :assembly');
|
||||
if (str != '') {
|
||||
@@ -94,15 +84,6 @@ function analyze() {
|
||||
panelDisasm();
|
||||
});
|
||||
}
|
||||
function uiCheckList(grp, id, label) {
|
||||
var output = '<li>';
|
||||
ouput += '<label for="' + grp + '" class="mdl-checkbox mdl-js-checkbox mdl-js-ripple-effect">';
|
||||
ouput += '<input type="checkbox" id="' + id + '" class="mdl-checkbox__input" />';
|
||||
ouput += '<span class="mdl-checkbox__label">' + label + '</span>';
|
||||
ouput += '</label></li>';
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
function notes() {
|
||||
var widget = widgetContainer.getWidget('Notes');
|
||||
@@ -235,256 +216,12 @@ function analyzeNames() {
|
||||
});
|
||||
}
|
||||
|
||||
function smallDisasm() {
|
||||
r2.cmd('e asm.bytes=false');
|
||||
r2.cmd('e asm.lines=false');
|
||||
r2.cmd('e asm.cmtright=false');
|
||||
}
|
||||
|
||||
function mediumDisasm() {
|
||||
r2.cmd('e asm.bytes=false');
|
||||
r2.cmd('e asm.lines=true');
|
||||
r2.cmd('e asm.lineswidth=8');
|
||||
r2.cmd('e asm.cmtright=false');
|
||||
}
|
||||
|
||||
function largeDisasm() {
|
||||
r2.cmd('e asm.bytes=true');
|
||||
r2.cmd('e asm.lines=true');
|
||||
r2.cmd('e asm.lineswidth=12');
|
||||
r2.cmd('e asm.cmtright=true');
|
||||
}
|
||||
|
||||
function configPseudo() {
|
||||
r2.cmd('e asm.pseudo=1');
|
||||
r2.cmd('e asm.syntax=intel');
|
||||
}
|
||||
|
||||
function configOpcodes() {
|
||||
r2.cmd('e asm.pseudo=0');
|
||||
r2.cmd('e asm.syntax=intel');
|
||||
}
|
||||
|
||||
function configATT() {
|
||||
r2.cmd('e asm.pseudo=0');
|
||||
r2.cmd('e asm.syntax=att');
|
||||
}
|
||||
|
||||
function panelAbout() {
|
||||
r2.cmd('?V', function(version) {
|
||||
alert('radare2 material webui by --pancake @ 2015-2016\n\n' + version.trim());
|
||||
});
|
||||
}
|
||||
|
||||
function configColorDefault() {
|
||||
r2.cmd('ecd', function() {
|
||||
update();
|
||||
});
|
||||
}
|
||||
function configColorRandom() {
|
||||
r2.cmd('ecr', function() {
|
||||
update();
|
||||
});
|
||||
}
|
||||
|
||||
function configColorTheme(theme) {
|
||||
r2.cmd('eco ' + theme, function() {
|
||||
update();
|
||||
});
|
||||
}
|
||||
|
||||
function configPA() {
|
||||
r2.cmd('e io.va=false');
|
||||
}
|
||||
|
||||
function configVA() {
|
||||
r2.cmd('e io.va=true');
|
||||
}
|
||||
|
||||
function configDebug() {
|
||||
r2.cmd('e io.va=true');
|
||||
r2.cmd('e io.debug=true');
|
||||
}
|
||||
|
||||
function configArch(name) { r2.cmd('e asm.arch=' + name); }
|
||||
function configBits8() { r2.cmd('e asm.bits=8'); }
|
||||
function configBits16() { r2.cmd('e asm.bits=16'); }
|
||||
function configBits32() { r2.cmd('e asm.bits=32'); }
|
||||
function configBits64() { r2.cmd('e asm.bits=64'); }
|
||||
function configColorTrue() { inColor = true; }
|
||||
function configColorFalse() { inColor = false; }
|
||||
|
||||
var comboId = 0;
|
||||
|
||||
function uiCombo(d) {
|
||||
var funName = 'combo' + (++comboId);
|
||||
var fun = funName + ' = function(e) {';
|
||||
fun += ' var sel = document.getElementById("opt_' + funName + '");';
|
||||
fun += ' var opt = sel.options[sel.selectedIndex].value;';
|
||||
fun += ' switch (opt) {';
|
||||
for (var a in d) {
|
||||
fun += 'case "' + d[a].name + '": ' + d[a].js + '(' + d[a].name + ');break;';
|
||||
}
|
||||
fun += '}}';
|
||||
// CSP violation here
|
||||
eval(fun);
|
||||
var out = '<select id="opt_' + funName + '" onchange="' + funName + '()">';
|
||||
for (var a in d) {
|
||||
var def = (d[a].default) ? ' default' : '';
|
||||
out += '<option' + def + '>' + d[a].name + '</option>';
|
||||
}
|
||||
out += '</select>';
|
||||
return out;
|
||||
}
|
||||
|
||||
function uiSwitch(d) {
|
||||
// TODO: not yet done
|
||||
var out = d;
|
||||
out += '<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect" for="switch-1">';
|
||||
out += '<input type="checkbox" id="switch-1" class="mdl-switch__input" checked />';
|
||||
out += '<span class="mdl-switch__label"></span>';
|
||||
out += '</label>';
|
||||
return out;
|
||||
}
|
||||
|
||||
function uiBlock(d) {
|
||||
var classes = 'mdl-card__supporting-text mdl-shadow--2dp mdl-color-text--blue-grey-50 mdl-cell';
|
||||
var styles = 'display:inline-block;margin:5px;color:black !important;background-color:white !important';
|
||||
var out = '<div class="' + classes + '" style="' + styles + '">';
|
||||
out += '<h3 style="color:black">' + d.name + '</h3>';
|
||||
for (var i in d.blocks) {
|
||||
var D = d.blocks[i];
|
||||
out += '<br />' + D.name + ': ';
|
||||
out += uiCombo(D.buttons);
|
||||
}
|
||||
out += '</div>';
|
||||
return out;
|
||||
}
|
||||
|
||||
function panelSettings() {
|
||||
var out = '';
|
||||
|
||||
var widget = widgetContainer.getWidget('Settings');
|
||||
var c = widgetContainer.getWidgetDOMWrapper(widget);
|
||||
|
||||
updates.registerMethod(widget.getOffset(), panelSettings);
|
||||
|
||||
c.style.backgroundColor = '#f0f0f0';
|
||||
out += '<div style=\'margin:10px\'>';
|
||||
out += uiBlock({ name: 'Platform', blocks: [
|
||||
{ name: 'Arch', buttons: [
|
||||
{ name: 'x86', js: 'configArch', default: true },
|
||||
{ name: 'arm', js: 'configArch' },
|
||||
{ name: 'mips', js: 'configArch' },
|
||||
{ name: 'java', js: 'configArch' },
|
||||
{ name: 'dalvik', js: 'configArch' },
|
||||
{ name: '6502', js: 'configArch' },
|
||||
{ name: '8051', js: 'configArch' },
|
||||
{ name: 'h8300', js: 'configArch' },
|
||||
{ name: 'hppa', js: 'configArch' },
|
||||
{ name: 'i4004', js: 'configArch' },
|
||||
{ name: 'i8008', js: 'configArch' },
|
||||
{ name: 'lh5801', js: 'configArch' },
|
||||
{ name: 'lm32', js: 'configArch' },
|
||||
{ name: 'm68k', js: 'configArch' },
|
||||
{ name: 'malbolge', js: 'configArch' },
|
||||
{ name: 'mcs96', js: 'configArch' },
|
||||
{ name: 'msp430', js: 'configArch' },
|
||||
{ name: 'nios2', js: 'configArch' },
|
||||
{ name: 'ppc', js: 'configArch' },
|
||||
{ name: 'rar', js: 'configArch' },
|
||||
{ name: 'sh', js: 'configArch' },
|
||||
{ name: 'snes', js: 'configArch' },
|
||||
{ name: 'sparc', js: 'configArch' },
|
||||
{ name: 'spc700', js: 'configArch' },
|
||||
{ name: 'sysz', js: 'configArch' },
|
||||
{ name: 'tms320', js: 'configArch' },
|
||||
{ name: 'v810', js: 'configArch' },
|
||||
{ name: 'v850', js: 'configArch' },
|
||||
{ name: 'ws', js: 'configArch' },
|
||||
{ name: 'xcore', js: 'configArch' },
|
||||
{ name: 'prospeller', js: 'configArch' },
|
||||
{ name: 'gb', js: 'configArch' },
|
||||
{ name: 'z80', js: 'configArch' },
|
||||
{ name: 'arc', js: 'configArch' },
|
||||
{ name: 'avr', js: 'configArch' },
|
||||
{ name: 'bf', js: 'configArch' },
|
||||
{ name: 'cr16', js: 'configArch' },
|
||||
{ name: 'cris', js: 'configArch' },
|
||||
{ name: 'csr', js: 'configArch' },
|
||||
{ name: 'dcpu16', js: 'configArch' },
|
||||
{ name: 'ebc', js: 'configArch' }
|
||||
]},
|
||||
{ name: 'Bits', buttons: [
|
||||
{ name: '64', js: 'configBits64' },
|
||||
{ name: '32', js: 'configBits32', default: true },
|
||||
{ name: '16', js: 'configBits16' },
|
||||
{ name: '8', js: 'configBits8' }
|
||||
]},
|
||||
{ name: 'OS', buttons: [
|
||||
{ name: 'Linux', js: 'configOS_LIN', default: true },
|
||||
{ name: 'Windows', js: 'configOS_W32' },
|
||||
{ name: 'OSX', js: 'configOS_OSX' }
|
||||
]}
|
||||
]
|
||||
});
|
||||
out += uiBlock({ name: 'Disassembly', blocks: [
|
||||
{ name: 'Size', buttons: [
|
||||
{ name: 'S', js: 'smallDisasm' },
|
||||
{ name: 'M', js: 'mediumDisasm' },
|
||||
{ name: 'L', js: 'largeDisasm' }
|
||||
]},
|
||||
{ name: 'Decoding', buttons: [
|
||||
{ name: 'Pseudo', js: 'configPseudo' },
|
||||
{ name: 'Opcodes', js: 'configOpcodes' },
|
||||
{ name: 'ATT', js: 'configATT' }
|
||||
]},
|
||||
{ name: 'Colors', buttons: [
|
||||
{ name: 'Yes', js: 'configColorTrue', default: true },
|
||||
{ name: 'No', js: 'configColorFalse' }
|
||||
]},
|
||||
{ name: 'Theme', buttons: [
|
||||
{ name: 'Default', js: 'configColorDefault' },
|
||||
{ name: 'Random', js: 'configColorRandom' },
|
||||
{ name: 'Solarized', js: 'configColorTheme("solarized")' },
|
||||
{ name: 'Ogray', js: 'configColorTheme("ogray")' },
|
||||
{ name: 'Twilight', js: 'configColorTheme("twilight")' },
|
||||
{ name: 'Rasta', js: 'configColorTheme("rasta")' },
|
||||
{ name: 'Tango', js: 'configColorTheme("tango")' },
|
||||
{ name: 'White', js: 'configColorTheme("white")' }
|
||||
]}
|
||||
]});
|
||||
out += uiBlock({ name: 'Core/IO', blocks: [
|
||||
{
|
||||
name: 'Mode', buttons: [
|
||||
{ name: 'PA', js: 'configPA' },
|
||||
{ name: 'VA', js: 'configVA' },
|
||||
{ name: 'Debug', js: 'configDebug' }
|
||||
]
|
||||
}
|
||||
]});
|
||||
out += uiBlock({ name: 'Analysis', blocks: [
|
||||
{
|
||||
name: 'HasNext', buttons: [
|
||||
{ name: 'Yes', js: 'configAnalHasnextTrue', default: true },
|
||||
{ name: 'No', js: 'configAnalHasnextFalse' }
|
||||
]
|
||||
}, {
|
||||
name: 'Skip Nops', buttons: [
|
||||
{ name: 'Yes', js: 'configAnalNopskipTrue', default: true },
|
||||
{ name: 'No', js: 'configAnalNopskipFalse' }
|
||||
]
|
||||
}, {
|
||||
name: 'NonCode', buttons: [
|
||||
{ name: 'Yes', js: 'configAnalNoncodeTrue' },
|
||||
{ name: 'No', js: 'configAnalNoncodeFalse', default: true }
|
||||
]
|
||||
}
|
||||
]});
|
||||
out += '</div>';
|
||||
c.innerHTML = out;
|
||||
}
|
||||
|
||||
function panelFunctions() {
|
||||
var widget = widgetContainer.getWidget('Functions');
|
||||
widget.setDark();
|
||||
@@ -741,14 +478,6 @@ function down() {
|
||||
update();
|
||||
}
|
||||
|
||||
function uiRoundButton(a, b, c) {
|
||||
var out = '';
|
||||
out += '<button onclick=' + a + ' class="mdl-button mdl-js-button mdl-button--fab mdl-js-ripple-effect" ' + c + '>';
|
||||
out += '<i class="material-icons" style="opacity:1">' + b + '</i>';
|
||||
out += '</button>';
|
||||
return out;
|
||||
}
|
||||
|
||||
var nativeDebugger = false;
|
||||
|
||||
function srpc() {
|
||||
@@ -1018,6 +747,9 @@ function ready() {
|
||||
}
|
||||
twice = true;
|
||||
|
||||
// Loading configuration from localStorage (see panelSettings)
|
||||
applyConf();
|
||||
|
||||
updates = new UpdateManager();
|
||||
lastViews = new UpdateManager();
|
||||
|
||||
|
||||
+149
@@ -0,0 +1,149 @@
|
||||
function uiButton(href, label, type) {
|
||||
var classes = 'mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect ';
|
||||
classes += 'mdl-color--accent mdl-color-text--accent-contrast';
|
||||
if (type == 'active') {
|
||||
var st = 'style="background-color:#f04040 !important"';
|
||||
return ' <a href="' + href.replace(/"/g, '\'') + '" class="' + classes + '" ' + st + '>' + label + '</a>';
|
||||
}
|
||||
return ' <a href="' + href.replace(/"/g, '\'') + '" class="' + classes + '">' + label + '</a>';
|
||||
}
|
||||
|
||||
function uiCheckList(grp, id, label) {
|
||||
var output = '<li>';
|
||||
ouput += '<label for="' + grp + '" class="mdl-checkbox mdl-js-checkbox mdl-js-ripple-effect">';
|
||||
ouput += '<input type="checkbox" id="' + id + '" class="mdl-checkbox__input" />';
|
||||
ouput += '<span class="mdl-checkbox__label">' + label + '</span>';
|
||||
ouput += '</label></li>';
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
var comboId = 0;
|
||||
function uiCombo(d) {
|
||||
var funName = 'combo' + (++comboId);
|
||||
var fun = funName + ' = function(e) {';
|
||||
fun += ' var sel = document.getElementById("opt_' + funName + '");';
|
||||
fun += ' var opt = sel.options[sel.selectedIndex].value;';
|
||||
fun += ' switch (opt) {';
|
||||
for (var a in d) {
|
||||
fun += 'case "' + d[a].name + '": ' + d[a].js + '(' + d[a].name + ');break;';
|
||||
}
|
||||
fun += '}}';
|
||||
// CSP violation here
|
||||
eval(fun);
|
||||
var out = '<select id="opt_' + funName + '" onchange="' + funName + '()">';
|
||||
for (var a in d) {
|
||||
var def = (d[a].default) ? ' default' : '';
|
||||
out += '<option' + def + '>' + d[a].name + '</option>';
|
||||
}
|
||||
out += '</select>';
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a switch, with a name "label", define default state by isChecked
|
||||
* callbacks are bound when un-checked.
|
||||
*/
|
||||
var idSwitch = 0;
|
||||
function uiSwitch(dom, name, isChecked, onChange) {
|
||||
var id = 'switch-' + (++idSwitch);
|
||||
|
||||
var label = document.createElement('label');
|
||||
label.className = 'mdl-switch mdl-js-switch mdl-js-ripple-effect';
|
||||
label.for = id;
|
||||
dom.appendChild(label);
|
||||
|
||||
var input = document.createElement('input');
|
||||
input.type = 'checkbox';
|
||||
input.className = 'mdl-switch__input';
|
||||
input.checked = isChecked;
|
||||
input.id = id;
|
||||
label.appendChild(input);
|
||||
|
||||
input.addEventListener('change', function(evt) {
|
||||
onChange(name, evt.target.checked);
|
||||
});
|
||||
|
||||
var span = document.createElement('span');
|
||||
span.className = 'mdl-switch__label';
|
||||
span.innerHTML = name;
|
||||
label.appendChild(span);
|
||||
}
|
||||
|
||||
function uiActionButton(dom, action, label) {
|
||||
var button = document.createElement('a');
|
||||
button.href = '#';
|
||||
button.innerHTML = label;
|
||||
button.addEventListener('click', action);
|
||||
dom.appendChild(button);
|
||||
|
||||
var classes = 'mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect ';
|
||||
classes += 'mdl-color--accent mdl-color-text--accent-contrast';
|
||||
button.className = classes;
|
||||
button.style.margin = '3px';
|
||||
}
|
||||
|
||||
var selectId = 0;
|
||||
function uiSelect(dom, name, list, defaultOffset, onChange) {
|
||||
var id = 'select-' + (++selectId);
|
||||
|
||||
var div = document.createElement('div');
|
||||
div.className = 'mdl-selectfield mdl-js-selectfield mdl-selectfield--floating-label';
|
||||
dom.appendChild(div);
|
||||
|
||||
var select = document.createElement('select');
|
||||
select.className = 'mdl-selectfield__select';
|
||||
select.id = id;
|
||||
select.name = id;
|
||||
div.appendChild(select);
|
||||
|
||||
for (var i = 0 ; i < list.length ; i++) {
|
||||
var option = document.createElement('option');
|
||||
option.innerHTML = list[i];
|
||||
option.value = list[i];
|
||||
select.appendChild(option);
|
||||
if (i === defaultOffset) {
|
||||
option.selected = true;
|
||||
}
|
||||
}
|
||||
|
||||
select.addEventListener('change', function(evt) {
|
||||
onChange(evt.target.value);
|
||||
});
|
||||
|
||||
var label = document.createElement('label');
|
||||
label.className = 'mdl-selectfield__label';
|
||||
label.for = id;
|
||||
label.innerHTML = name;
|
||||
div.appendChild(label);
|
||||
}
|
||||
|
||||
// function uiSwitch(d) {
|
||||
// // TODO: not yet done
|
||||
// var out = d;
|
||||
// out += '<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect" for="switch-1">';
|
||||
// out += '<input type="checkbox" id="switch-1" class="mdl-switch__input" checked />';
|
||||
// out += '<span class="mdl-switch__label"></span>';
|
||||
// out += '</label>';
|
||||
// return out;
|
||||
// }
|
||||
|
||||
function uiBlock(d) {
|
||||
var classes = 'mdl-card__supporting-text mdl-shadow--2dp mdl-color-text--blue-grey-50 mdl-cell';
|
||||
var styles = 'display:inline-block;margin:5px;color:black !important;background-color:white !important';
|
||||
var out = '';
|
||||
for (var i in d.blocks) {
|
||||
var D = d.blocks[i];
|
||||
out += '<br />' + D.name + ': ';
|
||||
out += uiCombo(D.buttons);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
function uiRoundButton(a, b, c) {
|
||||
var out = '';
|
||||
out += '<button onclick=' + a + ' class="mdl-button mdl-js-button mdl-button--fab mdl-js-ripple-effect" ' + c + '>';
|
||||
out += '<i class="material-icons" style="opacity:1">' + b + '</i>';
|
||||
out += '</button>';
|
||||
return out;
|
||||
}
|
||||
@@ -0,0 +1,244 @@
|
||||
function getConf(confKey) {
|
||||
var local = localStorage.getItem(confKey.name);
|
||||
if (local !== null) {
|
||||
if (local === 'false') {
|
||||
local = false;
|
||||
} else if (local === 'true') {
|
||||
local = true;
|
||||
}
|
||||
return local;
|
||||
} else {
|
||||
return confKey.defVal;
|
||||
}
|
||||
}
|
||||
|
||||
function saveConf(confKey, val) {
|
||||
localStorage.setItem(confKey.name, val);
|
||||
confKey.apply(val);
|
||||
}
|
||||
|
||||
function applyConf(force) {
|
||||
force = (typeof force === 'undefined') ? false : force;
|
||||
for (var item in R2Conf) {
|
||||
var cnf = R2Conf[item];
|
||||
if ((!force && getConf(cnf) !== cnf.defVal) || force) {
|
||||
cnf.apply(getConf(cnf));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function resetConf() {
|
||||
for (var item in R2Conf) {
|
||||
var cnf = R2Conf[item];
|
||||
localStorage.removeItem(cnf.name);
|
||||
}
|
||||
applyConf(true);
|
||||
}
|
||||
|
||||
var R2Conf = {
|
||||
platform: { name: 'platform', defVal: 'x86', apply: function(p) { r2.cmd('e asm.arch=' + p); } },
|
||||
bits: { name: 'bits', defVal: '32', apply: function(p) { r2.cmd('e asm.bits=' + p); } },
|
||||
os: { name: 'os', defVal: 'Linux', apply: function(p) { console.log('OS is now: ' + p); } }, // missing
|
||||
size: { name: 'size', defVal: 'S', apply: function(p) {
|
||||
switch (p) {
|
||||
case 'S':
|
||||
r2.cmd('e asm.bytes=false');
|
||||
r2.cmd('e asm.lines=false');
|
||||
r2.cmd('e asm.cmtright=false');
|
||||
break;
|
||||
case 'M':
|
||||
r2.cmd('e asm.bytes=false');
|
||||
r2.cmd('e asm.lines=true');
|
||||
r2.cmd('e asm.lineswidth=8');
|
||||
r2.cmd('e asm.cmtright=false');
|
||||
break;
|
||||
case 'L':
|
||||
r2.cmd('e asm.bytes=true');
|
||||
r2.cmd('e asm.lines=true');
|
||||
r2.cmd('e asm.lineswidth=12');
|
||||
r2.cmd('e asm.cmtright=true');
|
||||
break;
|
||||
};
|
||||
}
|
||||
},
|
||||
decoding: { name: 'decoding', defVal: 'Pseudo', apply: function(p) {
|
||||
switch (p) {
|
||||
case 'Pseudo':
|
||||
r2.cmd('e asm.pseudo=1');
|
||||
r2.cmd('e asm.syntax=intel');
|
||||
break;
|
||||
case 'Opcodes':
|
||||
r2.cmd('e asm.pseudo=0');
|
||||
r2.cmd('e asm.syntax=intel');
|
||||
break;
|
||||
case 'ATT':
|
||||
r2.cmd('e asm.pseudo=0');
|
||||
r2.cmd('e asm.syntax=att');
|
||||
break;
|
||||
};
|
||||
}
|
||||
},
|
||||
mode: { name: 'mode', defVal: 'PA', apply: function(p) {
|
||||
switch (p) {
|
||||
case 'PA':
|
||||
r2.cmd('e io.va=false');
|
||||
break;
|
||||
case 'VA':
|
||||
r2.cmd('e io.va=true');
|
||||
break;
|
||||
case 'Debug':
|
||||
r2.cmd('e io.va=true');
|
||||
r2.cmd('e io.debug=true');
|
||||
break;
|
||||
};
|
||||
}
|
||||
},
|
||||
analHasNext: { name: 'analHasNext', defVal: true, apply: function(p) { console.log('analHasNext is ' + p); } },
|
||||
analSkipNops: { name: 'analSkipNops', defVal: true, apply: function(p) { console.log('analSkipNops is ' + p); } },
|
||||
analNonCode: { name: 'analNonCode', defVal: false, apply: function(p) { console.log('analNonCode is ' + p); } },
|
||||
colors: { name: 'colors', defVal: true, apply: function(p) { inColor = p; } },
|
||||
theme: { name: 'theme', defVal: 'none', apply: function(p) { r2.cmd('eco ' + p); } } // TODO
|
||||
};
|
||||
|
||||
function panelSettings() {
|
||||
var widget = widgetContainer.getWidget('Settings');
|
||||
var c = widgetContainer.getWidgetDOMWrapper(widget);
|
||||
c.innerHTML = '';
|
||||
updates.registerMethod(widget.getOffset(), panelSettings);
|
||||
|
||||
var grid = document.createElement('div');
|
||||
grid.className = 'mdl-grid';
|
||||
c.appendChild(grid);
|
||||
|
||||
var platform = createGrid(grid, 'Platform');
|
||||
drawPlatform(platform);
|
||||
|
||||
var disassembly = createGrid(grid, 'Disassembly');
|
||||
drawDisassembly(disassembly);
|
||||
|
||||
var coreio = createGrid(grid, 'Core/IO');
|
||||
drawCoreIO(coreio);
|
||||
|
||||
var analysis = createGrid(grid, 'Analysis');
|
||||
drawAnalysis(analysis);
|
||||
|
||||
var colors = createGrid(grid, 'Colors');
|
||||
drawColors(colors);
|
||||
|
||||
var reset = createGrid(grid, 'Reset configuration');
|
||||
uiActionButton(reset, function() {
|
||||
resetConf();
|
||||
update();
|
||||
}, 'RESET');
|
||||
|
||||
componentHandler.upgradeDom();
|
||||
}
|
||||
|
||||
function savedFromList(list, name, defaultOffset) {
|
||||
var value = defaultOffset;
|
||||
var saved = localStorage.getItem(name);
|
||||
if (saved !== null) {
|
||||
value = list.indexOf(saved);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
function drawPlatform(dom) {
|
||||
var archs = ['x86', 'arm', 'mips', 'java', 'dalvik', '6502', '8051', 'h8300', 'hppa', 'i4004', 'i8008', 'lh5801',
|
||||
'lm32', 'm68k', 'malbolge', 'mcs96', 'msp430', 'nios2', 'ppc', 'rar', 'sh', 'snes', 'sparc', 'spc700', 'sysz',
|
||||
'tms320', 'v810', 'v850', 'ws', 'xcore', 'prospeller', 'gb', 'z80', 'arc', 'avr', 'bf', 'cr16', 'cris', 'csr',
|
||||
'dcpu16', 'ebc'];
|
||||
uiSelect(dom, 'Platform', archs, archs.indexOf(getConf(R2Conf.platform)), function(item) {
|
||||
saveConf(R2Conf.platform, item);
|
||||
});
|
||||
|
||||
var bits = ['64', '32', '16', '8'];
|
||||
uiSelect(dom, 'Bits', bits, bits.indexOf(getConf(R2Conf.bits)), function(item) {
|
||||
saveConf(R2Conf.bits, item);
|
||||
});
|
||||
|
||||
var os = ['Linux', 'Windows', 'OSX'];
|
||||
uiSelect(dom, 'OS', os, os.indexOf(getConf(R2Conf.os)), function(item) {
|
||||
saveConf(R2Conf.os, item);
|
||||
});
|
||||
}
|
||||
|
||||
function drawDisassembly(dom) {
|
||||
var sizes = ['S', 'M', 'L'];
|
||||
uiSelect(dom, 'Size', sizes, sizes.indexOf(getConf(R2Conf.size)), function(item) {
|
||||
saveConf(R2Conf.size, item);
|
||||
});
|
||||
var decoding = ['Pseudo', 'Opcodes', 'ATT'];
|
||||
uiSelect(dom, 'Decoding', decoding, decoding.indexOf(getConf(R2Conf.decoding)), function(item) {
|
||||
saveConf(R2Conf.decoding, item);
|
||||
});
|
||||
}
|
||||
|
||||
function drawCoreIO(dom) {
|
||||
var mode = ['PA', 'VA', 'Debug'];
|
||||
uiSelect(dom, 'Mode', mode, mode.indexOf(getConf(R2Conf.mode)), function(item) {
|
||||
saveConf(R2Conf.mode, item);
|
||||
});
|
||||
}
|
||||
|
||||
function drawAnalysis(dom) {
|
||||
var configAnal = function(param, state, conf) {
|
||||
saveConf(conf, state);
|
||||
};
|
||||
|
||||
uiSwitch(dom, 'HasNext', getConf(R2Conf.analHasNext), function(param, state) {
|
||||
return configAnal(param, state, R2Conf.analHasNext);
|
||||
});
|
||||
uiSwitch(dom, 'Skip Nops', getConf(R2Conf.analSkipNops), function(param, state) {
|
||||
return configAnal(param, state, R2Conf.analSkipNops);
|
||||
});
|
||||
uiSwitch(dom, 'NonCode', getConf(R2Conf.analNonCode), function(param, state) {
|
||||
return configAnal(param, state, R2Conf.analNonCode);
|
||||
});
|
||||
}
|
||||
|
||||
function drawColors(dom) {
|
||||
var colors;
|
||||
r2.cmdj('ecoj', function(data) {
|
||||
colors = data;
|
||||
});
|
||||
|
||||
uiSwitch(dom, 'Colors', getConf(R2Conf.colors), function(param, state) {
|
||||
saveConf(R2Conf.colors, state);
|
||||
});
|
||||
|
||||
// Randomize
|
||||
uiActionButton(dom, function() {
|
||||
r2.cmd('ecr', function() {
|
||||
update();
|
||||
});
|
||||
}, 'Randomize');
|
||||
|
||||
// Set default
|
||||
uiActionButton(dom, function() {
|
||||
r2.cmd('ecd', function() {
|
||||
update();
|
||||
});
|
||||
}, 'Reset colors');
|
||||
|
||||
uiSelect(dom, 'Theme', colors, colors.indexOf(getConf(R2Conf.theme)), function(theme) {
|
||||
saveConf(R2Conf.theme, theme);
|
||||
});
|
||||
}
|
||||
|
||||
function createGrid(dom, name) {
|
||||
var div = document.createElement('div');
|
||||
div.className = 'mdl-cell mdl-color--white mdl-shadow--2dp mdl-cell--4-col';
|
||||
div.style.padding = '10px';
|
||||
dom.appendChild(div);
|
||||
|
||||
var title = document.createElement('span');
|
||||
title.className = 'mdl-layout-title';
|
||||
title.innerHTML = name;
|
||||
div.appendChild(title);
|
||||
|
||||
var content = document.createElement('div');
|
||||
div.appendChild(content);
|
||||
|
||||
return content;
|
||||
}
|
||||
Reference in new issue
Block a user