ebrowser 1.0.33

This commit is contained in:
James Feng Cao 2024-06-25 06:06:51 +08:00
parent 536ff07ffa
commit 1577313e59
9 changed files with 98 additions and 184 deletions

View file

@ -55,6 +55,7 @@ Mirror urls could be used like ":update https://uwebzh.netlify.app/misc/ebrowser
- ":" for address bar commands
- ac [bookmark/history path w/o ext] : load ".rec" file for autocomplete.
- b [bookmarkfilename w/o ext] : bookmark current page in file.
- bjs : Browser-level JavaScript execution.
- bml [filename w/o extension]: load/execute the javascript file.
- cert : allow invalid certificates w/o arguments, otherwise restore to default.
- clear : the arguments could be
@ -66,8 +67,6 @@ Mirror urls could be used like ":update https://uwebzh.netlify.app/misc/ebrowser
- gr [gredirect index]: global redirection with corresponding index. Use the first global redirection url if no argument. Disable global redirection with any index out of the range.
- js [js code] : execute JS code at OS level. Note: "javascript:..." is special url and thus works in the current web page, while ":js ..." commands can do any OS operations.
- nc/uc : No Cookie forwarding/Use Cookie forwarding with global redirection.
- nh/uh for No/Use url history.
- nj/uj for No/Use external Javascript files.
- nr/ur for No/Use "redirect.json" for domain redirection.
- np : no proxy.
- up [proxyName] : use proxy. privous proxy or the first proxy in proxy.json w/o [proxyName]. ":up" command also disables global and domain redirections, which are not restored by ":np".
@ -97,9 +96,18 @@ The other commands are defined in "mapkeys.json", which will map keys to address
#### Javascript at three levels
- Web page: urls like "javascript:" or bookmarklet command ":bml" run in web page.
- Browser (or renderer process) : "!xx" evaluates "xx.js", which could manipulate address bar etc.
- Browser (or renderer process) :
- ":bjs" to execute the following js code at browser level.
- "!xx" evaluates "xx.js", which could manipulate address bar etc.
- OS level (or main process) : ":js" to execute the following js code with all OS APIs available.
##### examples for ":js"/":bjs" commands
:js bJS=true //allow external Javascript files for web pages
:js bJS=false //disallow external Javascript files for web pages
:bjs bHistory=true //to record url history
:bjs bQueryHistory=true //to record query/command history
#### New usages
- Vector designing with web tech to replace Adobe Illustrator/Inkscape.
- Design with web tech.

View file

