aboutsummaryrefslogtreecommitdiffstats
path: root/src/models/Service.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/models/Service.js')
-rw-r--r--src/models/Service.js54
1 files changed, 45 insertions, 9 deletions
diff --git a/src/models/Service.js b/src/models/Service.js
index f073ac9fc..dc8febe0b 100644
--- a/src/models/Service.js
+++ b/src/models/Service.js
@@ -2,6 +2,8 @@ import { autorun, computed, observable } from 'mobx';
2import normalizeUrl from 'normalize-url'; 2import normalizeUrl from 'normalize-url';
3import path from 'path'; 3import path from 'path';
4 4
5import userAgent from '../helpers/userAgent-helpers';
6
5const debug = require('debug')('Ferdi:Service'); 7const debug = require('debug')('Ferdi:Service');
6 8
7export const RESTRICTION_TYPES = { 9export const RESTRICTION_TYPES = {
@@ -74,6 +76,20 @@ export default class Service {
74 76
75 @observable restrictionType = null; 77 @observable restrictionType = null;
76 78
79 @observable isHibernationEnabled = false;
80
81 @observable lastUsed = Date.now(); // timestamp
82
83 @observable lastPoll = null;
84
85 @observable lastPollAnswer = null;
86
87 @observable lostRecipeConnection = false;
88
89 @observable lostRecipeReloadAttempt = 0;
90
91 @observable chromelessUserAgent = false;
92
77 constructor(data, recipe) { 93 constructor(data, recipe) {
78 if (!data) { 94 if (!data) {
79 console.error('Service config not valid'); 95 console.error('Service config not valid');
@@ -119,6 +135,8 @@ export default class Service {
119 135
120 this.spellcheckerLanguage = data.spellcheckerLanguage !== undefined ? data.spellcheckerLanguage : this.spellcheckerLanguage; 136 this.spellcheckerLanguage = data.spellcheckerLanguage !== undefined ? data.spellcheckerLanguage : this.spellcheckerLanguage;
121 137
138 this.isHibernationEnabled = data.isHibernationEnabled !== undefined ? data.isHibernationEnabled : this.isHibernationEnabled;
139
122 this.recipe = recipe; 140 this.recipe = recipe;
123 141
124 autorun(() => { 142 autorun(() => {
@@ -187,21 +205,34 @@ export default class Service {
187 } 205 }
188 206
189 @computed get userAgent() { 207 @computed get userAgent() {
190 let { userAgent } = window.navigator; 208 let ua = userAgent(this.chromelessUserAgent);
191 if (typeof this.recipe.overrideUserAgent === 'function') { 209 if (typeof this.recipe.overrideUserAgent === 'function') {
192 userAgent = this.recipe.overrideUserAgent(); 210 ua = this.recipe.overrideUserAgent();
193 } 211 }
194 212
195 // Remove Ferdi as it can cause incompatabilities with services. 213 return ua;
196 // This way, Ferdi will look like a normal Chrome instance
197 userAgent = userAgent.replace(/(Ferdi|Electron)([^\s]+\s)/g, '');
198
199 return userAgent;
200 } 214 }
201 215
202 initializeWebViewEvents({ handleIPCMessage, openWindow, stores }) { 216 initializeWebViewEvents({ handleIPCMessage, openWindow, stores }) {
203 const webContents = this.webview.getWebContents(); 217 const webContents = this.webview.getWebContents();
204 218
219 const handleUserAgent = (url, forwardingHack = false) => {
220 if (url.startsWith('https://accounts.google.com')) {
221 if (!this.chromelessUserAgent) {
222 debug('Setting user agent to chromeless for url', url);
223 this.webview.setUserAgent(userAgent(true));
224 if (forwardingHack) {
225 this.webview.loadURL(url);
226 }
227 this.chromelessUserAgent = true;
228 }
229 } else if (this.chromelessUserAgent) {
230 debug('Setting user agent to contain chrome');
231 this.webview.setUserAgent(this.userAgent);
232 this.chromelessUserAgent = false;
233 }
234 };
235
205 this.webview.addEventListener('ipc-message', e => handleIPCMessage({ 236 this.webview.addEventListener('ipc-message', e => handleIPCMessage({
206 serviceId: this.id, 237 serviceId: this.id,
207 channel: e.channel, 238 channel: e.channel,
@@ -209,7 +240,6 @@ export default class Service {
209 })); 240 }));
210 241
211 this.webview.addEventListener('new-window', (event, url, frameName, options) => { 242 this.webview.addEventListener('new-window', (event, url, frameName, options) => {
212 console.log('open window', event, url, frameName, options);
213 openWindow({ 243 openWindow({
214 event, 244 event,
215 url, 245 url,
@@ -218,6 +248,9 @@ export default class Service {
218 }); 248 });
219 }); 249 });
220 250
251
252 this.webview.addEventListener('will-navigate', event => handleUserAgent(event.url, true));
253
221 this.webview.addEventListener('did-start-loading', (event) => { 254 this.webview.addEventListener('did-start-loading', (event) => {
222 debug('Did start load', this.name, event); 255 debug('Did start load', this.name, event);
223 256
@@ -235,7 +268,10 @@ export default class Service {
235 }; 268 };
236 269
237 this.webview.addEventListener('did-frame-finish-load', didLoad.bind(this)); 270 this.webview.addEventListener('did-frame-finish-load', didLoad.bind(this));
238 this.webview.addEventListener('did-navigate', didLoad.bind(this)); 271 this.webview.addEventListener('did-navigate', (event) => {
272 handleUserAgent(event.url);
273 didLoad();
274 });
239 275
240 this.webview.addEventListener('did-fail-load', (event) => { 276 this.webview.addEventListener('did-fail-load', (event) => {
241 debug('Service failed to load', this.name, event); 277 debug('Service failed to load', this.name, event);