mirror of
https://github.com/Kenshin/simpread.git
synced 2025-12-08 18:23:28 +00:00
278 lines
12 KiB
JavaScript
278 lines
12 KiB
JavaScript
console.log( "=== simpread background load ===" )
|
|
|
|
import local from 'local';
|
|
import { storage } from 'storage';
|
|
import * as msg from 'message';
|
|
import {browser} from 'browser';
|
|
import * as ver from 'version';
|
|
import * as menu from 'menu';
|
|
import * as watch from 'watch';
|
|
|
|
import PureRead from 'puread';
|
|
|
|
/**
|
|
* Sevice: storage Get data form chrome storage
|
|
*/
|
|
storage.Read( () => {
|
|
storage.puread = new PureRead( storage.sites );
|
|
if ( local.Firstload() ) {
|
|
local.Version( ver.version );
|
|
browser.tabs.create({ url: browser.extension.getURL( "options/options.html#firstload?ver=" + ver.version ) });
|
|
}
|
|
else {
|
|
!local.Count() && storage.GetRemote( "remote", ( result, error ) => {
|
|
if ( !error ) {
|
|
storage.pr.Addsites( result );
|
|
storage.Writesite( storage.pr.sites, getNewsitesHandler );
|
|
}
|
|
});
|
|
ver.version != storage.version && storage.GetRemote( "local", ( result, error ) => {
|
|
storage.pr.Addsites( result );
|
|
storage.Writesite( storage.pr.sites, () => {
|
|
ver.version != storage.version &&
|
|
storage.Fix( storage.read.sites, storage.version, ver.version, storage.focus.sites );
|
|
ver.version != storage.version && storage.Write( () => {
|
|
local.Version( ver.version );
|
|
browser.tabs.create({ url: browser.extension.getURL( "options/options.html#update?ver=" + ver.version ) });
|
|
}, ver.Verify( storage.version, storage.simpread ) );
|
|
getNewsitesHandler( result );
|
|
});
|
|
});
|
|
// only firefox and only usage 1.1.0.3024
|
|
//if ( ver.version == storage.version && ver.sub_ver == "3024" && !localStorage["bg-3024"] ) {
|
|
// browser.tabs.create({ url: browser.extension.getURL( "options/options.html#firstload?ver=" + ver.version ) });
|
|
// localStorage["bg-3024"] = ver.sub_ver;
|
|
//}
|
|
}
|
|
menu.CreateAll();
|
|
});
|
|
|
|
/**
|
|
* Get newsites handler
|
|
* @param {object} count: update site cou
|
|
*/
|
|
function getNewsitesHandler( result ) {
|
|
watch.Push( "site", true );
|
|
}
|
|
|
|
/**
|
|
* Listen menu event handler
|
|
*/
|
|
menu.OnClicked( ( info, tab ) => {
|
|
console.log( "background contentmenu Listener", info, tab );
|
|
if ( info.menuItemId == "link" ) {
|
|
info.linkUrl && browser.tabs.create({ url: info.linkUrl + "?simpread_mode=read" });
|
|
} else if ( info.menuItemId == "list" ) {
|
|
browser.tabs.create({ url: browser.extension.getURL( "options/options.html#later" ) });
|
|
} else {
|
|
if ( !tab.url.startsWith( "moz-extension://" ) ) browser.tabs.sendMessage( tab.id, msg.Add(info.menuItemId));
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Listen runtime message, include: `shortcuts` `browser_action`
|
|
*/
|
|
browser.runtime.onMessage.addListener( function( request, sender, sendResponse ) {
|
|
console.log( "background runtime Listener", request );
|
|
switch ( request.type ) {
|
|
case msg.MESSAGE_ACTION.shortcuts:
|
|
getCurTab( { url: request.value.url }, tabs => {
|
|
browser.tabs.sendMessage( tabs[0].id, msg.Add( msg.MESSAGE_ACTION.shortcuts ));
|
|
});
|
|
break;
|
|
case msg.MESSAGE_ACTION.browser_action:
|
|
getCurTab( { url: request.value.url }, tabs => {
|
|
if ( tabs && tabs.length > 0 && tabs[0].url == request.value.url ) {
|
|
setMenuAndIcon( tabs[0].id, request.value.code );
|
|
} else console.error( request );
|
|
});
|
|
break;
|
|
case msg.MESSAGE_ACTION.new_tab:
|
|
browser.tabs.create({ url: request.value.url });
|
|
break;
|
|
case msg.MESSAGE_ACTION.menu:
|
|
const { id, value } = request.value;
|
|
// hack code refresh options menu changed, and not saved storage
|
|
storage.option.menu[id] = value;
|
|
value === true ? menu.Create( id ) : menu.Remove( id );
|
|
break;
|
|
case msg.MESSAGE_ACTION.updated:
|
|
watch.Push( request.value.type, request.value.value );
|
|
break;
|
|
case msg.MESSAGE_ACTION.save_verify:
|
|
sendResponse( watch.Lock( request.value.url ));
|
|
break;
|
|
case msg.MESSAGE_ACTION.auth:
|
|
browser.tabs.create({ url: browser.extension.getURL( "options/options.html#labs?auth=" + request.value.name.toLowerCase() ) });
|
|
break;
|
|
case msg.MESSAGE_ACTION.update_site:
|
|
getCurTab({ active: true, url: request.value.url }, tabs => {
|
|
tabs.length > 0 && ( upTabId = tabs[0].id );
|
|
browser.tabs.create({ url: browser.extension.getURL( "options/options.html#sites?update=" + encodeURI( JSON.stringify( request.value.site ))) });
|
|
});
|
|
break;
|
|
case msg.MESSAGE_ACTION.save_site:
|
|
browser.tabs.create({ url: browser.extension.getURL( "options/options.html#sites?pending=" + encodeURI( JSON.stringify( request.value ))) });
|
|
break;
|
|
case msg.MESSAGE_ACTION.temp_site:
|
|
browser.tabs.create({ url: browser.extension.getURL( "options/options.html#sites?temp=" + encodeURI( JSON.stringify( request.value ))) });
|
|
break;
|
|
case msg.MESSAGE_ACTION.auth_success:
|
|
getCurTab( { url: request.value.url }, tabs => {
|
|
if ( tabs && tabs.length > 0 ) {
|
|
browser.tabs.remove( tabs[0].id );
|
|
getCurTab( { "active": true }, tabs => {
|
|
tabs.forEach( tab => browser.tabs.sendMessage( tab.id, msg.Add( msg.MESSAGE_ACTION.export, {type: request.value.name.toLowerCase()} )) );
|
|
});
|
|
}
|
|
});
|
|
break;
|
|
case msg.MESSAGE_ACTION.track:
|
|
tracked( request.value );
|
|
break;
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Listen chrome tab active message, include: `tab_selected`
|
|
*/
|
|
browser.tabs.onActivated.addListener( function( active ) {
|
|
getCurTab( { "active": true, "currentWindow": true }, tabs => {
|
|
if ( tabs && tabs.length > 0 && tabs[0].status == "complete" ) {
|
|
console.log( "background tabs Listener:active", active );
|
|
if ( tabs && tabs.length > 0 && !tabs[0].url.startsWith( "moz-extension://" ) ) {
|
|
browser.tabs.sendMessage( tabs[0].id, msg.Add( msg.MESSAGE_ACTION.tab_selected, { is_update: false } ));
|
|
} else {
|
|
setMenuAndIcon( tabs[0].id, -1 );
|
|
}
|
|
} else console.error( "onActivated.addListener error" );
|
|
});
|
|
});
|
|
|
|
/**
|
|
* Listen chrome tab update message, include: `tab_selected`
|
|
*/
|
|
browser.tabs.onUpdated.addListener( function( tabId, changeInfo, tab ) {
|
|
watch.Pull( tabId );
|
|
if ( changeInfo.status == "complete" ) {
|
|
console.log( "background tabs Listener:update", tabId, changeInfo, tab );
|
|
|
|
if ( tab.url.startsWith( "http://ksria.com/simpread/auth.html" )) {
|
|
const url = tab.url.replace( "http://ksria.com/simpread/auth.html?id=", "" ),
|
|
id = url.includes( "#" ) || url.includes( "&" ) ? url.substr( 0, url.search( /\S(#|&)/ ) + 1 ) : url ;
|
|
browser.tabs.query( {}, tabs => {
|
|
const opts = tabs.find( tab => tab.url.includes( browser.extension.getURL( "options/options.html" ) ));
|
|
if ( opts ) {
|
|
browser.tabs.sendMessage( opts.id, msg.Add( msg.MESSAGE_ACTION.redirect_uri, { uri: tab.url, id } ));
|
|
browser.tabs.remove( tabId );
|
|
}
|
|
});
|
|
} else if ( tab.url.startsWith( "https://simpread.ksria.cn/plugins/install/" )) {
|
|
const url = tab.url.replace( "https://simpread.ksria.cn/plugins/install/", "" );
|
|
browser.tabs.create({ url: browser.extension.getURL( "options/options.html#plugins?install=" + encodeURIComponent(url) ) });
|
|
browser.tabs.remove( tabId );
|
|
} else if ( tab.url.startsWith( "https://simpread.ksria.cn/sites/install/" )) {
|
|
const url = tab.url.replace( "https://simpread.ksria.cn/sites/install/", "" );
|
|
browser.tabs.create({ url: browser.extension.getURL( "options/options.html#sites?install=" + encodeURIComponent(url) ) });
|
|
browser.tabs.remove( tabId );
|
|
} else if ( tab.url == browser.runtime.getURL( "options/options.html#sites?update=success" ) ) {
|
|
browser.tabs.remove( tabId );
|
|
upTabId > 0 && chrome.tabs.reload( upTabId, () => { upTabId == -1; });
|
|
} else if ( tab.url == browser.runtime.getURL( "options/options.html#sites?update=failed" ) ) {
|
|
browser.tabs.remove( tabId );
|
|
} else if ( tab.url == browser.runtime.getURL( "options/options.html#sites?update=complete" ) ) {
|
|
browser.tabs.remove( tabId );
|
|
} else if ( tab.url == browser.runtime.getURL( "options/options.html#sites?update=pending" ) ) {
|
|
browser.tabs.remove( tabId );
|
|
upTabId > 0 && browser.tabs.sendMessage( upTabId, msg.Add( msg.MESSAGE_ACTION.pending_site ));
|
|
upTabId == -1;
|
|
}
|
|
|
|
if ( !tab.url.startsWith( "moz-extension://" ) ) {
|
|
browser.tabs.sendMessage( tabId, msg.Add( msg.MESSAGE_ACTION.tab_selected, { is_update: true } ));
|
|
storage.ReadAsync( ( simpread, secret, plugins ) => {
|
|
browser.tabs.sendMessage( tabId, msg.Add( msg.MESSAGE_ACTION.storage, { simpread, secret, plugins } ));
|
|
});
|
|
} else {
|
|
setMenuAndIcon( tab.id, -1 );
|
|
}
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Listen chrome tab remove message
|
|
*/
|
|
browser.tabs.onRemoved.addListener( tabId => watch.Pull( tabId ));
|
|
|
|
/**
|
|
* Listen chrome page, include: `read`
|
|
*/
|
|
browser.pageAction.onClicked.addListener( function( tab ) {
|
|
browser.tabs.sendMessage( tab.id, msg.Add( msg.MESSAGE_ACTION.browser_click ));
|
|
});
|
|
|
|
/**
|
|
* Get current tab object
|
|
*
|
|
* @param {object} query
|
|
* @param {function} callback
|
|
*/
|
|
function getCurTab( query, callback ) {
|
|
if ( query.url && query.url.includes( "#" ) ) {
|
|
browser.tabs.query( {}, tabs => callback( tabs.filter( tab => tab.url == query.url && tab.active ) ) );
|
|
} else browser.tabs.query( query, function( tabs ) { callback( tabs ); });
|
|
}
|
|
|
|
/**
|
|
* Set page action icon and context menu
|
|
*
|
|
* @param {int} tab.id
|
|
* @param {int} -1: disable icon;
|
|
*/
|
|
function setMenuAndIcon( id, code ) {
|
|
let icon = "";
|
|
if ( code == -1 ) {
|
|
menu.Update( "tempread" );
|
|
browser.pageAction.setTitle({ tabId: id, title: "简悦 - 当前页面未适配阅读模式,点击进入临时阅读模式"});
|
|
} else {
|
|
icon = "-enable";
|
|
storage.option.menu.read === true && menu.Create( "read" );
|
|
menu.Update( "read" );
|
|
browser.pageAction.setTitle({ tabId: id, title: "简悦 - 当前页面已适配阅读模式"});
|
|
}
|
|
browser.pageAction.show( id );
|
|
browser.pageAction.setIcon({ tabId: id, path: browser.extension.getURL( `assets/images/icon16${icon}.png` ) });
|
|
}
|
|
|
|
/**
|
|
* Listen browser page action
|
|
*/
|
|
browser.browserAction.onClicked.addListener( () => browser.runtime.openOptionsPage() );
|
|
|
|
/**
|
|
* Track
|
|
*
|
|
* @param {object} google analytics track object
|
|
*/
|
|
function tracked({ eventCategory, eventAction, eventLabel }) {
|
|
console.log( "current track is", eventCategory, eventAction, eventLabel )
|
|
ga( 'send', {
|
|
hitType : 'event',
|
|
eventCategory,
|
|
eventAction,
|
|
eventLabel
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Google analytics
|
|
*/
|
|
analytics();
|
|
function analytics() {
|
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
|
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
|
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
|
ga('create', 'UA-405976-12', 'auto');
|
|
ga('send', 'pageview');
|
|
} |