diff --git a/src/ajax.js b/src/ajax.js
index 1c9c5b7..5fb8884 100644
--- a/src/ajax.js
+++ b/src/ajax.js
@@ -1,106 +1,109 @@
-const ajax = _ajax_ ;
-const keyword = _keyword_ ;
-const before_start = 100;
-var slow = 10;
-async function sleep(ms) {
- return new Promise(resolve => setTimeout(resolve, ms));
-}
-async function start_go()
+async function ajax_execute(ajax, keyword)
{
- if ( typeof(ajax) === "string" )
- await doInput(ajax, true);
- else if ( Array.isArray(ajax) )
+ console.debug("ajax_execute()");
+ const before_start = 100;
+ var slow = 10;
+ async function sleep(ms) {
+ return new Promise(resolve => setTimeout(resolve, ms));
+ }
+
+ async function start_go()
{
- for (var i=0; i
=3)
+ {
+ chrome.contextMenus.onClicked.addListener( function (info) {
+ if (info.menuItemId === "menu_search_selected" )
+ {
+ console.debug("mv3 contextmenu onclick", info);
+ setStor("input_content", info.selectionText); // NOTE TODO Chrome mv3 no localStorage
+ try { chrome.browserAction.openPopup() ; } catch(err) {}
+ }
+ } );
+ }
chrome.contextMenus.create( selection_menu_creation );
@@ -78,25 +92,59 @@ async function set_contextmenu() {
//--------------------
-chrome.commands.onCommand.addListener(async function (command) {
+chrome.commands.onCommand.addListener( function (command, tab) { // 'tab' is only in mv3
if (command == "selection_as_search") {
- chrome.permissions.request({
- permissions: ["activeTab"]
- });
-
- chrome.tabs.executeScript({
- code: '(' + getSelectionText.toString() + ')()',
- allFrames: false,
- matchAboutBlank: true
- }, function (results) {
- //console.log(results[0]);
- if (typeof(results[0]) === "string")
- setStor("input_content", results[0]);
- //chrome.browserAction.openPopup() ;
- });
+ console.debug("onCommand selection_as_search");
+
+ chrome.permissions.request({ permissions: ["activeTab"] });
+
+ if (mv >= 3)
+ {
+ chrome.permissions.request({ permissions: ["scripting"] });
+
+ chrome.scripting.executeScript( {
+ func: getSelectionText,
+ target: { allFrames: false, tabId: tab.id },
+ } , callback__selection_as_search );
+ }
+ else
+ {
+ chrome.tabs.executeScript({
+ code: '(' + getSelectionText.toString() + ')()',
+ allFrames: false,
+ matchAboutBlank: true
+ }, callback__selection_as_search );
+ }
}
+
});
+function callback__selection_as_search (results)
+{
+ console.log(results);
+
+ var selected_text;
+
+ if (mv >= 3)
+ {
+ if (results[0])
+ selected_text = results[0].result ;
+ }
+ else
+ selected_text = results[0];
+
+ if (typeof(selected_text) !== "string")
+ selected_text = null;
+
+ if (selected_text)
+ {
+ if (mv==2)
+ setStor("input_content", results[0]); // localStorage is not usable in mv3 service worker. Usable in mv2 background
+ // TODO
+// if (isFirefox)
+// browser.browserAction.openPopup() ; // won't allow here
+ }
+}
function getSelectionText() {
var activeEl = document;
@@ -122,267 +170,12 @@ function getSelectionText() {
} else if (docNode.getSelection) {
text = docNode.getSelection().toString();
}
- return text;
-}
-
-//-------
-
-async function set_checkupdate() {
- if ( (await get_addon_setting("checkupdate")) !== true
- && ! (
- (await get_addon_setting("checkupdate")) === undefined
- && ( isFromStore(".microsoft.com") || isFromStore(".opera.com") )
- )
- )
- return;
-
- parseGotNewsXml();
-
- // for real
- setTimeout( checkNews, 20*60*1000 );
- setInterval( checkNews , 10*60*60*1000 );
-
- // for test
- //setTimeout( checkNews, 6*1000 );
- //setInterval( checkNews , 30*1000 );
-
-}
-
-async function checkNews() {
-
- const news_urls = [
- "https://update.versioncheck.workers.dev/news",
- "https://acsearch.cf/appnews.php",
- "https://www.acsearch.ml/news.xml",
- "https://garywill.gitlab.io/releaseapps-dl/news.xml",
- `https://api.allorigins.win/raw?url=${encodeURIComponent('https://gitlab.com/garywill/releaseapps-dl/-/raw/main/news.xml')}`,
- "https://jsonp.afeld.me/?url=https://gitlab.com/garywill/releaseapps-dl/-/raw/main/news.xml",
- ];
-
- var url_use_sub = getRandomInt( news_urls.length );
- var news_url = news_urls [ url_use_sub ];
+// console.debug(localStorage);
+// if (text)
+// localStorage.setItem("input_content", text); // 'localStorage' in Content Script is the web page's localStorage
- //var news_url = "http://192.168.3.19:12000/appnews.php";
- //console.log("downloading", news_url);
- await fetch(news_url).then(response => response.text()).then(textString => {
- var xml = textString;
-
- try{
- const parser = new DOMParser();
- var xmlDoc = parser.parseFromString(xml, "text/xml");
-
- var xmlBigsearch = xmlDoc.querySelector("news[app=bigsearch-addon]");
-
- const serializer = new XMLSerializer();
- var serXmlStr = serializer.serializeToString(xmlBigsearch) ;
-
- setStor("latest_news_xml",serXmlStr)
- parseGotNewsXml();
- }catch(err) {
- console.warn("Error on parsing downloaded latest news");
- console.warn(err);
-
- clearShowingNews(true);
- }
- }) .catch(err => {
- console.warn("Error on fetching latest news");
- console.warn(err);
-
- clearShowingNews(true);
- });
-}
-
-// called when
-// 1. after successfully getting news
-// 2. on addon loaded (possibly updated)
-async function parseGotNewsXml()
-{
- clearShowingNews(false);
-
- const xml = getStor("latest_news_xml");
-
- if (!xml)
- return;
-
- const parser = new DOMParser();
- var newsDoc;
- newsDoc = parser.parseFromString(xml, "text/xml");
-
-
- var filters = newsDoc.documentElement.querySelectorAll("filter") ;
- for (var i=0; i 0 )
- continue;
- }
- }
-
- if ( filters[i].getAttribute("browsertype") == "chromium" )
- {
- if ( ! isChrome )
- continue;
- }
- else if ( filters[i].getAttribute("browsertype") == "firefox" )
- {
- if ( ! isFirefox )
- continue;
- }
- else if ( filters[i].getAttribute("browsertype") == "chrome-store" )
- {
- if ( ! isFromStore(".google.com") )
- continue;
- }
- else if ( filters[i].getAttribute("browsertype") == "edge-store" )
- {
- if ( ! isFromStore(".microsoft.com") )
- continue;
- }
- else if ( filters[i].getAttribute("browsertype") == "opera-store" )
- {
- if ( ! isFromStore(".opera.com") )
- continue;
- }
-
- if ( filters[i].getAttribute("installtype") == "hosted" )
- {
- if ( ( await ifNotStore() ) !== true )
- continue;
- }
-
-
- parse_news(filters[i]);
-
- break;
- }
-
- async function parse_news( news_filter_tag )
- {
- //console.log("passed filter");
- //console.log(news_filter_tag.outerHTML);
-
- if ( news_filter_tag.querySelector("switch") &&
- news_filter_tag.querySelector("switch").getAttribute("show") == "false"
- )
- {
- clearShowingNews(false);
- return;
- }
-
- const lang = (await get_addon_setting("hl")) ;
- var text = "";
- if ( ! lang ) // language not set. use default language
- {
- text = news_filter_tag.querySelector(`lang[lang=en]`).getAttribute("text") ;
- }else {
- if ( news_filter_tag.querySelector(`lang[lang=${lang}]`) )
- text = news_filter_tag.querySelector(`lang[lang=${lang}]`).getAttribute("text") ;
- else
- text = news_filter_tag.querySelector(`lang[lang=en]`).getAttribute("text") ;
- }
-
- if ( text )
- {
- setStor("news_text", text);
-
- if ( news_filter_tag.querySelector("link") &&
- news_filter_tag.querySelector("link").getAttribute("link")
- )
- setStor("news_link", news_filter_tag.querySelector("link").getAttribute("link") );
- }
-
- //console.log( getStor('news_text') );
- //console.log( getStor('news_link') );
-
- }
-
- // https://stackoverflow.com/a/53387532/10617713
- // Function returns:
- // 0 : a = b
- // 1 : a > b
- // -1 : a < b
- function compareVer(a, b)
- {
- function prep(t)
- {
- return ("" + t)
- //treat non-numerical characters as lower version
- //replacing them with a negative number based on charcode of first character
- .replace(/[^0-9\.]+/g, function(c){return "." + ((c = c.replace(/[\W_]+/, "")) ? c.toLowerCase().charCodeAt(0) - 65536 : "") + "."})
- //remove trailing "." and "0" if followed by non-numerical characters (1.0.0b);
- .replace(/(?:\.0+)*(\.-[0-9]+)(\.[0-9]+)?\.*$/g, "$1$2")
- .split('.');
- }
- a = prep(a);
- b = prep(b);
- for (var i = 0; i < Math.max(a.length, b.length); i++)
- {
- //convert to integer the most efficient way
- a[i] = ~~a[i];
- b[i] = ~~b[i];
- if (a[i] > b[i])
- return 1;
- else if (a[i] < b[i])
- return -1;
- }
- return 0;
- }
-
- async function ifNotStore() {
- if ( isFromStore(".google.com") || isFromStore(".microsoft.com") || isFromStore(".opera.com") )
- return false;
-
- if (isFirefox && browser.runtime.getManifest()['browser_specific_settings']
- && browser.runtime.getManifest()['browser_specific_settings']['gecko']
- && browser.runtime.getManifest()['browser_specific_settings']['gecko']['update_url']
- )
- return true;
-
- if ( (await getInstallType() ) != "normal" )
- return true;
-
- if (isFirefox && chrome.runtime.id != "{45a03d78-2183-4d73-afe4-cfda260d1308}")
- return true;
-
- if (isChrome && chrome.runtime.id == "gaalgfdodackblpbckbllfghldhhmehb")
- return true;
-
-
- }
-
-}
-
-
-function isFromStore(storeDomain) {
- const buildin_update = chrome.runtime.getManifest()['update_url'] ;
- if ( typeof ( buildin_update ) == "string" ){
- const buildin_update_host = buildin_update.split('/')[2];
- if ( buildin_update_host.endsWith(storeDomain) )
- return true;
- }
- return false;
-}
-
-function clearShowingNews(if_del_xml=false) {
- if (if_del_xml)
- delStor("latest_news_xml");
-
- delStor("news_text");
- delStor("news_link");
-}
-
-function getRandomInt(max) {
- return Math.floor(Math.random() * max);
+// console.debug("getSelectionText() return:", text);
+ return text;
}
diff --git a/src/background_sw.js b/src/background_sw.js
new file mode 100644
index 0000000..47fc083
--- /dev/null
+++ b/src/background_sw.js
@@ -0,0 +1,6 @@
+
+console.debug("background_sw.js");
+
+let window = self;
+
+importScripts("ck.js", "background.js");
diff --git a/src/ck.js b/src/ck.js
index 803bed1..ffad27c 100755
--- a/src/ck.js
+++ b/src/ck.js
@@ -13,12 +13,15 @@
* Source code: https://github.com/garywill/BigSearch
*/
-var isFirefox = false;
-var isChrome = false;
+let isFirefox = false;
+let isChrome = false;
+let mv = -1;
+
if (window.run_env != "http_web")
{
isFirefox = chrome.runtime.getURL('').startsWith('moz-extension://');
isChrome = chrome.runtime.getURL('').startsWith('chrome-extension://');
+ mv = chrome.runtime.getManifest().manifest_version;
}
const realSidebarUrl = "addon-popup.html?showas=sidebar";
@@ -46,12 +49,12 @@ async function get_addon_setting(key, local=false) {
return new Promise((resolve, reject) => {
// Asynchronously fetch all data from storage.sync.
storageType.get(null, (items) => {
- // Pass any observed errors down the promise chain.
- if (chrome.runtime.lastError) {
- return reject(chrome.runtime.lastError);
- }
- // Pass the data retrieved from storage down the promise chain.
- resolve(items);
+ // Pass any observed errors down the promise chain.
+ if (chrome.runtime.lastError) {
+ return reject(chrome.runtime.lastError);
+ }
+ // Pass the data retrieved from storage down the promise chain.
+ resolve(items);
});
});
}
@@ -84,12 +87,12 @@ async function getInstallType(){
// Immediately return a promise and start asynchronous work
return new Promise((resolve, reject) => {
chrome.management.getSelf( (items) => {
- // Pass any observed errors down the promise chain.
- if (chrome.runtime.lastError) {
- return reject(chrome.runtime.lastError);
- }
- // Pass the data retrieved down the promise chain.
- resolve(items['installType']);
+ // Pass any observed errors down the promise chain.
+ if (chrome.runtime.lastError) {
+ return reject(chrome.runtime.lastError);
+ }
+ // Pass the data retrieved down the promise chain.
+ resolve(items['installType']);
});
});
}
@@ -150,7 +153,7 @@ function set_string_format_prototype() {
}
-const use_localstorage = true;
+
//////
@@ -158,7 +161,7 @@ const use_localstorage = true;
function getStor(cname)
{
- if (!use_localstorage) return "";
+
var got = false;
@@ -173,7 +176,7 @@ function getStor(cname)
function setStor(c_name,value)
{
- if (!use_localstorage) return false;
+
try{
localStorage.setItem(c_name,value);
@@ -183,7 +186,7 @@ function setStor(c_name,value)
function delStor(name)
{
- if (!use_localstorage) return false;
+
try{
localStorage.removeItem(name);
return true;
@@ -193,7 +196,7 @@ function delStor(name)
function gethiststr()
{
//get cookie "hist" raw string
- if (!use_localstorage) return "";
+
return getStor("hist" );
}
@@ -221,7 +224,7 @@ function add_hist2c(hist2a)
//if reach upper limit delete the lowest one then add
//if not , just add
- if (!use_localstorage) return false;
+
function addhiststr2c(addstr)
{
@@ -280,7 +283,7 @@ function add_hist2c(hist2a)
function del_hist(hist2d)
{
//parameter string hasn't been escaped
- if (!use_localstorage) return false;
+
var hists=splithists(gethiststr());
delStor("hist" );
@@ -321,3 +324,6 @@ function removeUrlParts(s) // 'http://example.com:8888/a/b/c' --> 'http://exampl
return s;
}
}
+function getRandomInt(max) { // 0 to max
+ return Math.floor(Math.random() * (max+1) );
+}
diff --git a/src/connecting.html b/src/connecting.html
index 367fcd5..0d2d693 100644
--- a/src/connecting.html
+++ b/src/connecting.html
@@ -19,12 +19,15 @@
border: none;
background-color: transparent;
}
+ #btn_retry {
+ width: 100%;
+ max-width: 300px;
+ }
大术专搜 -- ..连接中
Big Search -- ..Connecting to
-
... --→
@@ -35,6 +38,8 @@
+
+
diff --git a/src/engine_handle.js b/src/engine_handle.js
index 56c1b59..7daf3e0 100755
--- a/src/engine_handle.js
+++ b/src/engine_handle.js
@@ -89,11 +89,18 @@ function db(dbname="bigsearch") {
{
var browser_engines = {};
var browser_engines_list = {};
-
- got_browser_engines.forEach( function(obj, i) {
- browser_engines[obj.name] = {};
- browser_engines[obj.name]['dname'] = obj.name;
- });
+
+ if (isFirefox)
+ {
+ got_browser_engines.forEach( function(obj, i) {
+ browser_engines[obj.name] = {};
+ browser_engines[obj.name]['dname'] = obj.name;
+ });
+ }else if (isChrome)
+ {
+ browser_engines['chrome_default_search'] = {};
+ browser_engines['chrome_default_search'] ['dname'] = i18n( [ "浏览器默认搜索引擎", "Browser default search engine" ] );
+ }
browser_engines_list = engines_object_tolist(browser_engines);
@@ -134,7 +141,7 @@ function engines_object_tolist(engines_obj) {
const defaultBtn = {"search":{"label":i18n(["搜索", "Search"])}};
-function createEngineTr(e_name,dbname=null){
+function createEngineTr(e_name,dbname=null, egnTrNum=null){
var tr = document.createElement("tr");
tr.className = "engine_tr";
tr.setAttribute("e",e_name);
@@ -144,6 +151,15 @@ function createEngineTr(e_name,dbname=null){
td_dname.className = "enginename_td";
td_dname.title = i18n(['要进行操作(如搜索),请输入后点击右列相应的按钮\n\n如果想要将大术专搜内置的引擎“设为常用”或“重新排序”,请使用“用户自定”功能。使用其中的在线GUI编辑器可以轻松操作', 'To do an action (e.g. search), input text then click a button on the right column\n\nIf want to "set as favorite" or "re-order" Big Search build-in engines, use "User Custom". Use its online editing-engine GUI to easily do it']);
+ if (typeof(egnTrNum) === "number")
+ {
+ var span_egnTrNum = document.createElement("span");
+ span_egnTrNum.className = "span_egnTrNum";
+ span_egnTrNum.textContent = egnTrNum;
+ td_dname.appendChild(span_egnTrNum);
+ }
+
+
var span_in_td_dname = document.createElement("span");
td_dname.appendChild(span_in_td_dname);
span_in_td_dname.title = db(dbname).sEngines[e_name].tip ? db(dbname).sEngines[e_name].tip : i18n(["点此打开其首页。\n要进行操作(如搜索),请输入后点击右列相应的按钮\n\n如果想要将大术专搜内置的引擎“设为常用”或“重新排序”,请使用“用户自定”功能。使用其中的在线GUI编辑器可以轻松操作", 'Click to open its homepage.\n To do an action (e.g. search), input text then click a button on the right column\n\nIf want to "set as favorite" or "re-order" Big Search build-in engines, use "User Custom". Use its online editing-engine GUI to easily do it']);
@@ -269,6 +285,7 @@ function createETableByCata(cata, dbname=null, object_id=null, object_class=null
if (object_class) table.className = object_class;
if (object_style) table.style = object_style;
+ var trNum = 0;
db(dbname).catas[cata].engines.forEach(function(ele){
if (isVisible(ele))
{
@@ -277,14 +294,16 @@ function createETableByCata(cata, dbname=null, object_id=null, object_class=null
table.appendChild( createLabelTr(ele.lstr) );
}else if(ele.type == "engine")
{
+ trNum ++;
try{
- table.appendChild( createEngineTr(ele.name, dbname) );
+ table.appendChild( createEngineTr(ele.name, dbname, trNum) );
}catch(err){console.error(err);}
}
else if(ele.type == "fav")
{
+ trNum ++;
try{
- table.appendChild( createEngineTr(ele.name, "bigsearch") );
+ table.appendChild( createEngineTr(ele.name, "bigsearch", trNum) );
}catch(err){console.error(err);}
}
}
@@ -312,7 +331,7 @@ function createCataBtn(cata, dbname=null)
if (dbname)
button.id = button.id + "_dbname_" + dbname;
- button.addEventListener('click', function () {cata_onclick(this);});
+ button.addEventListener('click',async function () { await cata_onclick(this); cata_onclick_ui(this); });
var span = document.createElement("span");
button.appendChild(span);
@@ -384,13 +403,27 @@ async function goEngBtn(engine,btn,keyword,dbname=null)
if ( dbname == "browser" ) {
- const newTab = ( await browser.tabs.create({url:"about:blank", active: newTabBringFront, index: newTabIndex}) );
- browser.search.search({
- query: keyword,
- engine: engine,
- tabId: newTab.id
- });
-
+
+ if (isFirefox)
+ {
+ const newTab = ( await browser.tabs.create({url:"about:blank", active: newTabBringFront, index: newTabIndex}) );
+ browser.search.search({
+ query: keyword,
+ engine: engine,
+ tabId: newTab.id
+ });
+ }else if (isChrome)
+ {
+ const newTab = await ( new Promise((resolve, reject) => {
+ chrome.tabs.create(
+ {url:"about:blank", active: newTabBringFront, index: newTabIndex},
+ (r) => { resolve(r); }
+ );
+ }) ) ;
+
+ chrome.search.query({ text: keyword , tabId: newTab.id});
+ }
+
return;
}
@@ -467,6 +500,21 @@ async function goEngBtn(engine,btn,keyword,dbname=null)
chrome.permissions.getAll( (r) => { resolve(r); } );
}) );
}
+
+ if (mv >= 3)
+ {
+ if ( ! permis_have['permissions'].includes('scripting') )
+ {
+ var r = await chrome.permissions.request({ permissions: ["scripting"] });
+ if ( !r ) {
+ console.error("Failed to get 'scripting' permission");
+ return;
+ }
+
+ }
+ }
+
+
var host_permis_needed = removeUrlParts(data.action) + '*';
if ( ! ( permis_have['origins'].includes('*://*/*') || permis_have['origins'].includes(host_permis_needed) ) ) {
const permis_toast_o = document.getElementById("permis_toast_o");
@@ -478,6 +526,8 @@ async function goEngBtn(engine,btn,keyword,dbname=null)
return;
}
+
+
var newTab;
if (isFirefox) {
newTab = ( await browser.tabs.create({url:data.action, active: newTabBringFront, index: newTabIndex}) );
@@ -490,20 +540,35 @@ async function goEngBtn(engine,btn,keyword,dbname=null)
}) ) ;
}
- var code_inject = "";
- await fetch('ajax.js').then(response => response.text()).then(textString => {
- code_inject = textString;
- });
- code_inject = code_inject
- .replaceAll("_ajax_", JSON.stringify(data.ajax))
- .replaceAll("_keyword_", JSON.stringify(keyword) ) ;
-
- await chrome.tabs.executeScript( newTab.id, {
- matchAboutBlank: false,
- runAt: "document_idle",
- code: code_inject
- } );
-
+ if (mv >= 3)
+ {
+ chrome.scripting.executeScript({
+ func: ajax_execute,
+ args: [data.ajax, keyword],
+ target: { allFrames: false, tabId: newTab.id },
+ });
+ }
+ else
+ {
+ var code_inject = "";
+ var ajax_js_filecontent = "";
+ await fetch('ajax.js').then(response => response.text()).then(textString => {
+ ajax_js_filecontent = textString;
+ });
+ code_inject = `
+ const ajax = ${JSON.stringify(data.ajax)} ;
+ const keyword = ${JSON.stringify(keyword)} ;
+
+ ${ajax_js_filecontent}
+
+ ajax_execute(ajax, keyword) ;
+ ` ;
+ await chrome.tabs.executeScript( newTab.id, {
+ matchAboutBlank: false,
+ runAt: "document_idle",
+ code: code_inject
+ } );
+ }
return;
}
// ====JUDGE AJAX===finish===
diff --git a/src/enginesdata.js b/src/enginesdata.js
index a2c949e..271a089 100644
--- a/src/enginesdata.js
+++ b/src/enginesdata.js
@@ -71,6 +71,7 @@ catas = {
engines: [
{ type:"label", lstr:"中土五岳" , visible_lang: "zh"},
{ type:"engine", name:"baidu", visible_lang: "zh"},
+ { type:"engine", name:"fsou", visible_lang: "zh"},
{ type:"engine", name:"sogou", visible_lang: "zh"},
{ type:"engine", name:"360so", visible_lang: "zh"},
{ type:"label", lstr:"村融四海", visible_lang: "zh"},
@@ -101,7 +102,9 @@ catas = {
{ type:"engine", name:"choco"},
{ type:"engine", name:"scoop"},
{ type:"engine", name:"cygwin"},
+ { type:"engine", name:"ms_up_cata"},
{ type:"label", lstr:"Linux"},
+ { type:"engine", name:"manpage"},
{ type:"engine", name:"homebrew"},
{ type:"engine", name:"docker"},
{ type:"engine", name:"flathub"},
@@ -144,6 +147,7 @@ catas = {
{ type:"engine", name:"baidu_media" , visible_lang: "zh" },
{ type:"engine", name:"bilibili" , visible_lang: "zh" },
{ type:"engine", name:"music163" , visible_lang: "zh" },
+ { type:"engine", name:"fsou_img", visible_lang: "zh"},
{ type:"label", lstr:"各处民风" , visible_lang: "zh" },
{ type:"engine", name:"google_media"},
{ type:"engine", name:"youtube"},
@@ -161,6 +165,7 @@ catas = {
{ type:"engine", name:"youdao" , visible_lang: "zh"},
{ type:"engine", name:"baidu_translate" , visible_lang: "zh"},
{ type:"engine", name:"deepl"},
+ { type:"engine", name:"fsou_translate" , visible_lang: "zh"},
{ type:"engine", name:"cambridge"},
{ type:"engine", name:"google_translate"},
{ type:"engine", name:"bing_dict" , visible_lang: "zh"},
@@ -183,6 +188,10 @@ catas = {
{ type:"engine", name:"bing_ac"},
{ type:"engine", name:"wikip_zh", visible_lang: "zh"},
{ type:"engine", name:"wikip_en", visible_lang: "en"},
+ { type:"engine", name:"wolframalpha"},
+ { type:"engine", name:"hudongbaike", visible_lang: "zh"},
+ { type:"engine", name:"sogoubaike", visible_lang: "zh"},
+ { type:"engine", name:"360baike", visible_lang: "zh"},
],
},
"han": {
@@ -250,6 +259,37 @@ sEngines = {
}
}
},
+ "fsou": {
+ dname: "F搜",
+ addr: "https://fsoufsou.com/",
+ action: "https://fsoufsou.com/search",
+ kw_key: "q",
+ },
+ "fsou_img": {
+ dname: "F搜",
+ addr: "https://fsoufsou.com/",
+ action: "https://fsoufsou.com/search",
+ kw_key: "q",
+ btns: {
+ "img": {
+ label: "图片",
+ params: [
+ {key: "tbn", val: "images"},
+ ],
+ },
+ },
+ },
+ "fsou_translate": {
+ dname: "F翻译",
+ addr: "https://fsoufsou.com/translate",
+ action: "https://fsoufsou.com/translate",
+ btns: {
+ "translate": {
+ label: "翻译",
+ ajax: [1500, "textarea#translate-input-el"]
+ },
+ },
+ },
"sogou": {
"dname": "搜狗搜索",
"addr": "https://www.sogou.com",
@@ -1057,10 +1097,6 @@ sEngines = {
"action": "https://zh.wikipedia.org/w/index.php",
"kw_key": "search",
"btns": {
- "go": {
- "label": "进入",
- full_url: "https://zh.wikipedia.org/wiki/{0}"
- },
"search": {
"label": "搜索",
"params": [
@@ -1070,12 +1106,9 @@ sEngines = {
}
]
},
- "go_en": {
- "label": "Go",
- "use_other_engine": {
- "engine": "wikip_en",
- "btn": "go"
- }
+ "go": {
+ "label": "进入",
+ full_url: "https://zh.wikipedia.org/wiki/{0}"
},
"sch_en": {
"label": "Search",
@@ -1083,7 +1116,14 @@ sEngines = {
"engine": "wikip_en",
"btn": "search"
}
- }
+ },
+ "go_en": {
+ "label": "Go",
+ "use_other_engine": {
+ "engine": "wikip_en",
+ "btn": "go"
+ }
+ },
}
},
"wikip_en": {
@@ -1092,9 +1132,6 @@ sEngines = {
"action": "https://en.wikipedia.org/w/index.php",
"kw_key": "search",
"btns": {
- "go": {
- "label": "Go"
- },
"search": {
"label": "Search",
"params": [
@@ -1103,9 +1140,63 @@ sEngines = {
"val": "1"
}
]
- }
+ },
+ "go": {
+ "label": "Go"
+ },
}
},
+ "wolframalpha": {
+ dname: "WolframAlpha",
+ addr: "https://www.wolframalpha.com",
+ action: "https://www.wolframalpha.com/input",
+ kw_key: "i",
+ btns: {
+ "nl": {
+ label: "Natural Language",
+ },
+ "math": {
+ label: "Math Input",
+ params: [
+ {key: "i2d", val: "true"},
+ ],
+ },
+ },
+ },
+ "hudongbaike": {
+ dname: "快懂百科",
+ addr: "https://www.baike.com/",
+ action: "https://www.baike.com/search",
+ kw_key: "keyword",
+ },
+ "sogoubaike": {
+ dname: "搜狗百科",
+ addr: "https://baike.sogou.com/",
+ action: "https://www.sogou.com/sogou",
+ kw_key: "query",
+ params: [
+ {key: "ie", val: "utf8"},
+ {key: "insite", val: "baike.sogou.com"},
+ ],
+ },
+ "360baike": {
+ dname: "360百科",
+ addr: "https://baike.so.com/",
+ btns: {
+ "search": {
+ label: "搜索词条",
+ action: "https://baike.so.com/search/",
+ kw_key: "q",
+ },
+ "enter": {
+ label: "进入词条",
+ action: "https://baike.so.com/doc/search",
+ kw_key: "word",
+ }
+ },
+
+ },
+
"fdroid": {
"dname": "F-Droid",
"addr": "https://f-droid.org/",
@@ -1432,6 +1523,37 @@ sEngines = {
}
}
},
+
+ "manpage": {
+ dname: "Man Pages",
+ btns: {
+ "he": {
+ label: "Hurricane Electric",
+ action: "http://man.he.net/",
+ kw_key: "topic",
+ params: [
+ {key: "section", val: "all"}
+ ],
+ },
+ "debian": {
+ label: "Debian",
+ action: "https://manpages.debian.org/jump",
+ kw_key: "q",
+ },
+ "ubuntu": {
+ label: "Ubuntu",
+ action: "https://manpages.ubuntu.com/cgi-bin/search.py",
+ kw_key: "q",
+ },
+ "opensuse": {
+ label: "openSUSE",
+ action: "https://manpages.opensuse.org/jump",
+ kw_key: "q",
+ },
+
+ },
+ },
+
"homebrew": {
"dname": "Homebrew",
"addr": "https://formulae.brew.sh/",
@@ -1817,6 +1939,13 @@ sEngines = {
},
}
},
+ "ms_up_cata": {
+ dname: "Microsoft Update Catalog",
+ tip: `It's a service from Microsoft that provides a listing of updates that can be distributed over a corporate network. You can use it as a one-stop location for finding Microsoft software updates, drivers, and hotfixes.\n\nThe Microsoft Update Catalog lets you search on a variety of update fields and categories. These include the update title, description, applicable products, classifications, and knowledge base articles (e.g. KB9123456). When searching for hardware updates ("drivers"), you can also search for driver model, manufacturer, class, or a 4-part hardware id (e.g "PCI\VEN_14E4&DEV_1677&SUBSYS_01AD1028"). You can narrow the scope of your search by adding additional search terms.`,
+ addr: "https://catalog.update.microsoft.com/",
+ action: "https://catalog.update.microsoft.com/Search.aspx",
+ kw_key: "q",
+ },
"feixiaohao": {
dname: "非小号",
addr: "https://www.feixiaohao.com/",
diff --git a/src/i_layout.css b/src/i_layout.css
index d4bd909..2edfb29 100644
--- a/src/i_layout.css
+++ b/src/i_layout.css
@@ -171,7 +171,7 @@ a {
}
#index_title, #index_title a {
display: inline;
- margin-left: 10px;
+/* margin-left: 10px; */
color: var(--index-title-cl);
}
#index_subtitle {
@@ -306,7 +306,10 @@ a {
background-color: rgba(255,255,255, 0.7);
color: blue;
}
-
+.btns_copypaste_right .span_copypaste {
+ left: unset;
+ right: calc( 0px - var(--btns-below-input-height) );
+}
#btn_ml_input {
@@ -437,7 +440,30 @@ a {
.engine_tr:hover {
background-color: var(--engine-tr-hover-bg-cl);
}
+
+.span_egnTrNum {
+ position: absolute;
+
+ cursor: default;
+ font-weight: lighter;
+ font-size: 12px;
+ transform: scale(0.6);
+ color: var(--enginename-td-cl);
+ top: 0;
+ left: -3px;
+ text-shadow: 1px 1px #000000c9;
+ height: 100%;
+ opacity: 0.6;
+
+}
+.span_egnTrNum:hover {
+ opacity: unset;
+ transform: unset;
+}
+
.enginename_td {
+ position: relative;
+
padding:0px 10px 0px 5px;
/* min-width:130px; */
/* white-space:nowrap; */
diff --git a/src/i_scripts.js b/src/i_scripts.js
index 1cba81a..bc2e75c 100644
--- a/src/i_scripts.js
+++ b/src/i_scripts.js
@@ -388,7 +388,7 @@ onrd.push(function(){
});
onrd.push(function() {
document.getElementById("btn_search_permi").onclick = async function() {
- await browser.permissions.request({ permissions: ["search"] });
+ await chrome.permissions.request({ permissions: ["search"] });
document.getElementsByClassName("cata_btn_highlight")[0].click();
};
});
@@ -413,18 +413,21 @@ onrd.push(async function(){
onrd.push(async function(){
if (window.run_env != "http_web")
{
- if ( (await get_addon_setting("checkupdate")) !== true )
+ if (chrome.extension.inIncognitoContext)
return;
- if (getStor("news_text"))
- {
- document.getElementById("newver_link").textContent = getStor("news_text");
-
- if ( getStor("news_link") )
- document.getElementById("newver_link").href = getStor("news_link");
+ if ( (await get_addon_setting("checkupdate")) !== true
+ && ! (
+ (await get_addon_setting("checkupdate")) === undefined
+ && ( isFromStore(".microsoft.com") || isFromStore(".opera.com") )
+ )
+ )
+ return;
+
+
+ show_news_text();
- document.getElementById("newver").style.display = "unset";
- }
+ setTimeout(maybe_checkupdate, 10 *1000);
}
});
@@ -464,7 +467,7 @@ async function make_cata_btns() {
document.getElementById("catas_cont").appendChild(createCataBtn("user", "user"));
if (window.run_env != "http_web") {
- if (isFirefox )
+// if (isFirefox )
document.getElementById("catas_cont").appendChild(createCataBtn("browser", "browser"));
}
diff --git a/src/js/checku.js b/src/js/checku.js
new file mode 100644
index 0000000..62549cb
--- /dev/null
+++ b/src/js/checku.js
@@ -0,0 +1,319 @@
+// var LSHandler = {};
+//
+// async function init_LSHandler() {
+//
+// LSHandler = await LSHandlerClass();
+//
+// async function LSHandlerClass () {
+// this.storType = mv >= 3 ? "storage.session" : "localStorage" ; // TODO
+// this.getStor = async function(itemName) {
+// if (storType === "localStorage")
+// return getStor(itemName);
+// };
+// this.setStor = async function(itemName, value) {
+// if (storType === "localStorage")
+// return setStor(itemName, value);
+//
+// };
+// this.delStor = async function(itemName) {
+// if (storType === "localStorage")
+// return delStor(itemName);
+// };
+//
+// return this;
+// }
+// }
+//
+
+
+
+
+
+async function maybe_checkupdate() {
+// parseGotNewsXml();
+
+ if (await is_longengough_checknews() )
+ checkNews();
+ else
+ {
+// console.debug("short time");
+ }
+}
+async function is_longengough_checknews()
+{
+ var nowTime ;
+ var lastSuccGotNewsTime ;
+
+ lastSuccGotNewsTime = parseInt( getStor("lastSuccGotNewsTime") );
+
+ if (!lastSuccGotNewsTime)
+ return true;
+
+ nowTime = Date.now();
+ if ( (nowTime - lastSuccGotNewsTime) > (
+ 10*60*60*1000 // for real
+// 20*1000 // for test
+ ) )
+ return true;
+}
+function saveNowAsLastNewsTime()
+{
+ setStor("lastSuccGotNewsTime", Date.now() );
+}
+
+
+async function checkNews() {
+
+ const news_urls = [
+ "https://update.versioncheck.workers.dev/news",
+ "https://acsearch.cf/appnews.php",
+ "https://www.acsearch.ml/news.xml",
+ "https://garywill.gitlab.io/releaseapps-dl/news.xml",
+ `https://api.allorigins.win/raw?url=${encodeURIComponent('https://gitlab.com/garywill/releaseapps-dl/-/raw/main/news.xml')}`,
+ "https://jsonp.afeld.me/?url=https://gitlab.com/garywill/releaseapps-dl/-/raw/main/news.xml",
+ ];
+
+ // for real
+ var url_use_sub = getRandomInt( news_urls.length -1 );
+ var news_url = news_urls [ url_use_sub ];
+
+ // for test
+// var news_url = "http://127.0.0.1:12000/appnews.php";
+// console.log("downloading", news_url);
+
+ await fetch(news_url).then(response => response.text()).then(textString => {
+ var xml = textString;
+
+ try{
+ const parser = new DOMParser();
+ var xmlDoc = parser.parseFromString(xml, "text/xml");
+
+ var xmlBigsearch = xmlDoc.querySelector("news[app=bigsearch-addon]");
+
+ const serializer = new XMLSerializer();
+ var serXmlStr = serializer.serializeToString(xmlBigsearch) ;
+
+ setStor("latest_news_xml",serXmlStr)
+ parseGotNewsXml();
+ saveNowAsLastNewsTime();
+ }catch(err) {
+// console.warn("Error on parsing downloaded latest news");
+// console.warn(err);
+
+ clearShowingNews(true);
+ }
+ }) .catch(err => {
+// console.warn("Error on fetching latest news");
+// console.warn(err);
+
+ clearShowingNews(true);
+ });
+}
+
+// called when
+// 1. after successfully getting news
+// 2. on addon loaded (possibly updated)
+async function parseGotNewsXml()
+{
+ clearShowingNews(false);
+
+ const xml = getStor("latest_news_xml");
+
+ if (!xml)
+ return;
+
+ const parser = new DOMParser();
+ var newsDoc;
+ newsDoc = parser.parseFromString(xml, "text/xml");
+
+
+ var filters = newsDoc.documentElement.querySelectorAll("filter") ;
+ for (var i=0; i 0 )
+ continue;
+ }
+ }
+
+ if ( filters[i].getAttribute("browsertype") == "chromium" )
+ {
+ if ( ! isChrome )
+ continue;
+ }
+ else if ( filters[i].getAttribute("browsertype") == "firefox" )
+ {
+ if ( ! isFirefox )
+ continue;
+ }
+ else if ( filters[i].getAttribute("browsertype") == "chrome-store" )
+ {
+ if ( ! isFromStore(".google.com") )
+ continue;
+ }
+ else if ( filters[i].getAttribute("browsertype") == "edge-store" )
+ {
+ if ( ! isFromStore(".microsoft.com") )
+ continue;
+ }
+ else if ( filters[i].getAttribute("browsertype") == "opera-store" )
+ {
+ if ( ! isFromStore(".opera.com") )
+ continue;
+ }
+
+ if ( filters[i].getAttribute("installtype") == "hosted" )
+ {
+ if ( ( await ifNotStore() ) !== true )
+ continue;
+ }
+
+
+ parse_news(filters[i]);
+
+ break;
+ }
+
+ async function parse_news( news_filter_tag )
+ {
+ //console.log("passed filter");
+ //console.log(news_filter_tag.outerHTML);
+
+ if ( news_filter_tag.querySelector("switch") &&
+ news_filter_tag.querySelector("switch").getAttribute("show") == "false"
+ )
+ {
+ clearShowingNews(false);
+ return;
+ }
+
+ const lang = (await get_addon_setting("hl")) ;
+ var text = "";
+ if ( ! lang ) // language not set. use default language
+ {
+ text = news_filter_tag.querySelector(`lang[lang=en]`).getAttribute("text") ;
+ }else {
+ if ( news_filter_tag.querySelector(`lang[lang=${lang}]`) )
+ text = news_filter_tag.querySelector(`lang[lang=${lang}]`).getAttribute("text") ;
+ else
+ text = news_filter_tag.querySelector(`lang[lang=en]`).getAttribute("text") ;
+ }
+
+ if ( text )
+ {
+ setStor("news_text", text);
+
+ if ( news_filter_tag.querySelector("link") &&
+ news_filter_tag.querySelector("link").getAttribute("link")
+ )
+ setStor("news_link", news_filter_tag.querySelector("link").getAttribute("link") );
+ }
+
+ //console.log( getStor('news_text') );
+ //console.log( getStor('news_link') );
+
+ }
+
+ // https://stackoverflow.com/a/53387532/10617713
+ // Function returns:
+ // 0 : a = b
+ // 1 : a > b
+ // -1 : a < b
+ function compareVer(a, b)
+ {
+ function prep(t)
+ {
+ return ("" + t)
+ //treat non-numerical characters as lower version
+ //replacing them with a negative number based on charcode of first character
+ .replace(/[^0-9\.]+/g, function(c){return "." + ((c = c.replace(/[\W_]+/, "")) ? c.toLowerCase().charCodeAt(0) - 65536 : "") + "."})
+ //remove trailing "." and "0" if followed by non-numerical characters (1.0.0b);
+ .replace(/(?:\.0+)*(\.-[0-9]+)(\.[0-9]+)?\.*$/g, "$1$2")
+ .split('.');
+ }
+ a = prep(a);
+ b = prep(b);
+ for (var i = 0; i < Math.max(a.length, b.length); i++)
+ {
+ //convert to integer the most efficient way
+ a[i] = ~~a[i];
+ b[i] = ~~b[i];
+ if (a[i] > b[i])
+ return 1;
+ else if (a[i] < b[i])
+ return -1;
+ }
+ return 0;
+ }
+
+ async function ifNotStore() {
+ if ( isFromStore(".google.com") || isFromStore(".microsoft.com") || isFromStore(".opera.com") )
+ return false;
+
+ if (isFirefox && browser.runtime.getManifest()['browser_specific_settings']
+ && browser.runtime.getManifest()['browser_specific_settings']['gecko']
+ && browser.runtime.getManifest()['browser_specific_settings']['gecko']['update_url']
+ )
+ return true;
+
+ if ( (await getInstallType() ) != "normal" )
+ return true;
+
+ if (isFirefox && chrome.runtime.id != "{45a03d78-2183-4d73-afe4-cfda260d1308}")
+ return true;
+
+ if (isChrome && chrome.runtime.id == "gaalgfdodackblpbckbllfghldhhmehb")
+ return true;
+
+
+ }
+
+}
+
+
+function isFromStore(storeDomain) {
+ const buildin_update = chrome.runtime.getManifest()['update_url'] ;
+ if ( typeof ( buildin_update ) == "string" ){
+ const buildin_update_host = buildin_update.split('/')[2];
+ if ( buildin_update_host.endsWith(storeDomain) )
+ return true;
+ }
+ return false;
+}
+
+function clearShowingNews(if_del_xml=false) {
+ if (if_del_xml)
+ delStor("latest_news_xml");
+
+ delStor("news_text");
+ delStor("news_link");
+}
+
+function show_news_text()
+{
+ if (getStor("news_text"))
+ {
+ const newver_link = document.getElementById("newver_link");
+
+ newver_link.textContent = getStor("news_text");
+
+ if ( getStor("news_link") )
+ newver_link.href = getStor("news_link");
+
+ document.getElementById("newver").style.display = "unset";
+ }
+}
+function unshow_news_text()
+{
+ document.getElementById("newver").style.display = "none";
+}
diff --git a/src/js/mtm.js b/src/js/mtm.js
index a491278..c1cd94f 100644
--- a/src/js/mtm.js
+++ b/src/js/mtm.js
@@ -27,7 +27,7 @@ async function do_stati()
rand_str: function(n) {
var s = [];
for (var i=0; i {
+ chrome.permissions.contains( { permissions: ["search"] } , function(r) {
+ if (chrome.runtime.lastError)
+ return reject(chrome.runtime.lastError);
+ resolve(r);
+ });
+ }) )
+ )
+ )
+ {
document.getElementById("div_search_permi").style.display = "";
-
- try {
- await fetch_browser_engines();
- }catch(err) { }
+ document.getElementById("engines_table").style.visibility = "hidden";
+ }
}else{
document.getElementById("div_search_permi").style.display = "none";
}
+}
+async function cata_onclick_ui(btnobj)
+{
+ const dbname=btnobj.getAttribute("dbname");
+ const cata=btnobj.getAttribute("cata");
- engines_cont.appendChild( createETableByCata( btnobj.getAttribute('name'), btnobj.getAttribute('dbname'), 'engines_table'));
-
-
Array.from( document.getElementsByClassName("cata_btns") ).forEach(function(ele){
ele.classList.remove("cata_btn_highlight");
});
diff --git a/src/manifest-chrome.json b/src/manifest-chrome.json
index 07f2555..455b08c 100644
--- a/src/manifest-chrome.json
+++ b/src/manifest-chrome.json
@@ -3,7 +3,7 @@
"description": "__MSG_extensionDescription__",
"default_locale": "en",
"manifest_version": 2,
- "version": "2.15.0",
+ "version": "2.15.5",
"homepage_url": "https://github.com/garywill/BigSearch",
"author": {
"name": "Garywill",
@@ -17,6 +17,7 @@
"*://garywill.github.io/BigSearch/*"
],
"optional_permissions": [
+ "search",
"clipboardRead",
"activeTab",
"*://*/*"
diff --git a/src/manifest.json b/src/manifest.json
index e0fe559..3f6390a 100644
--- a/src/manifest.json
+++ b/src/manifest.json
@@ -3,7 +3,7 @@
"description": "__MSG_extensionDescription__",
"default_locale": "en",
"manifest_version": 2,
- "version": "2.15.0",
+ "version": "2.15.5",
"homepage_url": "https://garywill.github.io",
"developer": {
"name": "Garywill",