diff --git a/app/Application.js b/app/Application.js index a8195530..79c56492 100644 --- a/app/Application.js +++ b/app/Application.js @@ -81,6 +81,18 @@ Ext.define('Rambox.Application', { tabPanel.setActiveTab(i); } } + ,{ + key: "f" + ,ctrl: true + ,alt: false + ,shift: false + ,handler: function(key) { + var currentTab = Ext.cq1('app-main').getActiveTab(); + if (currentTab.getWebView) { + currentTab.down('component').el.dom.send('findInPage'); + } + } + } ,{ key: "\t" ,ctrl: true diff --git a/app/ux/WebView.js b/app/ux/WebView.js index 69b23474..3f3e9d8d 100644 --- a/app/ux/WebView.js +++ b/app/ux/WebView.js @@ -190,7 +190,7 @@ Ext.define('Rambox.ux.WebView',{ } ,getUserAgent: function() { var ua = ipc.sendSync('getConfig').user_agent ? ipc.sendSync('getConfig').user_agent : Ext.getStore('ServicesList').getById(this.record.get('type')).get('userAgent') - return ua.length === 0 ? window.clientInformation.userAgent.replace(/Rambox\/([0-9]\.?)+\s/,'').replace(/Electron\/([0-9]\.?)+\s/,'') : ua; + return ua.length === 0 ? window.clientInformation.userAgent.replace(/Rambox\/([0-9]\.?)+\s/ig,'').replace(/Electron\/([0-9]\.?)+\s/ig,'') : ua; } ,statusBarConstructor: function(floating) { diff --git a/electron/main.js b/electron/main.js index 9132033b..673f3bfc 100644 --- a/electron/main.js +++ b/electron/main.js @@ -58,6 +58,8 @@ if (config.get('enable_hidpi_support') && (process.platform === 'win32')) { app.commandLine.appendSwitch('force-device-scale-factor', '1') } +app.commandLine.appendSwitch('lang', config.get('locale') === 'en' ? 'en-US' : config.get('locale')); + // Because we build it using Squirrel, it will assign UserModelId automatically, so we match it here to display notifications correctly. // https://github.com/electron-userland/electron-builder/issues/362 app.setAppUserModelId('com.grupovrs.ramboxce'); diff --git a/package-lock.json b/package-lock.json index 57e560c2..284aeac1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -399,7 +399,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -645,7 +644,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.7.tgz", "integrity": "sha512-5ix04IbXVIZ6nSRM4aZnwQfk40Td0D57WAl8LfhnICF6XwT4efCZYh0veOHvfDmgpbqE4ju5L5XEAMIcAe13Kw==", - "dev": true, "requires": { "bluebird": "^3.5.3" }, @@ -653,8 +651,7 @@ "bluebird": { "version": "3.5.4", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", - "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==", - "dev": true + "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==" } } }, @@ -759,8 +756,7 @@ "buffer-from": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", - "dev": true + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" }, "buffers": { "version": "0.1.1", @@ -2018,7 +2014,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -2030,6 +2026,11 @@ } } }, + "electron-find": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/electron-find/-/electron-find-1.0.5.tgz", + "integrity": "sha512-LmFp6wolElQwlnjFR4jo7cARUZq+siR0sCS5Qp5Jywz2puM5OJzjRRyUEHCMi9Pm7xLupVYjwNVF1JojVQ0QPA==" + }, "electron-is-dev": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.3.0.tgz", @@ -2246,6 +2247,54 @@ "conf": "^2.0.0" } }, + "electron-updater": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-3.2.0.tgz", + "integrity": "sha512-gWs8UsQszhkZrNYMm8Yx6lIU0w4666YzGsBZncm8wLTKJiKPZoC1qElRxFHafqr8+fOscv9+ntrgQrI+nQ63vw==", + "requires": { + "bluebird-lst": "^1.0.6", + "builder-util-runtime": "~7.0.0", + "electron-is-dev": "^0.3.0", + "fs-extra-p": "^7.0.0", + "js-yaml": "^3.12.0", + "lazy-val": "^1.0.3", + "lodash.isequal": "^4.5.0", + "pako": "^1.0.6", + "semver": "^5.6.0", + "source-map-support": "^0.5.9" + }, + "dependencies": { + "builder-util-runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-7.0.0.tgz", + "integrity": "sha512-T31IWtU82sk6eNvYPZksxk49yM9OtJN2fsJ1XQXFKRP85twNE1KTDFEtnVcRLHy13M++1RsDiAZPWU1O6EabQA==", + "requires": { + "bluebird-lst": "^1.0.6", + "debug": "^4.1.0", + "fs-extra-p": "^7.0.0", + "sax": "^1.2.4" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } + } + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -2278,8 +2327,7 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "execa": { "version": "0.7.0", @@ -2501,7 +2549,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-7.0.1.tgz", "integrity": "sha512-yhd2OV0HnHt2oitlp+X9hl2ReX4X/7kQeL7/72qzPHTZj5eUPGzAKOvEglU02Fa1OeG2rSy/aKB4WGVaLiF8tw==", - "dev": true, "requires": { "bluebird-lst": "^1.0.7", "fs-extra": "^7.0.1" @@ -2511,7 +2558,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -2522,7 +2568,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, "requires": { "graceful-fs": "^4.1.6" } @@ -2734,7 +2779,7 @@ }, "got": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { @@ -3106,7 +3151,6 @@ "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -3143,7 +3187,7 @@ "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true } @@ -3190,8 +3234,7 @@ "lazy-val": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz", - "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==", - "dev": true + "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==" }, "lazystream": { "version": "1.0.0", @@ -3282,6 +3325,11 @@ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", @@ -3783,6 +3831,11 @@ "semver": "^5.1.0" } }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + }, "parse-author": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", @@ -4414,8 +4467,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { "version": "5.5.0", @@ -4470,8 +4522,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-resolve": { "version": "0.5.2", @@ -4490,7 +4541,6 @@ "version": "0.5.12", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -4565,8 +4615,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { "version": "1.14.2", @@ -4938,8 +4987,7 @@ "universalify": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", - "dev": true + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" }, "unzip-response": { "version": "2.0.1", @@ -5205,7 +5253,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { diff --git a/package.json b/package.json index ba784888..c72bf6e6 100644 --- a/package.json +++ b/package.json @@ -185,6 +185,7 @@ "auto-launch-patched": "5.0.2", "crypto": "^1.0.1", "electron-contextmenu-wrapper": "2.0.0", + "electron-find": "^1.0.5", "electron-is-dev": "^0.3.0", "electron-log": "^2.2.17", "electron-store": "^2.0.0", diff --git a/resources/js/rambox-service-api.js b/resources/js/rambox-service-api.js index 36d24be8..cadd2036 100644 --- a/resources/js/rambox-service-api.js +++ b/resources/js/rambox-service-api.js @@ -2,8 +2,9 @@ * This file is loaded in the service web views to provide a Rambox API. */ -const { ipcRenderer } = require('electron'); +const { ipcRenderer, remote } = require('electron'); const { ContextMenuBuilder, ContextMenuListener } = require('electron-contextmenu-wrapper'); +const { FindInPage } = require('electron-find') /** * Make the Rambox API available via a global "rambox" variable. @@ -70,4 +71,12 @@ document.addEventListener("keydown", (event) => { charCode: event.charCode }; ipcRenderer.sendToHost('keydown', msg) -}); \ No newline at end of file +}); +let search; +document.addEventListener('DOMContentLoaded', function(e) { + search = new FindInPage(remote.getCurrentWebContents()) +}, false) + +ipcRenderer.on('findInPage', () => { + search.openFindWindow() +}) \ No newline at end of file