From 09cb3da38796af72ea4f98781b07bb7677303a7c Mon Sep 17 00:00:00 2001 From: TheGoddessInari Date: Sun, 1 Sep 2019 18:45:41 -0700 Subject: [PATCH] Revamp userAgent code for services. You can put in your own arbitrary UA string, as well as separately select OSes from a menu and type in your own Chrome version string. --- app/Application.js | 1 + app/model/Service.js | 12 +++ app/model/ServiceList.js | 8 ++ app/store/OS.js | 14 +++ app/store/Services.js | 3 + app/ux/WebView.js | 63 +++++++---- app/view/add/Add.js | 180 ++++++++++++++++++++++++-------- app/view/add/AddController.js | 40 ++++++- app/view/main/MainController.js | 3 + 9 files changed, 260 insertions(+), 64 deletions(-) create mode 100644 app/store/OS.js diff --git a/app/Application.js b/app/Application.js index 802c6628..9abc09c4 100644 --- a/app/Application.js +++ b/app/Application.js @@ -13,6 +13,7 @@ Ext.define('Hamsket.Application', { ,stores: [ 'ServicesList' ,'Services' + ,'OS' ] ,config: { diff --git a/app/model/Service.js b/app/model/Service.js index 98db2634..0e5deadf 100644 --- a/app/model/Service.js +++ b/app/model/Service.js @@ -81,6 +81,18 @@ Ext.define('Hamsket.model.Service', { name: 'slowed_timers' ,type: 'boolean' ,defaultValue: true + },{ + name: 'userAgent' + ,type: 'string' + ,defaultValue: '' + },{ + name: 'os_override' + ,type: 'string' + ,defaultValue: '' + },{ + name: 'chrome_version' + ,type: 'string' + ,defaultValue: '' },{ name: 'zoomLevel' ,type: 'number' diff --git a/app/model/ServiceList.js b/app/model/ServiceList.js index 582b3abf..cb2e5d37 100644 --- a/app/model/ServiceList.js +++ b/app/model/ServiceList.js @@ -56,6 +56,14 @@ Ext.define('Hamsket.model.ServiceList', { name: 'userAgent' ,type: 'string' ,defaultValue: '' + },{ + name: 'os_override' + ,type: 'string' + ,defaultValue: '' + },{ + name: 'chrome_version' + ,type: 'string' + ,defaultValue: '' },{ name: 'note' ,type: 'string' diff --git a/app/store/OS.js b/app/store/OS.js new file mode 100644 index 00000000..0ea4e877 --- /dev/null +++ b/app/store/OS.js @@ -0,0 +1,14 @@ +Ext.define('Hamsket.store.OS', { + extend: 'Ext.data.Store' + ,alias: 'store.os' + + ,fields: ['platform', 'label'] + ,data: [ + { 'platform': '', 'label': '(none)'} + ,{ 'platform': 'win32', 'label': 'Windows'} + ,{ 'platform': 'linux', 'label': 'Linux'} + ,{ 'platform': 'darwin', 'label': 'MacOS'} + ,{ 'platform': 'freebsd', 'label': 'FreeBSD'} + ,{ 'platform': 'Solaris', 'label': 'Solaris'} + ] +}); \ No newline at end of file diff --git a/app/store/Services.js b/app/store/Services.js index fe0a37fb..9ce81063 100644 --- a/app/store/Services.js +++ b/app/store/Services.js @@ -42,6 +42,9 @@ Ext.define('Hamsket.store.Services', { ,custom_css_complex: service.get('custom_css_complex') ,passive_event_listeners: service.get('passive_event_listeners') ,slowed_timers: service.get('slowed_timers') + ,userAgent: service.get('userAgent') + ,os_override: service.get('os_override') + ,chrome_version: service.get('chrome_version') ,enabled: service.get('enabled') ,record: service ,tabConfig: { diff --git a/app/ux/WebView.js b/app/ux/WebView.js index d730f046..7efafc51 100644 --- a/app/ux/WebView.js +++ b/app/ux/WebView.js @@ -827,22 +827,41 @@ Ext.define('Hamsket.ux.WebView',{ } ,getUserAgent() { const me = this; + const user_platform = me.record.get('os_override'); + const service_platform = Ext.getStore('ServicesList').getById(me.record.get('type')).get('os_override'); + const platform = user_platform ? user_platform : + service_platform ? service_platform : + ''; + const user_version = me.record.get('chrome_version'); + const service_version = Ext.getStore('ServicesList').getById(me.record.get('type')).get('chrome_version'); + const chrome_version = user_version ? user_version : + service_version ? service_version : + ''; const default_ua = `Mozilla/5.0` + - ` (${me.getOSPlatform()})` + + ` (${me.getOSPlatform(platform)})` + ` AppleWebKit/537.36 (KHTML, like Gecko)` + - ` Chrome/${me.getChromeVersion()} Safari/537.36`; + ` Chrome/${me.getChromeVersion(chrome_version)} Safari/537.36`; // NOTE: Keep just in case we need to go back to the basics. // const default_ua = window.navigator.userAgent // .replace(`Electron/${me.getElectronVersion()} `,'') // .replace(`Hamsket/${me.getAppVersion()} `, ''); const service_ua = Ext.getStore('ServicesList').getById(me.record.get('type')).get('userAgent'); - const ua = service_ua ? service_ua : default_ua; + const user_ua = me.record.get('userAgent'); + const ua = (platform || chrome_version) ? default_ua : + user_ua ? user_ua : + service_ua ? service_ua : + default_ua; return ua; } - ,getOSArch() { + ,updateUserAgent() { + const me = this; + const webcontents = me.getWebContents(); + webcontents.setUserAgent(me.getUserAgent()); + } + ,getOSArch(platform) { const me = this; const remote = require('electron').remote; - const platform = remote.require('os').platform(); + platform = platform ? platform : remote.require('os').platform(); let arch = remote.require('os').arch(); switch (platform) { @@ -893,27 +912,27 @@ Ext.define('Hamsket.ux.WebView',{ } return arch; } - ,getOSPlatform() { + ,getOSPlatform(platform) { const me = this; - let platform = require('electron').remote.require('os').platform(); + platform = platform ? platform : require('electron').remote.require('os').platform(); switch (platform) { case 'win32': - platform = `Windows NT ${me.getOSRelease()}; ${me.getOSArch()}`; + platform = `Windows NT ${me.getOSRelease(platform)}; ${me.getOSArch(platform)}`; break; case 'linux': - platform = `X11; Linux ${me.getOSArch()}`; + platform = `X11; Linux ${me.getOSArch(platform)}`; break; case 'darwin': - platform = `${me.getOSArchType()} Mac OS X ${me.getOSRelease()}`; + platform = `${me.getOSArchType()} Mac OS X ${me.getOSRelease(platform)}`; break; case 'freebsd': - platform = `X11; FreeBSD ${me.getOSArch()}`; + platform = `X11; FreeBSD ${me.getOSArch(platform)}`; break; case 'sunos': platform = `X11; SunOS i86pc`; break; default: - platform = `X11; ${platform} ${me.getOSArch()}`; + platform = `X11; ${platform} ${me.getOSArch(platform)}`; } return platform; } @@ -927,15 +946,23 @@ Ext.define('Hamsket.ux.WebView',{ else return false; } - ,getOSRelease() { + ,getOSRelease(platform) { const me = this; const remote = require('electron').remote; - return me.isWindows() ? - remote.require('os').release().match(/([0-9]+\.[0-9]+)/)[0] - : remote.require('os').release(); + if (me.isWindows(platform)) { + if (platform) + { + return "Windows NT 10.0"; + } else { + return remote.require('os').release().match(/([0-9]+\.[0-9]+)/)[0]; + } + } + else { + return remote.require('os').release(); + } } - ,getChromeVersion() { - return require('electron').remote.require('process').versions['chrome']; + ,getChromeVersion(version) { + return version || require('electron').remote.require('process').versions['chrome']; } ,getElectronVersion() { return require('process').versions['electron']; diff --git a/app/view/add/Add.js b/app/view/add/Add.js index f27170cc..628b5a92 100644 --- a/app/view/add/Add.js +++ b/app/view/add/Add.js @@ -19,11 +19,11 @@ Ext.define('Hamsket.view.add.Add',{ // defaults ,modal: true ,width: 500 - ,height: 750 + ,height: 800 ,autoShow: true ,resizable: false ,draggable: false - ,bodyPadding: 20 + ,bodyPadding: 10 ,initComponent() { const me = this; @@ -252,54 +252,146 @@ Ext.define('Hamsket.view.add.Add',{ ] } ,{ - xtype: 'fieldset' + xtype: 'tabpanel' ,title: locale['app.window[7]'] - ,margin: '10 0 0 0' ,collapsible: true ,collapsed: true + ,closable: false + ,layout: 'hbox' + ,margin: '10 0 0 0' ,items: [ { - xtype: 'textarea' - ,fieldLabel: 'Custom JS' - ,allowBlank: true - ,name: 'custom_js' - ,value: me.edit ? me.record.get('custom_js') : '' - ,anchor: '100%' - ,height: 100 - ,labelWidth: 64 - ,fieldStyle: 'font-family: Consolas, Lucida Console, Monaco, monospace !important;' - }, - { - xtype: 'checkbox' - ,fieldLabel: 'Inject CSS via JS' - ,name: 'custom_css_complex' - ,value: me.edit ? me.record.get('custom_css_complex') : false - ,inputValue: true - ,uncheckedValue: false - ,labelWidth: 64 - }, - { - xtype: 'textarea' - ,fieldLabel: 'Custom CSS' - ,allowBlank: true - ,name: 'custom_css' - ,value: me.edit ? me.record.get('custom_css') : '' + xtype: 'fieldset' + ,title: 'Code Injection' ,anchor: '100%' - ,height: 100 - ,labelWidth: 64 - ,fieldStyle: 'font-family: Consolas, Lucida Console, Monaco, monospace !important;' - }, - { - xtype: 'textarea' - ,fieldLabel: 'Custom badge update JS' - ,allowBlank: true - ,name: 'js_unread' - ,value: me.edit ? me.record.get('js_unread') : '' - ,anchor: '100%' - ,height: 100 - ,labelWidth: 64 - ,fieldStyle: 'font-family: Consolas, Lucida Console, Monaco, monospace !important;' - } + ,items: [ + { + xtype: 'textarea' + ,fieldLabel: 'Custom JS' + ,allowBlank: true + ,name: 'custom_js' + ,value: me.edit ? me.record.get('custom_js') : '' + ,anchor: '100%' + ,height: 100 + ,labelWidth: 64 + ,fieldStyle: 'font-family: Consolas, Lucida Console, Monaco, monospace !important;' + }, + { + xtype: 'checkbox' + ,fieldLabel: 'Inject CSS via JS' + ,name: 'custom_css_complex' + ,value: me.edit ? me.record.get('custom_css_complex') : false + ,inputValue: true + ,uncheckedValue: false + ,labelWidth: 64 + }, + { + xtype: 'textarea' + ,fieldLabel: 'Custom CSS' + ,allowBlank: true + ,name: 'custom_css' + ,value: me.edit ? me.record.get('custom_css') : '' + ,anchor: '100%' + ,height: 100 + ,labelWidth: 64 + ,fieldStyle: 'font-family: Consolas, Lucida Console, Monaco, monospace !important;' + }, + { + xtype: 'textarea' + ,fieldLabel: 'Custom badge update JS' + ,allowBlank: true + ,name: 'js_unread' + ,value: me.edit ? me.record.get('js_unread') : '' + ,anchor: '100%' + ,height: 100 + ,labelWidth: 64 + ,fieldStyle: 'font-family: Consolas, Lucida Console, Monaco, monospace !important;' + } + ] + }, + { + xtype: 'fieldset' + ,title: 'User Agent' + ,anchor: '100%' + ,margin: '10 0 0 0' + ,items: [ + { + xtype: 'combobox' + ,fieldLabel: 'Override OS' + ,name: 'os_override' + ,anchor: '100%' + ,value: me.edit ? + me.record.get('os_override') ? me.record.get('os_override') : + me.service.get('os_override') ? me.service.get('os_override') : + '' + : me.record.get('os_override') ? me.record.get('os_override') : + '' + ,editable: false + ,forceSelection: true + ,queryMode: 'local' + ,store: 'OS' + ,displayField: 'label' + ,valueField: 'platform' + ,multiSelect: false + ,listeners: { + select(form, selected, opts) { + if (selected.data.platform === '') { + const version_override = form.nextSibling('[name=chrome_version]').value; + version_override || form.nextSibling('[name=userAgent]').setDisabled(false); + } else { + form.nextSibling('[name=userAgent]').setDisabled(true); + } + } + } + }, + { + xtype: 'textfield' + ,fieldLabel: 'Override Chrome Version' + ,name: 'chrome_version' + ,anchor: '100%' + ,value: me.edit ? + me.record.get('chrome_version') ? me.record.get('chrome_version') : + me.service.get('chrome_version') ? me.service.get('chrome_version') : + '' + : me.record.get('chrome_version') ? me.record.get('chrome_version') : + '' + ,listeners: { + change(form, new_value, old_value, opts) { + if (new_value === '') { + const os_override = form.previousSibling('[name=os_override]').value; + os_override || form.nextSibling('[name=userAgent]').setDisabled(false); + } else { + form.nextSibling('[name=userAgent]').setDisabled(true); + } + } + } + }, + { + xtype: 'textfield' + ,fieldLabel: 'Default User Agent' + ,name: 'defaultUserAgent' + ,anchor: '100%' + ,labelWidth: 64 + ,fieldStyle: 'font-family: Consolas, Lucida Console, Monaco, monospace !important;' + ,value: me.edit ? me.service.get('userAgent') ? me.service.get('userAgent') : + '' : + '' + ,hidden: me.edit ? !me.service.get('userAgent') : true + ,disabled: true + }, + { + xtype: 'textfield' + ,fieldLabel: 'Custom User Agent' + ,name: 'userAgent' + ,anchor: '100%' + ,allowBlank: true + ,labelWidth: 64 + ,fieldStyle: 'font-family: Consolas, Lucida Console, Monaco, monospace !important;' + ,value: me.edit ? me.record.get('userAgent') : '' + ,disabled: me.edit ? (me.record.get('os_override') || me.record.get('chrome_version')): false + } + ] + } ] } ,{ diff --git a/app/view/add/AddController.js b/app/view/add/AddController.js index 5f47e9be..974c81a8 100644 --- a/app/view/add/AddController.js +++ b/app/view/add/AddController.js @@ -44,6 +44,9 @@ Ext.define('Hamsket.view.add.AddController', { ,custom_css_complex: formValues.custom_css_complex ,passive_event_listeners: formValues.passive_event_listeners ,slowed_timers: formValues.slowed_timers + ,userAgent: formValues.userAgent + ,os_override: formValues.os_override + ,chrome_version: formValues.chrome_version }); const view = Ext.getCmp('tab_'+win.record.get('id')); @@ -67,8 +70,38 @@ Ext.define('Hamsket.view.add.AddController', { } } // Apply the JS Code of the Tab - if ( win.down('textarea').isDirty() ) { - Ext.Msg.confirm(locale['app.window[8]'].toUpperCase(), 'Hamsket needs to reload the service to execute the new JavaScript code. Do you want to do it now?', function( btnId ) { + let showNotify=false; + const standard_form_names = [ + 'custom_js' + ,'custom_css_complex' + ,'custom_css' + ,'js_unread' + ,'passive_event_listeners' + ,'slowed_timers' + ]; + for (form_name of standard_form_names) { + const form = win.down('[name=' + form_name + ']'); + if (form.isDirty()) { + showNotify = true; + break; + } + } + const ua_form_names = [ + 'os_override', + 'userAgent', + 'chrome_version' + ]; + for (form_name of ua_form_names) { + const form = win.down('[name=' + form_name + ']'); + if (form.isDirty()) { + showNotify = true; + view.updateUserAgent(); + break; + } + } + + if ( showNotify ) { + Ext.Msg.confirm(locale['app.window[8]'].toUpperCase(), 'Hamsket needs to reload the service to apply your changes. Do you want to do it now?', function( btnId ) { if ( btnId === 'yes' ) view.reloadService(); }); } @@ -101,6 +134,9 @@ Ext.define('Hamsket.view.add.AddController', { ,custom_css_complex: formValues.custom_css_complex ,passive_event_listeners: formValues.passive_event_listeners ,slowed_timers: formValues.slowed_timers + ,userAgent: formValues.userAgent + ,os_override: formValues.os_override + ,chrome_version: formValues.chrome_version }); service.save(); Ext.getStore('Services').add(service); diff --git a/app/view/main/MainController.js b/app/view/main/MainController.js index b6101d12..c617d4f0 100644 --- a/app/view/main/MainController.js +++ b/app/view/main/MainController.js @@ -112,6 +112,9 @@ Ext.define('Hamsket.view.main.MainController', { ,custom_css_complex: rec.get('custom_css_complex') ,passive_event_listeners: rec.get('passive_event_listeners') ,slowed_timers: rec.get('slowed_timers') + ,userAgent: rec.get('userAgent') + ,os_override: rec.get('os_override') + ,chrome_version: rec.get('chrome_version') ,enabled: rec.get('enabled') ,record: rec ,hidden: hideTab