From c5b44c0259387030f9e3d31ae1db8903a95b6b67 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Mon, 11 Dec 2017 12:25:49 +0100 Subject: always initialize ContextMenuBuilder but not spellchecker --- src/webview/plugin.js | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) (limited to 'src/webview/plugin.js') diff --git a/src/webview/plugin.js b/src/webview/plugin.js index c877132b1..610dffc8e 100644 --- a/src/webview/plugin.js +++ b/src/webview/plugin.js @@ -1,14 +1,14 @@ import { ipcRenderer } from 'electron'; +import { ContextMenuListener, ContextMenuBuilder } from 'electron-spellchecker'; import path from 'path'; +import { isDevMode } from '../environment'; import RecipeWebview from './lib/RecipeWebview'; import Spellchecker from './spellchecker.js'; import './notifications.js'; import './ime.js'; -const spellchecker = new Spellchecker(); - ipcRenderer.on('initializeRecipe', (e, data) => { const modulePath = path.join(data.recipe.path, 'webview.js'); // Delete module from cache @@ -21,20 +21,27 @@ ipcRenderer.on('initializeRecipe', (e, data) => { } }); +let contextMenuBuilder = new ContextMenuBuilder(null, null, isDevMode); +const spellchecker = new Spellchecker(); + +new ContextMenuListener((info) => { // eslint-disable-line + contextMenuBuilder.showPopupMenu(info); +}); + ipcRenderer.on('settings-update', (e, data) => { - if (data.enableSpellchecking) { - if (!spellchecker.isEnabled) { - spellchecker.enable(); - - // TODO: this does not work yet, needs more testing - // if (data.spellcheckingLanguage !== 'auto') { - // console.log('set spellchecking language to', data.spellcheckingLanguage); - // spellchecker.switchLanguage(data.spellcheckingLanguage); - // } - } + if (data.enableSpellchecking && !spellchecker.isInitialized) { + spellchecker.initialize(); + + contextMenuBuilder = new ContextMenuBuilder(spellchecker.handler, null, isDevMode); + + new ContextMenuListener((info) => { // eslint-disable-line + contextMenuBuilder.showPopupMenu(info); + }); } }); +// initSpellche + document.addEventListener('DOMContentLoaded', () => { ipcRenderer.sendToHost('hello'); }, false); -- cgit v1.2.3-70-g09d2 From fc49f232d9ac116f2a3bd7667fdd3e553df7516f Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Wed, 13 Dec 2017 11:20:13 +0100 Subject: override spellchecker attribute on inputs to enable/disable spellchecker --- src/webview/plugin.js | 15 +++++---------- src/webview/spellchecker.js | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 10 deletions(-) (limited to 'src/webview/plugin.js') diff --git a/src/webview/plugin.js b/src/webview/plugin.js index 610dffc8e..cf38169d3 100644 --- a/src/webview/plugin.js +++ b/src/webview/plugin.js @@ -21,23 +21,18 @@ ipcRenderer.on('initializeRecipe', (e, data) => { } }); -let contextMenuBuilder = new ContextMenuBuilder(null, null, isDevMode); const spellchecker = new Spellchecker(); +spellchecker.initialize(); + +const contextMenuBuilder = new ContextMenuBuilder(spellchecker.handler, null, isDevMode); new ContextMenuListener((info) => { // eslint-disable-line contextMenuBuilder.showPopupMenu(info); }); ipcRenderer.on('settings-update', (e, data) => { - if (data.enableSpellchecking && !spellchecker.isInitialized) { - spellchecker.initialize(); - - contextMenuBuilder = new ContextMenuBuilder(spellchecker.handler, null, isDevMode); - - new ContextMenuListener((info) => { // eslint-disable-line - contextMenuBuilder.showPopupMenu(info); - }); - } + console.log('settings-update', data); + spellchecker.toggleSpellchecker(data.enableSpellchecking); }); // initSpellche diff --git a/src/webview/spellchecker.js b/src/webview/spellchecker.js index 5704779d7..a504a4039 100644 --- a/src/webview/spellchecker.js +++ b/src/webview/spellchecker.js @@ -6,6 +6,11 @@ export default class Spellchecker { isInitialized = false; handler = null; initRetries = 0; + DOMCheckInterval = null; + + get inputs() { + return document.querySelectorAll('input[type="text"], [contenteditable="true"], textarea'); + } initialize() { this.handler = new SpellCheckHandler(); @@ -38,5 +43,21 @@ export default class Spellchecker { this.isInitialized = true; } } + + toggleSpellchecker(enable = false) { + this.inputs.forEach((input) => { + input.setAttribute('spellcheck', enable); + }); + + this.intervalHandler(enable); + } + + intervalHandler(enable) { + clearInterval(this.DOMCheckInterval); + + if (enable) { + this.DOMCheckInterval = setInterval(() => this.toggleSpellchecker(enable), 30000); + } + } } -- cgit v1.2.3-70-g09d2 From 413bf160f1922eb56a3ea84eb1e13b04f2628662 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Thu, 14 Dec 2017 15:58:46 +0100 Subject: Remove IME handlers --- src/helpers/webview-ime-focus-helpers.js | 38 -------------------------------- src/webview/ime.js | 10 --------- src/webview/plugin.js | 1 - 3 files changed, 49 deletions(-) delete mode 100644 src/helpers/webview-ime-focus-helpers.js delete mode 100644 src/webview/ime.js (limited to 'src/webview/plugin.js') diff --git a/src/helpers/webview-ime-focus-helpers.js b/src/helpers/webview-ime-focus-helpers.js deleted file mode 100644 index 2593a5f26..000000000 --- a/src/helpers/webview-ime-focus-helpers.js +++ /dev/null @@ -1,38 +0,0 @@ -module.exports.releaseDocumentFocus = () => { - const element = document.createElement('span'); - document.body.appendChild(element); - - const range = document.createRange(); - range.setStart(element, 0); - - const selection = window.getSelection(); - selection.removeAllRanges(); - selection.addRange(range); - selection.removeAllRanges(); - - document.body.removeChild(element); -}; - -module.exports.claimDocumentFocus = () => { - const { activeElement } = document; - const selection = window.getSelection(); - - let selectionStart; - let selectionEnd; - let range; - - if (activeElement) ({ selectionStart, selectionEnd } = activeElement); - if (selection.rangeCount) range = selection.getRangeAt(0); - - const restoreOriginalSelection = () => { - if (selectionStart >= 0 && selectionEnd >= 0) { - activeElement.selectionStart = selectionStart; - activeElement.selectionEnd = selectionEnd; - } else if (range) { - selection.addRange(range); - } - }; - - exports.releaseDocumentFocus(); - window.requestAnimationFrame(restoreOriginalSelection); -}; diff --git a/src/webview/ime.js b/src/webview/ime.js deleted file mode 100644 index 43df6267c..000000000 --- a/src/webview/ime.js +++ /dev/null @@ -1,10 +0,0 @@ -const { ipcRenderer } = require('electron'); -const { claimDocumentFocus } = require('../helpers/webview-ime-focus-helpers'); - -ipcRenderer.on('claim-document-focus', claimDocumentFocus); - -window.addEventListener('DOMContentLoaded', () => { - if (document.querySelector('[autofocus]')) { - ipcRenderer.sendToHost('autofocus'); - } -}); diff --git a/src/webview/plugin.js b/src/webview/plugin.js index c877132b1..e2daf09dd 100644 --- a/src/webview/plugin.js +++ b/src/webview/plugin.js @@ -5,7 +5,6 @@ import RecipeWebview from './lib/RecipeWebview'; import Spellchecker from './spellchecker.js'; import './notifications.js'; -import './ime.js'; const spellchecker = new Spellchecker(); -- cgit v1.2.3-70-g09d2 From e2d6edf093823bbbab35ef3a1c62e946913507b8 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Fri, 5 Jan 2018 14:36:45 +0100 Subject: feat(Services): Improve handling of external links --- src/stores/ServicesStore.js | 4 ++++ src/webview/plugin.js | 16 ++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) (limited to 'src/webview/plugin.js') diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js index 87ee57a0d..bd5014aaa 100644 --- a/src/stores/ServicesStore.js +++ b/src/stores/ServicesStore.js @@ -336,6 +336,10 @@ export default class ServicesStore extends Store { redirect: false, }); } + } else if (channel === 'new-window') { + const url = args[0]; + + this.actions.app.openExternalUrl({ url }); } } diff --git a/src/webview/plugin.js b/src/webview/plugin.js index 9903ee07a..d9e021e6d 100644 --- a/src/webview/plugin.js +++ b/src/webview/plugin.js @@ -5,8 +5,8 @@ import path from 'path'; import { isDevMode } from '../environment'; import RecipeWebview from './lib/RecipeWebview'; -import Spellchecker from './spellchecker.js'; -import './notifications.js'; +import Spellchecker from './spellchecker'; +import './notifications'; ipcRenderer.on('initializeRecipe', (e, data) => { const modulePath = path.join(data.recipe.path, 'webview.js'); @@ -39,3 +39,15 @@ ipcRenderer.on('settings-update', (e, data) => { document.addEventListener('DOMContentLoaded', () => { ipcRenderer.sendToHost('hello'); }, false); + +// Patching window.open +const originalWindowOpen = window.open; + +window.open = (url, frameName, features) => { + // We need to differentiate if the link should be opened in a popup or in the systems default browser + if (!frameName && !features) { + return ipcRenderer.sendToHost('new-window', url); + } + + return originalWindowOpen(url, frameName, features); +}; -- cgit v1.2.3-70-g09d2