@ -49,6 +49,7 @@ You should have received a copy of the GNU General Public License along with thi
}
.autocomplete-items div {
cursor: pointer;
background-color: #fff;
}
.autocomplete-items div:hover {
background-color: #e9e9e9;
@ -65,8 +66,13 @@ You should have received a copy of the GNU General Public License along with thi
var closedUrls = [];
var autocStrArray = [];
var defaultSE = "https://www.bing.com/search?q=%s";
var historyFile = path.join(__dirname,'history.rec');
var bHistory = false;
var bQueryHistory = false;
var autocMode = 0; //0 for substring, 1 for startsWith
const JSPREFIX_LOAD = "(async ()=>{let d=document;async function _loadJs(u){var a=d.createElement('script');a.type='text/javascript';a.async=false;a.src=u;d.body.appendChild(a);await new Promise(resolve=>a.onload=resolve)}";
const BML_md = JSPREFIX_LOAD + "await _loadJs('https://cdn.jsdelivr.net/npm/marked@12.0.2/marked.min.js');let b=d.body;b.innerHTML=marked.parse(b.textContent)})()";
let lastKeys;
let lastKeys_millis = 0;
@ -78,7 +84,10 @@ You should have received a copy of the GNU General Public License along with thi
initSearchEngines(jsonString,false);
});
fs.readFile(path.join(__dirname,'mapkeys.json'), 'utf8', (err, jsonStr) => {
if (err) return;
if (err) {
coloncommand(":js fetch2file(repositoryurl,'mapkeys.json')");
return;
}
try {
mapKeys = JSON.parse(jsonStr);
}catch(e){}
@ -126,9 +135,24 @@ You should have received a copy of the GNU General Public License along with thi
iTab = i;
tabs.children[iTab].classList.add('curWV');
}
function cbFinishLoad(e){
let tab = e.target;
let js = tab.dataset.jsonce;
if(js){
tab.dataset.jsonce = null;
tab.executeJavaScript(js,false);
}
if(!bHistory) return;
let histItem = tab.getTitle()+" "+tab.getURL()+"\n";
fs.appendFile(historyFile, histItem, (err) => {});
}
function initTab(tab){
tab.allowpopups = true;
tab.addEventListener('did-finish-load',cbFinishLoad);
}
function newTab(){
var tab = document.createElement('webview');
tab.allowpopups = true;
initTab(tab);
tabs.appendChild(tab);
}
function tabInc(num){
@ -195,24 +219,36 @@ You should have received a copy of the GNU General Public License along with thi
}
return;
}
SCROLL: do {
let h = -32;
switch(key){
case " ":
if(inputE === document.activeElement) return;
if(e.shiftKey){
h = -3*document.documentElement.clientHeight/4;
break;
}
case "PageDown":
tabs.children[iTab].src =
"javascript:window.scrollBy(0,3*document.documentElement.clientHeight/4)";
return;
h = 3*document.documentElement.clientHeight/4;
break;
case "PageUp":
tabs.children[iTab].src = "javascript:window.scrollBy(0,-3*document.documentElement.clientHeight/4)";
return;
h = -3*document.documentElement.clientHeight/4;
break;
case "ArrowDown":
if(inputE !== document.activeElement || 0==inputE.nextElementSibling.children.length)
tabs.children[iTab].src="javascript:window.scrollBy(0,32)";
return;
h = 32;
case "ArrowUp":
if(inputE !== document.activeElement || 0==inputE.nextElementSibling.children.length)
tabs.children[iTab].src="javascript:window.scrollBy(0,-32)";
return;
if(inputE === document.activeElement &&
0!==inputE.nextElementSibling.children.length)
return;
break;
default:
break SCROLL;
}
let js = `javascript:window.scrollBy(0,${h})`;
tabs.children[iTab].src = js;
return;
}while(false);
if(inputE === document.activeElement){
if (9===e.keyCode){//tab completion
}
@ -269,6 +305,9 @@ You should have received a copy of the GNU General Public License along with thi
case "b":
bookmark(args);
return;
case "bjs":
eval(cmd.slice(5));
return;
case "bml":
bml(args);
return;
@ -375,15 +414,16 @@ You should have received a copy of the GNU General Public License along with thi
}
}
var url=q;
NOREC: do{
do {
if(q.length>12){
let c6 = q.charCodeAt(6);
if(47===c6){// '/'
let c5 = q.charCodeAt(5);
if(47===c5 && 58===q.charCodeAt(4))//http/file urls
break;
break NOREC;
if(58===c5 && 47===q.charCodeAt(7))//https://
break;
break NOREC;
}else if(q.startsWith("javascript:")){
tabs.children[iTab].executeJavaScript(q.substring(11),false);
recQueryHistory(q);
@ -398,14 +438,14 @@ You should have received a copy of the GNU General Public License along with thi
}
if(q.indexOf('.')>0){
url = 'https://'+q;
break;
break NOREC;
}
url = defaultSE.replace('%s',q);
recQueryHistory(q);
break;
}
url = bang(q, iS);
recQueryHistory(q);
}while(false);
recQueryHistory(q);
}while(false);
tabs.children[iTab].src=url;
}
@ -501,6 +541,7 @@ function autocomplete(inp,container,arr) {
</div>
<script>
tabs = document.body.children[1];
initTab(tabs.children[0]);
{
let inp = document.forms[0].q;
autocomplete(inp,inp.nextElementSibling,autocStrArray);

View file

@ -1,4 +1,4 @@
{"version":"1.0.31",
{"version":"1.0.33",
"name": "ebrowser",
"description": "The keyboard-friendly minimal suckless web browser",
"main": "webview.js",
@ -6,7 +6,8 @@
"webview.js",
"index.html",
"package.json",
"README.md"
"README.md",
"mapkeys.json"
],
"scripts": {
"release": "electron-builder"

View file

@ -39,7 +39,6 @@ var gredirect;
var redirects;
var bRedirect = true;
var bJS = true;
var bHistory = false;
var bForwardCookie = false;
var proxies = {};
var proxy;
@ -48,7 +47,6 @@ var defaultUA =
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/" +
process.versions.chrome +" Safari/537.36";
app.userAgentFallback = defaultUA;
var historyFile = path.join(__dirname,'history.rec');
fs.readFile(path.join(__dirname,'redirect.json'), 'utf8', (err, jsonString) => {
if (err) return;
@ -139,7 +137,7 @@ app.on ('web-contents-created', (event, contents) => {
//contents.on('focus', ()=>{cbFocus(contents)});
//contents.on('blur',()=>{cbBlur()});
contents.session.webRequest.onBeforeRequest(interceptRequest);
contents.on('did-finish-load',()=>{cbFinishLoad(contents)});
//contents.on('did-finish-load',()=>{cbFinishLoad(contents)});
}
});
@ -194,7 +192,7 @@ function addrCommand(cmd){
else
gredirect_disable();
return;
case "js"://exetute js
case "js"://execute js
eval(cmd.slice(4));
return;
case "nc":
@ -208,18 +206,6 @@ function addrCommand(cmd){
}
forwardCookie();
return;
case "nh":
bHistory = false;
win.webContents.executeJavaScript("bQueryHistory=false",false);
return;
case "uh":
bHistory = true;
win.webContents.executeJavaScript("bQueryHistory=true",false);
return;
case "nj":
bJS = false; return;
case "uj":
bJS = true; return;
case "np":
session.defaultSession.setProxy ({mode:"direct"});
bRedirect = true;
@ -275,12 +261,6 @@ function cbConsoleMsg(e, level, msg, line, sourceid){
console.log(msg);
}
function cbFinishLoad(webContents){
if(!bHistory) return;
let histItem = webContents.getTitle()+" "+webContents.getURL()+"\n";
fs.appendFile(historyFile, histItem, (err) => {});
}
function cbFocus(webContents){
let js = "if(focusMesg){let m=focusMesg;focusMesg=null;m}";
win.webContents.executeJavaScript(js,false).then((r)=>{
@ -393,7 +373,7 @@ function topMenu(){
win.webContents.executeJavaScript(js,false)
}},
{ label: 'getURL', accelerator: 'Ctrl+G', click: ()=>{
let js="{let q=document.forms[0].q;q.focus();q.value=tabs.children[iTab].src}"
let js="{let q=document.forms[0].q;q.focus();q.value=tabs.children[iTab].getURL()}"
win.webContents.executeJavaScript(js,false)
}},
{ label: 'Select', accelerator: 'Ctrl+L', click:()=>{
@ -457,7 +437,7 @@ if(e)e.blur();try{tabs.children[iTab].stopFindInPage('clearSelection')}catch(er)
win.webContents.executeJavaScript(js,false);
}},
{ label: 'Reload', accelerator: 'F5', click: ()=>{
win.webContents.executeJavaScript("tabs.children[iTab].reload()",false);
win.webContents.executeJavaScript("tabs.children[iTab].reloadIgnoringCache()",false);
}},
{ label: 'Devtools', accelerator: 'F12', click: ()=>{
let js = "try{tabs.children[iTab].openDevTools()}catch(e){console.log(e)}";
@ -612,17 +592,7 @@ async function writeFile(filename, str){
function help(){
const readme = "README.md";
const htmlFN = path.join(__dirname,readme+".html");
if(!fs.existsSync(htmlFN)){
const readmeP = path.join(__dirname,readme);
try {
fs.copyFileSync(readmeP, htmlFN);
const postscript ="<script src='https://cdn.jsdelivr.net/npm/marked@12.0.2/marked.min.js'></script><script>var d=document;var b=d.body;var t=b.textContent;t=t.slice(0,t.length-253);b.innerHTML=marked.parse(t);d.title=d.title||b.firstElementChild.innerText.trim();</script>";
fs.appendFileSync(htmlFN,postscript);
}catch(e){
htmlFN = readmeP;
}
}
let js=`tabs.children[iTab].src="file://${htmlFN}"`;
const htmlFN = path.join(__dirname,readme);
let js=`{let t=tabs.children[iTab];t.dataset.jsonce=BML_md;t.src="file://${htmlFN}"}`;
win.webContents.executeJavaScript(js,false)
}