From 1632c4b837a428e801d8973e973a422099787623 Mon Sep 17 00:00:00 2001 From: Milan Burda Date: Fri, 8 Feb 2019 21:07:09 +0100 Subject: [PATCH] refactor: implement chrome.i18n.getMessage() without the remote module (#16739) * refactor: implement chrome.i18n.getMessage() without the remote module * replace navigator.language with app.getLocale() --- lib/browser/chrome-extension.js | 33 ++++++++++++++++++++++++---- lib/renderer/extensions/i18n.js | 39 +++++---------------------------- 2 files changed, 34 insertions(+), 38 deletions(-) diff --git a/lib/browser/chrome-extension.js b/lib/browser/chrome-extension.js index 99d12e74a2..55ab0051d9 100644 --- a/lib/browser/chrome-extension.js +++ b/lib/browser/chrome-extension.js @@ -4,6 +4,7 @@ const { app, webContents, BrowserWindow } = require('electron') const { getAllWebContents } = process.atomBinding('web_contents') const renderProcessPreferences = process.atomBinding('render_process_preferences').forAllWebContents() const { ipcMainInternal } = require('@electron/internal/browser/ipc-main-internal') +const ipcMainUtils = require('@electron/internal/browser/ipc-main-internal-utils') const { Buffer } = require('buffer') const fs = require('fs') @@ -166,10 +167,6 @@ ipcMainInternal.on('CHROME_RUNTIME_CONNECT', function (event, extensionId, conne page.webContents._sendInternalToAll(`CHROME_RUNTIME_ONCONNECT_${extensionId}`, event.sender.id, portId, connectInfo) }) -ipcMainInternal.on('CHROME_I18N_MANIFEST', function (event, extensionId) { - event.returnValue = manifestMap[extensionId] -}) - let resultID = 1 ipcMainInternal.on('CHROME_RUNTIME_SENDMESSAGE', function (event, extensionId, message, originResultID) { const page = backgroundPages[extensionId] @@ -201,6 +198,34 @@ ipcMainInternal.on('CHROME_TABS_SEND_MESSAGE', function (event, tabId, extension resultID++ }) +const getLanguage = () => { + return app.getLocale().replace(/-.*$/, '').toLowerCase() +} + +const getMessagesPath = (extensionId) => { + const metadata = manifestMap[extensionId] + if (!metadata) { + throw new Error(`Invalid extensionId: ${extensionId}`) + } + + const localesDirectory = path.join(metadata.srcDirectory, '_locales') + const language = getLanguage() + + try { + const filename = path.join(localesDirectory, language, 'messages.json') + fs.accessSync(filename, fs.constants.R_OK) + return filename + } catch (err) { + const defaultLocale = metadata.default_locale || 'en' + return path.join(localesDirectory, defaultLocale, 'messages.json') + } +} + +ipcMainUtils.handleSync('CHROME_GET_MESSAGES', function (event, extensionId) { + const messagesPath = getMessagesPath(extensionId) + return fs.readFileSync(messagesPath) +}) + const isChromeExtension = function (pageURL) { const { protocol } = url.parse(pageURL) return protocol === 'chrome-extension:' diff --git a/lib/renderer/extensions/i18n.js b/lib/renderer/extensions/i18n.js index 9554ff9a59..eca01f2d5a 100644 --- a/lib/renderer/extensions/i18n.js +++ b/lib/renderer/extensions/i18n.js @@ -6,46 +6,17 @@ // Does not implement predefined messages: // https://developer.chrome.com/extensions/i18n#overview-predefined -const { potentiallyRemoteRequire } = require('@electron/internal/renderer/remote') -const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal') -const fs = potentiallyRemoteRequire('fs') -const path = potentiallyRemoteRequire('path') +const ipcRendererUtils = require('@electron/internal/renderer/ipc-renderer-internal-utils') -let metadata - -const getExtensionMetadata = (extensionId) => { - if (!metadata) { - metadata = ipcRenderer.sendSync('CHROME_I18N_MANIFEST', extensionId) - } - return metadata -} - -const getMessagesPath = (extensionId, language) => { - const metadata = getExtensionMetadata(extensionId) - const localesDirectory = path.join(metadata.srcDirectory, '_locales') +const getMessages = (extensionId) => { try { - const filename = path.join(localesDirectory, language, 'messages.json') - fs.accessSync(filename, fs.constants.R_OK) - return filename - } catch (err) { - const defaultLocale = metadata.default_locale || 'en' - return path.join(localesDirectory, defaultLocale, 'messages.json') - } -} - -const getMessages = (extensionId, language) => { - try { - const messagesPath = getMessagesPath(extensionId, language) - return JSON.parse(fs.readFileSync(messagesPath)) || {} + const data = ipcRendererUtils.invokeSync('CHROME_GET_MESSAGES', extensionId) + return JSON.parse(data) || {} } catch (error) { return {} } } -const getLanguage = () => { - return navigator.language.replace(/-.*$/, '').toLowerCase() -} - const replaceNumberedSubstitutions = (message, substitutions) => { return message.replace(/\$(\d+)/, (_, number) => { const index = parseInt(number, 10) - 1 @@ -73,7 +44,7 @@ const replacePlaceholders = (message, placeholders, substitutions) => { } const getMessage = (extensionId, messageName, substitutions) => { - const messages = getMessages(extensionId, getLanguage()) + const messages = getMessages(extensionId) if (messages.hasOwnProperty(messageName)) { const { message, placeholders } = messages[messageName] return replacePlaceholders(message, placeholders, substitutions)