diff --git a/app/model/ServiceList.js b/app/model/ServiceList.js index 86f3537a..94714ed5 100644 --- a/app/model/ServiceList.js +++ b/app/model/ServiceList.js @@ -44,6 +44,14 @@ Ext.define('Rambox.model.ServiceList', { name: 'manual_notifications' ,type: 'boolean' ,defaultValue: false + },{ + name: 'passive_event_listeners' + ,type: 'boolean' + ,defaultValue: true + },{ + name: 'slowed_timers' + ,type: 'boolean' + ,defaultValue: true },{ name: 'userAgent' ,type: 'string' diff --git a/app/store/ServicesList.js b/app/store/ServicesList.js index 90104f20..a4b619b0 100644 --- a/app/store/ServicesList.js +++ b/app/store/ServicesList.js @@ -29,6 +29,7 @@ Ext.define('Rambox.store.ServicesList', { ,url: 'https://web.whatsapp.com/' ,type: 'messaging' ,js_unread: `let checkUnread=()=>{const elements=document.querySelectorAll(".CxUIE, .unread");let count=0;for(let i of elements)0===i.querySelectorAll('*[data-icon="muted"]').length&&count++;rambox.updateBadge(count)};setInterval(checkUnread,1e3);` + ,slowed_timers: false }, { id: 'slack' diff --git a/app/ux/WebView.js b/app/ux/WebView.js index 172d1681..eebf09a8 100644 --- a/app/ux/WebView.js +++ b/app/ux/WebView.js @@ -450,6 +450,23 @@ Ext.define('Rambox.ux.WebView',{ css_inject += custom_css; } } + // Use passive listeners by default + let passive_event_listeners = Ext.getStore('ServicesList').getById(me.record.get('type')).get('passive_event_listeners'); + if (passive_event_listeners && me.record.get('passive_event_listeners')) + { + // 3rdparty: This uses npm 'default-passive-events' 1.0.10 inline. Link to license: + // https://github.com/zzarcon/default-passive-events/blob/master/LICENSE + const passive_event_listeners = `const eventListenerOptionsSupported=()=>{let supported=!1;try{const opts=Object.defineProperty({},"passive",{get(){supported=!0}});window.addEventListener("test",null,opts),window.removeEventListener("test",null,opts)}catch(e){}return supported},defaultOptions={passive:!0,capture:!1},supportedPassiveTypes=["scroll","wheel","touchstart","touchmove","touchenter","touchend","touchleave","mouseout","mouseleave","mouseup","mousedown","mousemove","mouseenter","mousewheel","mouseover"],getDefaultPassiveOption=(passive,eventName)=>void 0!==passive?passive:-1!==supportedPassiveTypes.indexOf(eventName)&&defaultOptions.passive,getWritableOptions=options=>{const passiveDescriptor=Object.getOwnPropertyDescriptor(options,"passive");return passiveDescriptor&&!0!==passiveDescriptor.writable&&void 0===passiveDescriptor.set?Object.assign({},options):options},overwriteAddEvent=superMethod=>{EventTarget.prototype.addEventListener=function(type,listener,options){const usesListenerOptions="object"==typeof options&&null!==options,useCapture=usesListenerOptions?options.capture:options;(options=usesListenerOptions?getWritableOptions(options):{}).passive=getDefaultPassiveOption(options.passive,type),options.capture=void 0===useCapture?defaultOptions.capture:useCapture,superMethod.call(this,type,listener,options)},EventTarget.prototype.addEventListener._original=superMethod},supportsPassive=eventListenerOptionsSupported();if(supportsPassive){const addEvent=EventTarget.prototype.addEventListener;overwriteAddEvent(addEvent)}`; + js_inject += '{' + passive_event_listeners + '}'; + } + + // Use slowed timers by default + let slowed_timers = Ext.getStore('ServicesList').getById(me.record.get('type')).get('slowed_timers'); + if (slowed_timers && me.record.get('slowed_timers')) + { + const slowed_timers = `window.setTimeout=window.setTimeout;const __setTimeout=window.setTimeout;window.setTimeout=function(func,time){let a=time;return a<100&&(a=100),__setTimeout(func,a)};`; + js_inject += '{' + slowed_timers + '}'; + } } // Prevent Title blinking (some services have) and only allow when the title have an unread regex match: "(3) Title" @@ -458,21 +475,6 @@ Ext.define('Rambox.ux.WebView',{ js_inject += js_preventBlink; } - // Use passive listeners by default - if (me.record.get('passive_event_listeners')) - { - // 3rdparty: This uses npm 'default-passive-events' 1.0.10 inline. Link to license: - // https://github.com/zzarcon/default-passive-events/blob/master/LICENSE - const passive_event_listeners = `const eventListenerOptionsSupported=()=>{let supported=!1;try{const opts=Object.defineProperty({},"passive",{get(){supported=!0}});window.addEventListener("test",null,opts),window.removeEventListener("test",null,opts)}catch(e){}return supported},defaultOptions={passive:!0,capture:!1},supportedPassiveTypes=["scroll","wheel","touchstart","touchmove","touchenter","touchend","touchleave","mouseout","mouseleave","mouseup","mousedown","mousemove","mouseenter","mousewheel","mouseover"],getDefaultPassiveOption=(passive,eventName)=>void 0!==passive?passive:-1!==supportedPassiveTypes.indexOf(eventName)&&defaultOptions.passive,getWritableOptions=options=>{const passiveDescriptor=Object.getOwnPropertyDescriptor(options,"passive");return passiveDescriptor&&!0!==passiveDescriptor.writable&&void 0===passiveDescriptor.set?Object.assign({},options):options},overwriteAddEvent=superMethod=>{EventTarget.prototype.addEventListener=function(type,listener,options){const usesListenerOptions="object"==typeof options&&null!==options,useCapture=usesListenerOptions?options.capture:options;(options=usesListenerOptions?getWritableOptions(options):{}).passive=getDefaultPassiveOption(options.passive,type),options.capture=void 0===useCapture?defaultOptions.capture:useCapture,superMethod.call(this,type,listener,options)},EventTarget.prototype.addEventListener._original=superMethod},supportsPassive=eventListenerOptionsSupported();if(supportsPassive){const addEvent=EventTarget.prototype.addEventListener;overwriteAddEvent(addEvent)}`; - js_inject += '{' + passive_event_listeners + '}'; - } - - // Use slowed timers by default - if (me.record.get('slowed_timers')) - { - const slowed_timers = `window.setTimeout=window.setTimeout;const __setTimeout=window.setTimeout;window.setTimeout=function(func,time){let a=time;return a<100&&(a=100),__setTimeout(func,a)};`; - js_inject += '{' + slowed_timers + '}'; - } // Scroll always to top (bug) js_inject += 'document.body.scrollTop=0;'; diff --git a/app/view/add/Add.js b/app/view/add/Add.js index dda3c3d1..cbe8ba54 100644 --- a/app/view/add/Add.js +++ b/app/view/add/Add.js @@ -198,6 +198,7 @@ Ext.define('Rambox.view.add.Add',{ ,checked: me.edit ? me.record.get('passive_event_listeners') : true ,uncheckedValue: false ,inputValue: true + ,hidden: Ext.getStore('ServicesList').getById(me.record.get('type')).get('passive_event_listeners') === false } ,{ xtype: 'checkbox' @@ -206,6 +207,7 @@ Ext.define('Rambox.view.add.Add',{ ,checked: me.edit ? me.record.get('slowed_timers') : true ,uncheckedValue: false ,inputValue: true + ,hidden: Ext.getStore('ServicesList').getById(me.record.get('type')).get('slowed_timers') === false } ,{ xtype: 'checkbox'