11import ConfigManager from './config-manager' ;
22import IconManager from './icon-manager' ;
3+ import Messenger from './messenger' ;
34import UserStorage from './user-storage' ;
4- import { simpleClone , getFontList , canInjectScript , isUrlInList } from './utils' ;
5+ import { simpleClone , getFontList , canInjectScript , isUrlInList , getUrlHost } from './utils' ;
56import { formatJson } from '../config/utils' ;
67import createCSSFilterStylesheet from '../generators/css-filter' ;
7- import { FilterConfig , TabInfo } from '../definitions' ;
8+ import { FilterConfig , TabInfo , ExtensionData } from '../definitions' ;
89
910export class Extension {
1011
@@ -14,15 +15,24 @@ export class Extension {
1415 filterConfig : FilterConfig ;
1516 fonts : string [ ] ;
1617 icon : IconManager ;
18+ messenger : Messenger ;
1719 user : UserStorage ;
1820
1921 constructor ( ) {
20-
21- this . listeners = new Set ( ) ;
2222 this . ready = false ;
2323
2424 this . icon = new IconManager ( ) ;
2525 this . config = new ConfigManager ( ) ;
26+ this . messenger = new Messenger ( {
27+ collect : ( ) => this . collectData ( ) ,
28+ getActiveTabInfo : async ( ) => await this . getActiveTabInfo ( ) ,
29+ enable : ( ) => this . enable ( ) ,
30+ disable : ( ) => this . disable ( ) ,
31+ setConfig : ( config ) => this . setConfig ( config ) ,
32+ toggleSitePattern : ( pattern ) => this . toggleSitePattern ( pattern ) ,
33+ applyDevInversionFixes : ( json ) => this . applyDevInversionFixes ( json ) ,
34+ resetDevInversionFixes : ( ) => this . resetDevInversionFixes ( ) ,
35+ } ) ;
2636
2737 // Subscribe on keyboard shortcut
2838 chrome . commands . onCommand . addListener ( ( command ) => {
@@ -70,7 +80,6 @@ export class Extension {
7080 loadFonts ( ) ,
7181 ] ) ;
7282
73-
7483 this . user = new UserStorage ( { defaultFilterConfig : this . config . DEFAULT_FILTER_CONFIG } ) ;
7584 const settings = await this . user . loadSettings ( ) ;
7685 if ( settings . enabled ) {
@@ -83,87 +92,72 @@ export class Extension {
8392 this . setConfig ( settings . config ) ;
8493 }
8594
95+ private collectData ( ) : ExtensionData {
96+ return {
97+ enabled : this . enabled ,
98+ filterConfig : this . filterConfig ,
99+ ready : this . ready ,
100+ fonts : this . fonts ,
101+ devInversionFixesText : this . getDevInversionFixesText ( ) ,
102+ } ;
103+ }
104+
86105 enable ( ) {
87106 this . enabled = true ;
88107 this . onAppToggle ( ) ;
89- this . invokeListeners ( ) ;
90108 }
91109
92110 disable ( ) {
93111 this . enabled = false ;
94112 this . onAppToggle ( ) ;
95- this . invokeListeners ( ) ;
96113 }
97114
98115 setConfig ( config : FilterConfig ) {
99116 this . filterConfig = { ...this . filterConfig , ...config } ;
100117 this . onConfigPropChanged ( ) ;
101- this . invokeListeners ( ) ;
102118 }
103119
104- protected listeners : Set < ( ) => void > ;
105-
106- addListener ( callback : ( ) => void ) {
107- this . listeners . add ( callback ) ;
108- }
109-
110- removeListener ( callback : ( ) => void ) {
111- this . listeners . delete ( callback ) ;
120+ private reportChanges ( ) {
121+ const info = this . collectData ( ) ;
122+ this . messenger . reportChanges ( info ) ;
112123 }
113124
114- protected invokeListeners ( ) {
115- this . listeners . forEach ( ( listener ) => listener ( ) ) ;
116- }
117-
118- /**
119- * Returns info of active tab
120- * of last focused window.
121- */
122- getActiveTabInfo ( callback : ( info : TabInfo ) => void ) {
123- chrome . tabs . query ( {
124- active : true ,
125- lastFocusedWindow : true
126- } , ( tabs ) => {
127- if ( tabs . length === 1 ) {
125+ getActiveTabInfo ( ) {
126+ return new Promise < TabInfo > ( ( resolve ) => {
127+ chrome . tabs . query ( {
128+ active : true ,
129+ lastFocusedWindow : true
130+ } , ( [ tab ] ) => {
128131 const { DARK_SITES } = this . config ;
129- const tab = tabs [ 0 ] ;
130132 const url = tab . url ;
131- const host = url . match ( / ^ ( .* ?: \/ { 2 , 3 } ) ? ( .+ ?) ( \/ | $ ) / ) [ 2 ] ;
132- const info : TabInfo = {
133- url,
134- host,
133+ resolve ( {
134+ url : tab . url ,
135135 isProtected : ! canInjectScript ( url ) ,
136136 isInDarkList : isUrlInList ( url , DARK_SITES ) ,
137- } ;
138- callback ( info ) ;
139- } else {
140- if ( this . config . DEBUG ) {
141- throw new Error ( 'Unexpected tabs count.' ) ;
142- }
143- console . error ( 'Unexpected tabs count.' ) ;
144- callback ( { url : '' , host : '' , isProtected : false , isInDarkList : false } ) ;
145- }
137+ } ) ;
138+ } ) ;
146139 } ) ;
147140 }
148141
142+ toggleSitePattern ( pattern : string ) {
143+ const siteList = this . filterConfig . siteList . slice ( ) ;
144+ const index = siteList . indexOf ( pattern ) ;
145+ if ( index < 0 ) {
146+ siteList . push ( pattern ) ;
147+ } else {
148+ siteList . splice ( index , 1 ) ;
149+ }
150+ this . setConfig ( Object . assign ( { } , this . filterConfig , { siteList} ) ) ;
151+ }
152+
149153 /**
150154 * Adds host name of last focused tab
151155 * into Sites List (or removes).
152156 */
153- toggleCurrentSite ( ) {
154- this . getActiveTabInfo ( ( info ) => {
155- if ( info . host ) {
156- const siteList = this . filterConfig . siteList . slice ( ) ;
157- const index = siteList . indexOf ( info . host ) ;
158- if ( index < 0 ) {
159- siteList . push ( info . host ) ;
160- } else {
161- // Remove site from list
162- siteList . splice ( index , 1 ) ;
163- }
164- this . setConfig ( Object . assign ( { } , this . filterConfig , { siteList} ) ) ;
165- }
166- } ) ;
157+ async toggleCurrentSite ( ) {
158+ const { url} = await this . getActiveTabInfo ( ) ;
159+ const host = getUrlHost ( url ) ;
160+ this . toggleSitePattern ( host ) ;
167161 }
168162
169163
@@ -217,6 +211,7 @@ export class Extension {
217211 } ) ;
218212 }
219213 this . saveUserSettings ( ) ;
214+ this . reportChanges ( ) ;
220215 }
221216
222217 protected onConfigPropChanged ( ) {
@@ -234,6 +229,7 @@ export class Extension {
234229 } ) ;
235230 }
236231 this . saveUserSettings ( ) ;
232+ this . reportChanges ( ) ;
237233 }
238234
239235
@@ -367,17 +363,17 @@ export class Extension {
367363 this . onConfigPropChanged ( ) ;
368364 }
369365
370- applyDevInversionFixes ( json : string , callback : ( err : Error ) => void ) {
366+ applyDevInversionFixes ( json : string ) {
371367 let obj ;
372368 try {
373369 obj = JSON . parse ( json ) ;
374370 const text = formatJson ( obj ) ;
375371 this . saveDevInversionFixes ( text ) ;
376372 this . config . handleInversionFixes ( obj ) ;
377373 this . onConfigPropChanged ( ) ;
378- callback ( null ) ;
374+ return null ;
379375 } catch ( err ) {
380- callback ( err ) ;
376+ return err ;
381377 }
382378 }
383379}
0 commit comments