From 303b707fbf8ba15c12db9350b91b0a4e0cb90052 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Wed, 2 Aug 2023 11:02:16 +0200 Subject: [PATCH] fix: update `chrome.i18n` for Manifest v3 (#39291) fix: update chrome.i18n for Manifest v3 --- shell/common/extensions/api/i18n.json | 92 ++++++++++--------- spec/extensions-spec.ts | 92 ++++++++++++++++++- .../{ => v2}/_locales/en/messages.json | 0 .../extensions/chrome-i18n/{ => v2}/main.js | 0 .../chrome-i18n/{ => v2}/manifest.json | 0 .../chrome-i18n/v3/_locales/es/messages.json | 6 ++ .../extensions/chrome-i18n/v3/main.js | 36 ++++++++ .../extensions/chrome-i18n/v3/manifest.json | 17 ++++ 8 files changed, 197 insertions(+), 46 deletions(-) rename spec/fixtures/extensions/chrome-i18n/{ => v2}/_locales/en/messages.json (100%) rename spec/fixtures/extensions/chrome-i18n/{ => v2}/main.js (100%) rename spec/fixtures/extensions/chrome-i18n/{ => v2}/manifest.json (100%) create mode 100644 spec/fixtures/extensions/chrome-i18n/v3/_locales/es/messages.json create mode 100644 spec/fixtures/extensions/chrome-i18n/v3/main.js create mode 100644 spec/fixtures/extensions/chrome-i18n/v3/manifest.json diff --git a/shell/common/extensions/api/i18n.json b/shell/common/extensions/api/i18n.json index 01bc8b1759d8..41678f21e6a9 100644 --- a/shell/common/extensions/api/i18n.json +++ b/shell/common/extensions/api/i18n.json @@ -1,4 +1,4 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -18,15 +18,20 @@ "name": "getAcceptLanguages", "type": "function", "description": "Gets the accept-languages of the browser. This is different from the locale used by the browser; to get the locale, use $(ref:i18n.getUILanguage).", - "parameters": [ - { - "type": "function", - "name": "callback", - "parameters": [ - {"name": "languages", "type": "array", "items": {"$ref": "LanguageCode"}, "description": "Array of LanguageCode"} - ] - } - ] + "parameters": [], + "returns_async": { + "name": "callback", + "parameters": [ + { + "name": "languages", + "type": "array", + "items": { + "$ref": "LanguageCode" + }, + "description": "Array of LanguageCode" + } + ] + } }, { "name": "getMessage", @@ -85,44 +90,41 @@ "name": "text", "minimum": 0, "description": "User input string to be translated." - }, - { - "type": "function", - "name": "callback", - "parameters": [ - { - "type": "object", - "name": "result", - "description": "LanguageDetectionResult object that holds detected language reliability and array of DetectedLanguage", - "properties": { - "isReliable": { "type": "boolean", "description": "CLD detected language reliability" }, - "languages": - { - "type": "array", - "description": "array of detectedLanguage", - "items": - { - "type": "object", - "description": "DetectedLanguage object that holds detected ISO language code and its percentage in the input string", - "properties": - { - "language": - { - "$ref": "LanguageCode" - }, - "percentage": - { - "type": "integer", - "description": "The percentage of the detected language" - } - } - } + } + ], + "returns_async": { + "name": "callback", + "parameters": [ + { + "type": "object", + "name": "result", + "description": "LanguageDetectionResult object that holds detected langugae reliability and array of DetectedLanguage", + "properties": { + "isReliable": { + "type": "boolean", + "description": "CLD detected language reliability" + }, + "languages": { + "type": "array", + "description": "array of detectedLanguage", + "items": { + "type": "object", + "description": "DetectedLanguage object that holds detected ISO language code and its percentage in the input string", + "properties": { + "language": { + "$ref": "LanguageCode" + }, + "percentage": { + "type": "integer", + "description": "The percentage of the detected language" + } } + } } } - ] - } - ] + } + ] + } } ], "events": [] diff --git a/spec/extensions-spec.ts b/spec/extensions-spec.ts index 69bb5768c34e..b5a43fcd95fb 100644 --- a/spec/extensions-spec.ts +++ b/spec/extensions-spec.ts @@ -208,7 +208,7 @@ describe('chrome extensions', () => { }; beforeEach(async () => { const customSession = session.fromPartition(`persist:${uuid.v4()}`); - extension = await customSession.loadExtension(path.join(fixtures, 'extensions', 'chrome-i18n')); + extension = await customSession.loadExtension(path.join(fixtures, 'extensions', 'chrome-i18n', 'v2')); w = new BrowserWindow({ show: false, webPreferences: { session: customSession, nodeIntegration: true, contextIsolation: false } }); await w.loadURL(url); }); @@ -726,5 +726,95 @@ describe('chrome extensions', () => { expect(message).to.equal('Hello from background.js'); }); + + describe('chrome.i18n', () => { + let customSession: Session; + let w = null as unknown as BrowserWindow; + + before(async () => { + customSession = session.fromPartition(`persist:${uuid.v4()}`); + await customSession.loadExtension(path.join(fixtures, 'extensions', 'chrome-i18n', 'v3')); + }); + + beforeEach(() => { + w = new BrowserWindow({ + show: false, + webPreferences: { + session: customSession, + nodeIntegration: true + } + }); + }); + + afterEach(closeAllWindows); + + it('getAcceptLanguages', async () => { + await w.loadURL(url); + + const message = { method: 'getAcceptLanguages' }; + w.webContents.executeJavaScript(`window.postMessage('${JSON.stringify(message)}', '*')`); + + const [,, responseString] = await once(w.webContents, 'console-message'); + const response = JSON.parse(responseString); + + expect(response).to.be.an('array').that.is.not.empty('languages array is empty'); + }); + + it('getUILanguage', async () => { + await w.loadURL(url); + + const message = { method: 'getUILanguage' }; + w.webContents.executeJavaScript(`window.postMessage('${JSON.stringify(message)}', '*')`); + + const [,, responseString] = await once(w.webContents, 'console-message'); + const response = JSON.parse(responseString); + + expect(response).to.be.a('string'); + }); + + it('getMessage', async () => { + await w.loadURL(url); + + const message = { method: 'getMessage' }; + w.webContents.executeJavaScript(`window.postMessage('${JSON.stringify(message)}', '*')`); + + const [, , responseString] = await once(w.webContents, 'console-message'); + const response = JSON.parse(responseString); + + expect(response).to.equal('Hola mundo!!'); + }); + + it('detectLanguage', async () => { + await w.loadURL(url); + + const greetings = [ + 'Ich liebe dich', // German + 'Mahal kita', // Filipino + '愛してます', // Japanese + 'دوستت دارم', // Persian + 'Minä rakastan sinua' // Finnish + ]; + const message = { method: 'detectLanguage', args: [greetings] }; + w.webContents.executeJavaScript(`window.postMessage('${JSON.stringify(message)}', '*')`); + + const [, , responseString] = await once(w.webContents, 'console-message'); + const response = JSON.parse(responseString); + + expect(response).to.be.an('array'); + + for (const item of response) { + expect(Object.keys(item)).to.deep.equal(['isReliable', 'languages']); + } + + const languages = response.map((r: { isReliable: boolean, languages: any[] }) => r.languages[0]); + expect(languages).to.deep.equal([ + { language: 'de', percentage: 100 }, + { language: 'fil', percentage: 100 }, + { language: 'ja', percentage: 100 }, + { language: 'ps', percentage: 100 }, + { language: 'fi', percentage: 100 } + ]); + }); + }); }); }); diff --git a/spec/fixtures/extensions/chrome-i18n/_locales/en/messages.json b/spec/fixtures/extensions/chrome-i18n/v2/_locales/en/messages.json similarity index 100% rename from spec/fixtures/extensions/chrome-i18n/_locales/en/messages.json rename to spec/fixtures/extensions/chrome-i18n/v2/_locales/en/messages.json diff --git a/spec/fixtures/extensions/chrome-i18n/main.js b/spec/fixtures/extensions/chrome-i18n/v2/main.js similarity index 100% rename from spec/fixtures/extensions/chrome-i18n/main.js rename to spec/fixtures/extensions/chrome-i18n/v2/main.js diff --git a/spec/fixtures/extensions/chrome-i18n/manifest.json b/spec/fixtures/extensions/chrome-i18n/v2/manifest.json similarity index 100% rename from spec/fixtures/extensions/chrome-i18n/manifest.json rename to spec/fixtures/extensions/chrome-i18n/v2/manifest.json diff --git a/spec/fixtures/extensions/chrome-i18n/v3/_locales/es/messages.json b/spec/fixtures/extensions/chrome-i18n/v3/_locales/es/messages.json new file mode 100644 index 000000000000..088a39cc522d --- /dev/null +++ b/spec/fixtures/extensions/chrome-i18n/v3/_locales/es/messages.json @@ -0,0 +1,6 @@ +{ + "extName": { + "message": "Hola mundo!!", + "description": "Nombre de extensión" + } +} \ No newline at end of file diff --git a/spec/fixtures/extensions/chrome-i18n/v3/main.js b/spec/fixtures/extensions/chrome-i18n/v3/main.js new file mode 100644 index 000000000000..3d0c389d6fdc --- /dev/null +++ b/spec/fixtures/extensions/chrome-i18n/v3/main.js @@ -0,0 +1,36 @@ +/* global chrome */ + +chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { + sendResponse(request); +}); + +const map = { + getAcceptLanguages () { + chrome.i18n.getAcceptLanguages().then((languages) => { + console.log(JSON.stringify(languages)); + }); + }, + getMessage () { + const message = chrome.i18n.getMessage('extName'); + console.log(JSON.stringify(message)); + }, + getUILanguage () { + const language = chrome.i18n.getUILanguage(); + console.log(JSON.stringify(language)); + }, + async detectLanguage (texts) { + const result = []; + for (const text of texts) { + const language = await chrome.i18n.detectLanguage(text); + result.push(language); + } + console.log(JSON.stringify(result)); + } +}; + +const dispatchTest = (event) => { + const { method, args = [] } = JSON.parse(event.data); + map[method](...args); +}; + +window.addEventListener('message', dispatchTest, false); diff --git a/spec/fixtures/extensions/chrome-i18n/v3/manifest.json b/spec/fixtures/extensions/chrome-i18n/v3/manifest.json new file mode 100644 index 000000000000..e7ae09d39b40 --- /dev/null +++ b/spec/fixtures/extensions/chrome-i18n/v3/manifest.json @@ -0,0 +1,17 @@ +{ + "name": "chrome-i18n", + "version": "1.0", + "default_locale": "es", + "content_scripts": [ + { + "matches": [ + "" + ], + "js": [ + "main.js" + ], + "run_at": "document_start" + } + ], + "manifest_version": 3 +}