From 0486977d19ddbe87d43eb8eac9d56b035eb16bba Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Wed, 27 Dec 2023 19:59:28 -0500 Subject: [PATCH] Update google docs injection --- .../accessibility/accessibility-controller.js | 26 +++++--- ext/js/accessibility/google-docs-xray.js | 30 +++++++++ ext/js/accessibility/google-docs.js | 61 ++----------------- 3 files changed, 52 insertions(+), 65 deletions(-) create mode 100644 ext/js/accessibility/google-docs-xray.js diff --git a/ext/js/accessibility/accessibility-controller.js b/ext/js/accessibility/accessibility-controller.js index 2b352948e8..a1f6d2ffb1 100644 --- a/ext/js/accessibility/accessibility-controller.js +++ b/ext/js/accessibility/accessibility-controller.js @@ -86,14 +86,24 @@ export class AccessibilityController { try { if (forceGoogleDocsHtmlRenderingAny) { if (await isContentScriptRegistered(id)) { return; } - /** @type {import('script-manager').RegistrationDetails} */ - const details = { - allFrames: true, - matches: ['*://docs.google.com/*'], - runAt: 'document_start', - js: ['js/accessibility/google-docs.js'] - }; - await registerContentScript(id, details); + try { + await registerContentScript(id, { + allFrames: true, + matches: ['*://docs.google.com/*'], + runAt: 'document_start', + js: ['js/accessibility/google-docs.js'], + world: 'MAIN' + }); + } catch (e) { + // Firefox doesn't support `world` field and will throw an error. + // In this case, use the xray vision version. + await registerContentScript(id, { + allFrames: true, + matches: ['*://docs.google.com/*'], + runAt: 'document_start', + js: ['js/accessibility/google-docs-xray.js'] + }); + } } else { await unregisterContentScript(id); } diff --git a/ext/js/accessibility/google-docs-xray.js b/ext/js/accessibility/google-docs-xray.js new file mode 100644 index 0000000000..ef293933a7 --- /dev/null +++ b/ext/js/accessibility/google-docs-xray.js @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2023 Yomitan Authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** Entry point. */ +function main() { + /** @type {Window} */ + // @ts-expect-error - Firefox Xray vision + const window2 = window.wrappedJSObject; + if (!(typeof window2 === 'object' && window2 !== null)) { return; } + // The extension ID below is on an allow-list that is used on the Google Docs webpage. + // @ts-expect-error - Adding a property to the global object + // eslint-disable-next-line no-underscore-dangle + window2._docs_annotate_canvas_by_ext = 'ogmnaimimemjmbakcfefmnahgdfhfami'; +} + +main(); \ No newline at end of file diff --git a/ext/js/accessibility/google-docs.js b/ext/js/accessibility/google-docs.js index 4bc398ff91..00266bb693 100644 --- a/ext/js/accessibility/google-docs.js +++ b/ext/js/accessibility/google-docs.js @@ -1,6 +1,5 @@ /* * Copyright (C) 2023 Yomitan Authors - * Copyright (C) 2021-2022 Yomichan Authors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,59 +15,7 @@ * along with this program. If not, see . */ -(async () => { - // Reentrant check - // @ts-expect-error - Checking a property to the global object - if (self.googleDocsAccessibilitySetup) { return; } - // @ts-expect-error - Adding a property to the global object - self.googleDocsAccessibilitySetup = true; - - /** - * @template {import('api').ApiNames} TAction - * @template {import('api').ApiParams} TParams - * @param {TAction} action - * @param {TParams} params - * @returns {Promise>} - */ - const invokeApi = (action, params) => { - return new Promise((resolve, reject) => { - chrome.runtime.sendMessage({action, params}, (response) => { - void chrome.runtime.lastError; - if (typeof response !== 'object' || response === null) { - reject(new Error('Unexpected response')); - } else if (typeof response.error !== 'undefined') { - reject(new Error('Invalid response')); - } else { - resolve(response.result); - } - }); - }); - }; - - const optionsContext = {depth: 0, url: location.href}; - /** @type {import('api').ApiReturn<'optionsGet'>} */ - let options; - try { - options = await invokeApi('optionsGet', {optionsContext}); - } catch (e) { - return; - } - - if (!options.accessibility.forceGoogleDocsHtmlRendering) { return; } - - // The extension ID below is on an allow-list that is used on the Google Docs webpage. - /* eslint-disable */ - // @ts-expect-error : Adding a property to the global object - const inject = () => { window._docs_annotate_canvas_by_ext = 'ogmnaimimemjmbakcfefmnahgdfhfami'; }; - /* eslint-enable */ - - let parent = document.head; - if (parent === null) { - parent = document.documentElement; - if (parent === null) { return; } - } - const script = document.createElement('script'); - script.textContent = `(${inject.toString()})();`; - parent.appendChild(script); - parent.removeChild(script); -})(); +// The extension ID below is on an allow-list that is used on the Google Docs webpage. +// @ts-expect-error - Adding a property to the global object +// eslint-disable-next-line no-underscore-dangle +window._docs_annotate_canvas_by_ext = 'ogmnaimimemjmbakcfefmnahgdfhfami';