mirror of
https://github.com/torappinfo/uweb.git
synced 2024-08-14 23:54:59 +00:00
adaptable ebrowser links
This commit is contained in:
parent
8eb8e9e41f
commit
7eccedfecc
19 changed files with 1066 additions and 32 deletions
337
misc/ebrowser/index.html
Normal file
337
misc/ebrowser/index.html
Normal file
|
@ -0,0 +1,337 @@
|
|||
<!DOCTYPE html><html><head><meta charset="UTF-8">
|
||||
<style>
|
||||
html{
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
body{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
}
|
||||
div.webviews{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-grow:1;
|
||||
}
|
||||
webview{display: none;width:100%;height:100%}
|
||||
.curWV{display: inherit !important;}
|
||||
</style>
|
||||
<script>
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const readline = require('readline');
|
||||
var iTab = 0;
|
||||
var tabs;
|
||||
var engines = {};
|
||||
var mapKeys = {};
|
||||
var defaultSE = "https://www.bing.com/search?q=";
|
||||
let lastKeys;
|
||||
let lastKeys_millis = 0;
|
||||
|
||||
fs.readFile(path.join(__dirname,'search.json'), 'utf8', (err, jsonString) => {
|
||||
if (err) return;
|
||||
initSearchEngines(jsonString,false);
|
||||
});
|
||||
fs.readFile(path.join(__dirname,'mapkeys.json'), 'utf8', (err, jsonStr) => {
|
||||
if (err) return;
|
||||
try {
|
||||
mapKeys = JSON.parse(jsonStr);
|
||||
}catch(e){}
|
||||
});
|
||||
appendAutoc_rec(path.join(__dirname,'default.autoc'),null);
|
||||
appendAutoc_rec(path.join(__dirname,'bookmark.rec'),' ');
|
||||
|
||||
function initSearchEngines(jsonStr){
|
||||
try{
|
||||
let val1st;
|
||||
engines=JSON.parse(jsonStr, (key, value)=>{
|
||||
if(!val1st && !(/^\d+$/u.test(key))) val1st=value;
|
||||
return value;
|
||||
});
|
||||
if(val1st) defaultSE=val1st;
|
||||
}catch(e){}
|
||||
}
|
||||
function save(filePath, u8array){
|
||||
//alert(Object.prototype.toString.call(u8array))
|
||||
fs.writeFile (filePath, u8array, (err) => {
|
||||
if (err) {
|
||||
console.error (err);
|
||||
return;
|
||||
}
|
||||
});
|
||||
}
|
||||
function print2PDF(filePath, options){
|
||||
tabs.children[iTab].printToPDF(options)
|
||||
.then(u8array=>save(filePath,u8array));
|
||||
}
|
||||
function bookmark(args){//b [filenamestem] url title :bookmark
|
||||
let bmFileName = "bookmark.rec";
|
||||
let tab = tabs.children[iTab];
|
||||
let url = tab.getURL();
|
||||
if(args.length>1)
|
||||
bmFileName = args[1]+".rec";
|
||||
let title = tab.getTitle();
|
||||
let line = title + " " + url + "\n";
|
||||
fs.appendFile(path.join(__dirname,bmFileName), line, (err)=>{});
|
||||
}
|
||||
function switchTab(i){
|
||||
let tab = tabs.children[iTab];
|
||||
if(document.activeElement == tab) tab.blur();
|
||||
tab.classList.remove('curWV');
|
||||
iTab = i;
|
||||
tabs.children[iTab].classList.add('curWV');
|
||||
}
|
||||
function newTab(){
|
||||
var tab = document.createElement('webview');
|
||||
tab.allowpopups = true;
|
||||
tabs.appendChild(tab);
|
||||
}
|
||||
function tabInc(num){
|
||||
let nTabs = tabs.children.length;
|
||||
if(nTabs<2) return;
|
||||
let i = iTab +num;
|
||||
if(i>=nTabs) i=0;
|
||||
switchTab(i);
|
||||
}
|
||||
function tabDec(num){
|
||||
let nTabs = tabs.children.length;
|
||||
if(nTabs<2) return;
|
||||
let i = iTab +num;
|
||||
if(i<0) i=nTabs-1;
|
||||
switchTab(i);
|
||||
}
|
||||
function tabClose(){
|
||||
let nTabs = tabs.children.length;
|
||||
if(nTabs<2) return "";//no remain tab
|
||||
let tab = tabs.children[iTab];
|
||||
if(document.activeElement == tab) tab.blur();
|
||||
tabs.removeChild(tab);
|
||||
nTabs--;
|
||||
if(iTab>=nTabs) iTab=iTab-1;
|
||||
tabs.children[iTab].classList.add('curWV');
|
||||
return getWinTitle();
|
||||
}
|
||||
function getWinTitle(){
|
||||
let t=tabs.children[iTab];
|
||||
let title = (iTab+1) + '/' + tabs.children.length;
|
||||
try{title=title+' '+t.getTitle()+' '+t.getURL()}catch(e){}
|
||||
return title
|
||||
}
|
||||
async function appendAutoc_rec(filename, delimit){
|
||||
try{
|
||||
const readInterface = readline.createInterface ({
|
||||
input: fs.createReadStream (filename, 'utf8'),
|
||||
});
|
||||
|
||||
for await (const line of readInterface) {
|
||||
let opt = document.createElement('option');
|
||||
let iS;
|
||||
if(delimit && (iS=line.lastIndexOf(delimit))>0){
|
||||
opt.value = line.substring(iS+delimit.length);
|
||||
opt.textContent = line.substring(0,iS);
|
||||
}else
|
||||
opt.value = line;
|
||||
document.forms[0].children[0].appendChild(opt);
|
||||
}
|
||||
}catch(e){return;}
|
||||
}
|
||||
function keyPress(e){
|
||||
var inputE = document.forms[0].q;
|
||||
if (e.altKey||e.metaKey)
|
||||
return;
|
||||
var key = e.key;
|
||||
if(e.ctrlKey){
|
||||
switch(key){
|
||||
case "Home":
|
||||
tabs.children[iTab].src = "javascript:window.scrollTo(0,0)";
|
||||
return;
|
||||
case "End":
|
||||
tabs.children[iTab].src="javascript:window.scrollTo(0,document.body.scrollHeight)"
|
||||
return;
|
||||
|
||||
}
|
||||
return;
|
||||
}
|
||||
switch(key){
|
||||
case "PageDown":
|
||||
tabs.children[iTab].src =
|
||||
"javascript:window.scrollBy(0,3*document.documentElement.clientHeight/4)";
|
||||
return;
|
||||
case "PageUp":
|
||||
tabs.children[iTab].src = "javascript:window.scrollBy(0,-3*document.documentElement.clientHeight/4)";
|
||||
return;
|
||||
case "ArrowDown":
|
||||
tabs.children[iTab].src="javascript:window.scrollBy(0,32)";
|
||||
return;
|
||||
case "ArrowUp":
|
||||
tabs.children[iTab].src="javascript:window.scrollBy(0,-32)";
|
||||
return;
|
||||
|
||||
}
|
||||
if(inputE === document.activeElement) return;
|
||||
if(1!=key.length) return;
|
||||
var curMillis = Date.now();
|
||||
if(curMillis-lastKeys_millis>500)
|
||||
lastKeys = null;
|
||||
lastKeys_millis = curMillis;
|
||||
|
||||
switch (key) {
|
||||
case "!":
|
||||
inputE.value = ":";
|
||||
inputE.focus();
|
||||
lastKeys = null;
|
||||
return;
|
||||
case "/":
|
||||
case ":":
|
||||
inputE.value = "";
|
||||
inputE.focus();
|
||||
lastKeys = null;
|
||||
return;
|
||||
}
|
||||
if(!lastKeys) {
|
||||
lastKeys = key;
|
||||
return;
|
||||
}
|
||||
lastKeys = lastKeys + key;
|
||||
let cmds = mapKeys[lastKeys];
|
||||
if(cmds){
|
||||
lastKeys = null;
|
||||
for(var cmd of cmds.split("\n"))
|
||||
handleQuery(cmd);
|
||||
}
|
||||
}
|
||||
function getQ(){return document.forms[0].q.value;}
|
||||
function bang(query, iSpace){
|
||||
if(iSpace>0){
|
||||
let name = query.slice(0,iSpace);
|
||||
let engine = engines[name];
|
||||
if(engine)
|
||||
return engine+query.substring(iSpace+1);
|
||||
}
|
||||
return defaultSE+query;
|
||||
}
|
||||
function coloncommand(q){
|
||||
document.title = q;
|
||||
}
|
||||
function coloncommand_render(cmd){
|
||||
args = cmd.substring(1).split(/\s+/);
|
||||
switch(args[0]){
|
||||
case "autoc":
|
||||
autoc(args);
|
||||
return;
|
||||
case "b":
|
||||
bookmark(args);
|
||||
return;
|
||||
case "bml":
|
||||
bml(args);
|
||||
return;
|
||||
case "pdf":
|
||||
savePdf(args);
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
function autoc(args){
|
||||
if(2!=args.length) return;
|
||||
appendAutoc_rec(path.join(__dirname,args[1]+".rec"),' ');
|
||||
}
|
||||
function bml(args){
|
||||
if(2!=args.length) return;
|
||||
let filename = args[1]+".js";
|
||||
fs.readFile(path.join(__dirname,filename), 'utf8', (err,str) => {
|
||||
if (err) return;
|
||||
tabs.children[iTab].executeJavaScript(str,false);
|
||||
});
|
||||
}
|
||||
function savePdf(args){
|
||||
let filename = "ebrowser.pdf";
|
||||
let options = {};
|
||||
if(1<args.length){
|
||||
let c0 = args[1].charCodeAt(0);
|
||||
let i = 1;
|
||||
if(123!=c0){//not '{' options then it is filename
|
||||
filename = args[1] + ".pdf";
|
||||
i = 2;
|
||||
}
|
||||
if(i==args.length-1){//:Pdf [filename] {...}
|
||||
if(2==args[i].length){// '{}'
|
||||
let width = document.body.clientWidth/96;
|
||||
tabs.children[iTab].executeJavaScript("document.documentElement.scrollHeight",
|
||||
false).then((h)=>{
|
||||
let opts = {
|
||||
printBackground:true,
|
||||
pageSize:{width:width,height:h/96}};
|
||||
print2PDF(filename,opts);
|
||||
});
|
||||
return;
|
||||
}else{
|
||||
try {
|
||||
options = JSON.parse(args[i]);
|
||||
}catch(e){};
|
||||
}
|
||||
}
|
||||
}
|
||||
print2PDF(filename,options);
|
||||
}
|
||||
|
||||
function handleQuery(q){
|
||||
if(q.length>1){
|
||||
let c0=q.charCodeAt(0);
|
||||
switch(c0){
|
||||
case 47://"/"
|
||||
tabs.children[iTab].findInPage(q.substring(1));
|
||||
return;
|
||||
case 58://':'
|
||||
let c1=q.charCodeAt(1);
|
||||
if(c1>98 && 112!=c1)
|
||||
coloncommand(q);
|
||||
else
|
||||
coloncommand_render(q);
|
||||
return;
|
||||
}
|
||||
}
|
||||
var url=q;
|
||||
do {
|
||||
if(q.length>7){
|
||||
let c6 = q.charCodeAt(6);
|
||||
if(47==c6){// '/'
|
||||
let c5 = q.charCodeAt(5);
|
||||
if(47==c5 && 58==q.charCodeAt(4))//http/file urls
|
||||
break;
|
||||
if(58==c5 && 47==q.charCodeAt(7))//https://
|
||||
break;
|
||||
}else if(q.startsWith("javascript:")){
|
||||
tabs.children[iTab].executeJavaScript(q.substring(11),false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
let iS = q.indexOf(' ');
|
||||
if(iS<0){
|
||||
if(q.length>5){
|
||||
if(58==q.charCodeAt(5))
|
||||
break;
|
||||
}
|
||||
if(q.indexOf('.')>0){
|
||||
url = 'https://'+q;
|
||||
break;
|
||||
}
|
||||
}
|
||||
url = bang(q, iS);
|
||||
}while(false);
|
||||
tabs.children[iTab].src=url;
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<form action="javascript:handleQuery(getQ())">
|
||||
<datalist id="autoc"></datalist>
|
||||
<input type="text" list="autoc" name=q style="width:100%" autofocus></form>
|
||||
<div class="webviews">
|
||||
<webview class="curWV" allowpopups></webview>
|
||||
</div>
|
||||
<script>
|
||||
tabs = document.body.children[1];
|
||||
document.addEventListener('keydown', keyPress);
|
||||
</script>
|
||||
</body></html>
|
419
misc/ebrowser/webview.js
Normal file
419
misc/ebrowser/webview.js
Normal file
|
@ -0,0 +1,419 @@
|
|||
const {
|
||||
app, BrowserWindow, Menu, shell, clipboard,
|
||||
session, protocol, net} = require('electron')
|
||||
let win;
|
||||
|
||||
if(!app.requestSingleInstanceLock())
|
||||
app.quit()
|
||||
else {
|
||||
app.on('ready', createWindow);
|
||||
app.on('second-instance', (event, args, cwd) => {
|
||||
// 当已经有运行的实例时,我们激活窗口而不是创建新的窗口
|
||||
if (win) {
|
||||
if (win.isMinimized()) {
|
||||
win.restore()
|
||||
}
|
||||
win.show()
|
||||
win.focus()
|
||||
cmdlineProcess(args,cwd,1);
|
||||
}else
|
||||
createWindow();
|
||||
})
|
||||
}
|
||||
topMenu();
|
||||
|
||||
const fs = require('fs');
|
||||
const readline = require('readline');
|
||||
const path = require('path')
|
||||
const process = require('process')
|
||||
var gredirects = [];
|
||||
var gredirect;
|
||||
var redirects;
|
||||
var bRedirect = true;
|
||||
var bJS = true;
|
||||
var bHistory = false;
|
||||
var proxies = {};
|
||||
var proxy;
|
||||
var useragents = {};
|
||||
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;
|
||||
try {
|
||||
redirects = JSON.parse(jsonString);
|
||||
} catch (e){}
|
||||
});
|
||||
|
||||
async function createWindow () {
|
||||
let json = await fs.promises.readFile(path.join(__dirname,'uas.json'), 'utf8');
|
||||
try {
|
||||
useragents = JSON.parse(json);
|
||||
} catch (e){}
|
||||
|
||||
await (async ()=>{
|
||||
try{
|
||||
const readInterface = readline.createInterface ({
|
||||
input: fs.createReadStream (path.join(__dirname,'config'), 'utf8'),
|
||||
});
|
||||
|
||||
for await (const line of readInterface) {
|
||||
addrCommand(line);
|
||||
}
|
||||
}catch(e){return;}
|
||||
})();
|
||||
|
||||
win = new BrowserWindow(
|
||||
{width: 800, height: 600,autoHideMenuBar: true,
|
||||
webPreferences: {
|
||||
nodeIntegration: true,
|
||||
contextIsolation: false,
|
||||
webviewTag: true,
|
||||
}});
|
||||
win.setMenuBarVisibility(false);
|
||||
win.on('closed', function () {
|
||||
win = null
|
||||
})
|
||||
|
||||
win.loadFile('index.html');
|
||||
fs.readFile(path.join(__dirname,'gredirect.json'), 'utf8', (err, jsonString) => {
|
||||
if (err) return;
|
||||
try {
|
||||
gredirects = JSON.parse(jsonString);
|
||||
} catch (e){}
|
||||
});
|
||||
|
||||
fs.readFile(path.join(__dirname,'proxy.json'), 'utf8', (err, jsonString) => {
|
||||
if (err) return;
|
||||
try {
|
||||
proxies = JSON.parse(jsonString, (key,val)=>{
|
||||
if(!proxy && key==="proxyRules"){
|
||||
proxy = {proxyRules:val};
|
||||
}
|
||||
return val;
|
||||
});
|
||||
} catch (e){}
|
||||
});
|
||||
|
||||
cmdlineProcess(process.argv, process.cwd(), 0);
|
||||
//app.commandLine.appendSwitch ('trace-warnings');
|
||||
|
||||
win.webContents.on('page-title-updated',(event,cmd)=>{
|
||||
addrCommand(cmd);
|
||||
});
|
||||
|
||||
win.webContents.on('console-message',cbConsoleMsg);
|
||||
//protocol.handle("https",cbScheme_https);
|
||||
}
|
||||
|
||||
app.on('window-all-closed', function () {
|
||||
app.quit()
|
||||
})
|
||||
|
||||
app.on('activate', function () {
|
||||
if (win === null) {
|
||||
createWindow()
|
||||
}
|
||||
})
|
||||
|
||||
app.on('will-quit', () => {
|
||||
})
|
||||
|
||||
app.on ('web-contents-created', (event, contents) => {
|
||||
if (contents.getType () === 'webview') {
|
||||
contents.setWindowOpenHandler(cbWindowOpenHandler);
|
||||
contents.on('context-menu',onContextMenu);
|
||||
contents.on('page-title-updated',cbTitleUpdate);
|
||||
//contents.on('console-message',cbConsoleMsg);
|
||||
//contents.on('focus', ()=>{cbFocus(contents)});
|
||||
//contents.on('blur',()=>{cbBlur()});
|
||||
contents.session.webRequest.onBeforeRequest(interceptRequest);
|
||||
contents.on('did-finish-load',()=>{cbFinishLoad(contents)});
|
||||
}
|
||||
});
|
||||
|
||||
function addrCommand(cmd){
|
||||
if(cmd.length<3) return;
|
||||
let c0 = cmd.charCodeAt(0);
|
||||
switch(c0){
|
||||
case 58: //':'
|
||||
args = cmd.substring(1).split(/\s+/);
|
||||
switch(args[0]){
|
||||
case "cert":
|
||||
if(args.length==1)
|
||||
session.defaultSession.setCertificateVerifyProc((request, callback) => {
|
||||
callback(0);
|
||||
});
|
||||
else
|
||||
session.defaultSession.setCertificateVerifyProc(null);
|
||||
return;
|
||||
case "clear":
|
||||
if(args.length==1){
|
||||
return;
|
||||
}
|
||||
switch(args[1]){
|
||||
case "cache":
|
||||
session.defaultSession.clearCache();
|
||||
return;
|
||||
case "dns":
|
||||
session.defaultSession.clearHostResolverCache();
|
||||
return;
|
||||
case "storage":
|
||||
session.defaultSession.clearStorageData();
|
||||
return;
|
||||
}
|
||||
return;
|
||||
case "ext":
|
||||
session.defaultSession.loadExtension(args[1]);
|
||||
return;
|
||||
case "nh":
|
||||
bHistory = false; return;
|
||||
case "uh":
|
||||
bHistory = true; return;
|
||||
case "nj":
|
||||
bJS = false; return;
|
||||
case "uj":
|
||||
bJS = true; return;
|
||||
case "np":
|
||||
session.defaultSession.setProxy ({mode:"direct"});
|
||||
return;
|
||||
case "up":
|
||||
if(args.length>1)
|
||||
proxy = proxies[args[1]]; //retrieve proxy
|
||||
if(proxy)
|
||||
session.defaultSession.setProxy(proxy);
|
||||
bRedirect = false;
|
||||
return;
|
||||
case "nr":
|
||||
bRedirect = false; return;
|
||||
case "ur":
|
||||
bRedirect = true; return;
|
||||
case "ua":
|
||||
if(args.length==2)
|
||||
session.defaultSession.setUserAgent(useragents[args[1]]);
|
||||
else
|
||||
session.defaultSession.setUserAgent(defaultUA);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function cbConsoleMsg(e, level, msg, line, sourceid){
|
||||
console.log(line);
|
||||
console.log(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)=>{
|
||||
//focusMesg as js code
|
||||
console.log(r);
|
||||
if(r) webContents.executeJavaScript(r,false);
|
||||
});
|
||||
}
|
||||
|
||||
function interceptRequest(details, callback){
|
||||
if(!bJS && details.url.endsWith(".js")){
|
||||
callback({ cancel: true });
|
||||
return;
|
||||
}
|
||||
do {
|
||||
if(gredirect){
|
||||
if(!details.url.startsWith("http")) break;
|
||||
if(!details.url.startsWith(gredirect)){
|
||||
if(details.resourceType === 'mainFrame'){
|
||||
let wc = details.webContents;
|
||||
let url = details.url;
|
||||
if(wc){
|
||||
let nUrl = gredirect+url;
|
||||
fetch(nUrl).then(res=>{
|
||||
if(res.ok) return res.arrayBuffer();
|
||||
throw new Error(`Err: ${res.status} - ${res.statusText}`);
|
||||
}).then(aBuf=>{
|
||||
const u8 = new Uint8Array(aBuf);
|
||||
const b64 = Buffer.from (u8).toString('base64');
|
||||
const dataUrl = `data:text/html;base64,${b64}`;
|
||||
wc.loadURL(dataUrl,{baseURLForDataURL:url});
|
||||
}).catch(e=>{
|
||||
console.log(nUrl+" err:",e);
|
||||
});
|
||||
callback({ cancel: true });
|
||||
return;
|
||||
}
|
||||
}
|
||||
let newUrl = gredirect + details.url;
|
||||
callback({ cancel: false, redirectURL: newUrl });
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if(!bRedirect ||(details.resourceType !== 'mainFrame' &&
|
||||
details.resourceType !== 'subFrame')) break;
|
||||
let oURL = new URL(details.url);
|
||||
let domain = oURL.hostname;
|
||||
let newUrl;
|
||||
try{
|
||||
let newDomain = redirects[domain];
|
||||
if(!newDomain) break;
|
||||
newUrl = "https://"+newDomain+oURL.pathname+oURL.search+oURL.hash;
|
||||
}catch(e){break;}
|
||||
callback({ cancel: false, redirectURL: newUrl });
|
||||
return;
|
||||
}while(false);
|
||||
callback({ cancel: false });
|
||||
}
|
||||
|
||||
function cbWindowOpenHandler(details){
|
||||
let url = details.url;
|
||||
let js = "newTab();tabs.children[tabs.children.length-1].src='"+
|
||||
url+"';";
|
||||
switch(details.disposition){
|
||||
case "foreground-tab":
|
||||
case "new-window":
|
||||
js = js + "switchTab(tabs.children.length-1)";
|
||||
}
|
||||
win.webContents.executeJavaScript(js,false);
|
||||
return { action: "deny" };
|
||||
}
|
||||
function cbTitleUpdate(event,title){
|
||||
win.setTitle(title);
|
||||
}
|
||||
function menuArray(labelprefix, linkUrl){
|
||||
const menuTemplate = [
|
||||
{
|
||||
label: labelprefix+'Open Link',
|
||||
click: () => {
|
||||
shell.openExternal(linkUrl);
|
||||
}
|
||||
},
|
||||
{
|
||||
label: labelprefix+'Copy Link',
|
||||
click: () => {
|
||||
clipboard.writeText(linkUrl);
|
||||
}
|
||||
},
|
||||
{
|
||||
label: labelprefix+'Download',
|
||||
click: () => {
|
||||
win.contentView.children[i].webContents.downloadURL(linkUrl);
|
||||
}
|
||||
},
|
||||
];
|
||||
return menuTemplate;
|
||||
}
|
||||
|
||||
function onContextMenu(event, params){
|
||||
let url = params.linkURL;
|
||||
let mTemplate = [];
|
||||
if (url) {
|
||||
mTemplate.push({label:url,enabled:false});
|
||||
mTemplate.push.apply(mTemplate,menuArray("",url));
|
||||
if((url=params.srcURL))
|
||||
mTemplate.push.apply(mTemplate,menuArray("src: ",url));
|
||||
}else if((url=params.srcURL)){
|
||||
mTemplate.push({label:url,enabled:false});
|
||||
mTemplate.push.apply(mTemplate,menuArray("src: ",url));
|
||||
}else
|
||||
return;
|
||||
|
||||
const contextMenu = Menu.buildFromTemplate(mTemplate);
|
||||
contextMenu.popup();
|
||||
}
|
||||
|
||||
function topMenu(){
|
||||
const menuTemplate = [
|
||||
{
|
||||
label: '',
|
||||
submenu: [
|
||||
{ label: '', accelerator: 'Ctrl+G', click: ()=>{
|
||||
let js="{let q=document.forms[0].q;q.focus();q.value=tabs.children[iTab].src}"
|
||||
win.webContents.executeJavaScript(js,false)
|
||||
}},
|
||||
{ label: '', accelerator: 'Ctrl+L', click:()=>{
|
||||
win.webContents.executeJavaScript("document.forms[0].q.select()",false);
|
||||
}},
|
||||
{ label: '', accelerator: 'Ctrl+T', click:()=>{
|
||||
let js = "newTab();document.forms[0].q.select();switchTab(tabs.children.length-1)";
|
||||
win.webContents.executeJavaScript(js,false);
|
||||
}},
|
||||
{ label: '', accelerator: 'Ctrl+R', click: ()=>{
|
||||
gredirect=null;
|
||||
}},
|
||||
{ label: '', accelerator: 'Ctrl+Shift+R', click: ()=>{
|
||||
if(0==gredirects.length) return;
|
||||
gredirect=gredirects[0];
|
||||
}},
|
||||
{ label: '', accelerator: 'Ctrl+W', click: ()=>{
|
||||
win.webContents.executeJavaScript("tabClose()",false).then((r)=>{
|
||||
if(""===r) win.close();
|
||||
else win.setTitle(r);
|
||||
});
|
||||
}},
|
||||
{ label: '', accelerator: 'Ctrl+Tab', click: ()=>{
|
||||
let js="tabInc(1);getWinTitle()";
|
||||
win.webContents.executeJavaScript(js,false).then((r)=>{
|
||||
win.setTitle(r);
|
||||
});
|
||||
}},
|
||||
{ label: '', accelerator: 'Ctrl+Shift+Tab', click: ()=>{
|
||||
let js="tabDec(-1);getWinTitle()";
|
||||
win.webContents.executeJavaScript(js,false).then((r)=>{
|
||||
win.setTitle(r);
|
||||
});
|
||||
}},
|
||||
{ label: '', accelerator: 'Ctrl+Left', click: ()=>{
|
||||
let js="tabs.children[iTab].goBack()";
|
||||
win.webContents.executeJavaScript(js,false);
|
||||
}},
|
||||
{ label: '', accelerator: 'Ctrl+Right', click: ()=>{
|
||||
let js="tabs.children[iTab].goForward()";
|
||||
win.webContents.executeJavaScript(js,false);
|
||||
}},
|
||||
{ label: '', accelerator: 'Esc', click: ()=>{
|
||||
let js = `{let e=document.activeElement;
|
||||
if(e)e.blur();try{tabs.children[iTab].stopFindInPage('clearSelection')}catch(er){}}`;
|
||||
win.webContents.executeJavaScript(js,false);
|
||||
}},
|
||||
{ label: '', accelerator: 'F5', click: ()=>{
|
||||
win.webContents.executeJavaScript("tabs.children[iTab].reload()",false);
|
||||
}},
|
||||
{ label: '', accelerator: 'F12', click: ()=>{
|
||||
let js = "try{tabs.children[iTab].openDevTools()}catch(e){console.log(e)}";
|
||||
win.webContents.executeJavaScript(js,false);
|
||||
}},
|
||||
|
||||
],
|
||||
},
|
||||
];
|
||||
const menu = Menu.buildFromTemplate(menuTemplate);
|
||||
Menu.setApplicationMenu(menu);
|
||||
}
|
||||
|
||||
function cmdlineProcess(argv,cwd,extra){
|
||||
let i1st = 2+extra; //index for the first query item
|
||||
if(argv.length>i1st){
|
||||
if(i1st+1==argv.length){//local file
|
||||
let fname = path.join(cwd, argv[i1st]);
|
||||
if(fs.existsSync(fname)){
|
||||
let js = "tabs.children[iTab].src='file://"+fname+"'";
|
||||
win.webContents.executeJavaScript(js,false);
|
||||
win.setTitle(argv[i1st]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
let url=argv.slice(i1st).join(" ");
|
||||
win.webContents.executeJavaScript("handleQuery(`"+url+"`)",false);
|
||||
win.setTitle(url);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue