1+ console . log ( "=== simpread background load ===" )
2+
3+ import local from 'local' ;
4+ import { storage } from 'storage' ;
5+ import * as msg from 'message' ;
6+ import { browser } from 'browser' ;
7+ import * as ver from 'version' ;
8+ import * as menu from 'menu' ;
9+ import * as watch from 'watch' ;
10+
11+ import PureRead from 'puread' ;
12+
13+ /**
14+ * Sevice: storage Get data form chrome storage
15+ */
16+ storage . Read ( ( ) => {
17+ storage . puread = new PureRead ( storage . sites ) ;
18+ if ( local . Firstload ( ) ) {
19+ local . Version ( ver . version ) ;
20+ browser . tabs . create ( { url : browser . extension . getURL ( "options/options.html#firstload?ver=" + ver . version ) } ) ;
21+ }
22+ else {
23+ ! local . Count ( ) && storage . GetRemote ( "remote" , ( result , error ) => {
24+ if ( ! error ) {
25+ storage . pr . Addsites ( result ) ;
26+ storage . Writesite ( storage . pr . sites , getNewsitesHandler ) ;
27+ }
28+ } ) ;
29+ ver . version != storage . version && storage . GetRemote ( "local" , ( result , error ) => {
30+ storage . pr . Addsites ( result ) ;
31+ storage . Writesite ( storage . pr . sites , ( ) => {
32+ ver . version != storage . version &&
33+ storage . Fix ( storage . read . sites , storage . version , ver . version , storage . focus . sites ) ;
34+ ver . version != storage . version && storage . Write ( ( ) => {
35+ local . Version ( ver . version ) ;
36+ browser . tabs . create ( { url : browser . extension . getURL ( "options/options.html#update?ver=" + ver . version ) } ) ;
37+ } , ver . Verify ( storage . version , storage . simpread ) ) ;
38+ getNewsitesHandler ( result ) ;
39+ } ) ;
40+ } ) ;
41+ // only firefox and only usage 1.1.0.3024
42+ //if ( ver.version == storage.version && ver.sub_ver == "3024" && !localStorage["bg-3024"] ) {
43+ // browser.tabs.create({ url: browser.extension.getURL( "options/options.html#firstload?ver=" + ver.version ) });
44+ // localStorage["bg-3024"] = ver.sub_ver;
45+ //}
46+ }
47+ menu . CreateAll ( ) ;
48+ } ) ;
49+
50+ /**
51+ * Get newsites handler
52+ * @param {object } count: update site cou
53+ */
54+ function getNewsitesHandler ( result ) {
55+ watch . Push ( "site" , true ) ;
56+ }
57+
58+ /**
59+ * Listen menu event handler
60+ */
61+ menu . OnClicked ( ( info , tab ) => {
62+ console . log ( "background contentmenu Listener" , info , tab ) ;
63+ if ( info . menuItemId == "link" ) {
64+ info . linkUrl && browser . tabs . create ( { url : info . linkUrl + "?simpread_mode=read" } ) ;
65+ } else if ( info . menuItemId == "list" ) {
66+ browser . tabs . create ( { url : browser . extension . getURL ( "options/options.html#later" ) } ) ;
67+ } else {
68+ if ( ! tab . url . startsWith ( "moz-extension://" ) ) browser . tabs . sendMessage ( tab . id , msg . Add ( info . menuItemId ) ) ;
69+ }
70+ } ) ;
71+
72+ /**
73+ * Listen runtime message, include: `shortcuts` `browser_action`
74+ */
75+ browser . runtime . onMessage . addListener ( function ( request , sender , sendResponse ) {
76+ console . log ( "background runtime Listener" , request ) ;
77+ switch ( request . type ) {
78+ case msg . MESSAGE_ACTION . shortcuts :
79+ getCurTab ( { url : request . value . url } , tabs => {
80+ browser . tabs . sendMessage ( tabs [ 0 ] . id , msg . Add ( msg . MESSAGE_ACTION . shortcuts ) ) ;
81+ } ) ;
82+ break ;
83+ case msg . MESSAGE_ACTION . browser_action :
84+ getCurTab ( { url : request . value . url } , tabs => {
85+ if ( tabs && tabs . length > 0 && tabs [ 0 ] . url == request . value . url ) {
86+ setMenuAndIcon ( tabs [ 0 ] . id , request . value . code ) ;
87+ } else console . error ( request ) ;
88+ } ) ;
89+ break ;
90+ case msg . MESSAGE_ACTION . new_tab :
91+ browser . tabs . create ( { url : request . value . url } ) ;
92+ break ;
93+ case msg . MESSAGE_ACTION . menu :
94+ const { id, value } = request . value ;
95+ // hack code refresh options menu changed, and not saved storage
96+ storage . option . menu [ id ] = value ;
97+ value === true ? menu . Create ( id ) : menu . Remove ( id ) ;
98+ break ;
99+ case msg . MESSAGE_ACTION . updated :
100+ watch . Push ( request . value . type , request . value . value ) ;
101+ break ;
102+ case msg . MESSAGE_ACTION . save_verify :
103+ sendResponse ( watch . Lock ( request . value . url ) ) ;
104+ break ;
105+ case msg . MESSAGE_ACTION . auth :
106+ browser . tabs . create ( { url : browser . extension . getURL ( "options/options.html#labs?auth=" + request . value . name . toLowerCase ( ) ) } ) ;
107+ break ;
108+ case msg . MESSAGE_ACTION . auth_success :
109+ getCurTab ( { url : request . value . url } , tabs => {
110+ if ( tabs && tabs . length > 0 ) {
111+ browser . tabs . remove ( tabs [ 0 ] . id ) ;
112+ getCurTab ( { "active" : true } , tabs => {
113+ tabs . forEach ( tab => browser . tabs . sendMessage ( tab . id , msg . Add ( msg . MESSAGE_ACTION . export , { type : request . value . name . toLowerCase ( ) } ) ) ) ;
114+ } ) ;
115+ }
116+ } ) ;
117+ break ;
118+ case msg . MESSAGE_ACTION . track :
119+ tracked ( request . value ) ;
120+ break ;
121+ }
122+ } ) ;
123+
124+ /**
125+ * Listen chrome tab active message, include: `tab_selected`
126+ */
127+ browser . tabs . onActivated . addListener ( function ( active ) {
128+ getCurTab ( { "active" : true , "currentWindow" : true } , tabs => {
129+ if ( tabs && tabs . length > 0 && tabs [ 0 ] . status == "complete" ) {
130+ console . log ( "background tabs Listener:active" , active ) ;
131+ if ( tabs && tabs . length > 0 && ! tabs [ 0 ] . url . startsWith ( "moz-extension://" ) ) {
132+ browser . tabs . sendMessage ( tabs [ 0 ] . id , msg . Add ( msg . MESSAGE_ACTION . tab_selected , { is_update : false } ) ) ;
133+ } else {
134+ setMenuAndIcon ( tabs [ 0 ] . id , - 1 ) ;
135+ }
136+ } else console . error ( "onActivated.addListener error" ) ;
137+ } ) ;
138+ } ) ;
139+
140+ /**
141+ * Listen chrome tab update message, include: `tab_selected`
142+ */
143+ browser . tabs . onUpdated . addListener ( function ( tabId , changeInfo , tab ) {
144+ watch . Pull ( tabId ) ;
145+ if ( changeInfo . status == "complete" ) {
146+ console . log ( "background tabs Listener:update" , tabId , changeInfo , tab ) ;
147+
148+ if ( tab . url . startsWith ( "http://ksria.com/simpread/auth.html" ) ) {
149+ const url = tab . url . replace ( "http://ksria.com/simpread/auth.html?id=" , "" ) ,
150+ id = url . includes ( "#" ) || url . includes ( "&" ) ? url . substr ( 0 , url . search ( / \S ( # | & ) / ) + 1 ) : url ;
151+ browser . tabs . query ( { } , tabs => {
152+ const opts = tabs . find ( tab => tab . url . includes ( browser . extension . getURL ( "options/options.html" ) ) ) ;
153+ if ( opts ) {
154+ browser . tabs . sendMessage ( opts . id , msg . Add ( msg . MESSAGE_ACTION . redirect_uri , { uri : tab . url , id } ) ) ;
155+ browser . tabs . remove ( tabId ) ;
156+ }
157+ } ) ;
158+ }
159+
160+ if ( ! tab . url . startsWith ( "moz-extension://" ) ) {
161+ browser . tabs . sendMessage ( tabId , msg . Add ( msg . MESSAGE_ACTION . tab_selected , { is_update : true } ) ) ;
162+ storage . ReadAsync ( ( simpread , secret ) => {
163+ browser . tabs . sendMessage ( tabId , msg . Add ( msg . MESSAGE_ACTION . storage , { simpread, secret } ) ) ;
164+ } ) ;
165+ } else {
166+ setMenuAndIcon ( tab . id , - 1 ) ;
167+ }
168+ }
169+ } ) ;
170+
171+ /**
172+ * Listen chrome tab remove message
173+ */
174+ browser . tabs . onRemoved . addListener ( tabId => watch . Pull ( tabId ) ) ;
175+
176+ /**
177+ * Listen chrome page, include: `read`
178+ */
179+ browser . pageAction . onClicked . addListener ( function ( tab ) {
180+ browser . tabs . sendMessage ( tab . id , msg . Add ( msg . MESSAGE_ACTION . browser_click ) ) ;
181+ } ) ;
182+
183+ /**
184+ * Get current tab object
185+ *
186+ * @param {object } query
187+ * @param {function } callback
188+ */
189+ function getCurTab ( query , callback ) {
190+ if ( query . url && query . url . includes ( "#" ) ) {
191+ browser . tabs . query ( { } , tabs => callback ( tabs . filter ( tab => tab . url == query . url && tab . active ) ) ) ;
192+ } else browser . tabs . query ( query , function ( tabs ) { callback ( tabs ) ; } ) ;
193+ }
194+
195+ /**
196+ * Set page action icon and context menu
197+ *
198+ * @param {int } tab.id
199+ * @param {int } -1: disable icon;
200+ */
201+ function setMenuAndIcon ( id , code ) {
202+ let icon = "" ;
203+ if ( code == - 1 ) {
204+ menu . Update ( "tempread" ) ;
205+ browser . pageAction . setTitle ( { tabId : id , title : "简悦 - 当前页面未适配阅读模式,点击进入临时阅读模式" } ) ;
206+ } else {
207+ icon = "-enable" ;
208+ storage . option . menu . read === true && menu . Create ( "read" ) ;
209+ menu . Update ( "read" ) ;
210+ browser . pageAction . setTitle ( { tabId : id , title : "简悦 - 当前页面已适配阅读模式" } ) ;
211+ }
212+ browser . pageAction . show ( id ) ;
213+ browser . pageAction . setIcon ( { tabId : id , path : browser . extension . getURL ( `assets/images/icon16${ icon } .png` ) } ) ;
214+ }
215+
216+ /**
217+ * Listen browser page action
218+ */
219+ browser . browserAction . onClicked . addListener ( ( ) => browser . runtime . openOptionsPage ( ) ) ;
220+
221+ /**
222+ * Track
223+ *
224+ * @param {object } google analytics track object
225+ */
226+ function tracked ( { eventCategory, eventAction, eventLabel } ) {
227+ console . log ( "current track is" , eventCategory , eventAction , eventLabel )
228+ ga ( 'send' , {
229+ hitType : 'event' ,
230+ eventCategory,
231+ eventAction,
232+ eventLabel
233+ } ) ;
234+ }
235+
236+ /**
237+ * Google analytics
238+ */
239+ analytics ( ) ;
240+ function analytics ( ) {
241+ ( function ( i , s , o , g , r , a , m ) { i [ 'GoogleAnalyticsObject' ] = r ; i [ r ] = i [ r ] || function ( ) {
242+ ( i [ r ] . q = i [ r ] . q || [ ] ) . push ( arguments ) } , i [ r ] . l = 1 * new Date ( ) ; a = s . createElement ( o ) ,
243+ m = s . getElementsByTagName ( o ) [ 0 ] ; a . async = 1 ; a . src = g ; m . parentNode . insertBefore ( a , m )
244+ } ) ( window , document , 'script' , 'https://www.google-analytics.com/analytics.js' , 'ga' ) ;
245+ ga ( 'create' , 'UA-405976-12' , 'auto' ) ;
246+ ga ( 'send' , 'pageview' ) ;
247+ }
0 commit comments