File: service_worker.ts

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (77 lines) | stat: -rw-r--r-- 2,787 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

const INITIALIZED_KEY: string = 'sts_initialized';
// During development, chrome.accessibilityServicePrivate is behind a feature
// flag.
const SHOW_CONTEXT_MENU = chrome.accessibilityServicePrivate !== undefined;

// Matches one of the known GSuite apps which need the clipboard to find and
// read selected text. Includes sandbox and non-sandbox versions.
const GSUITE_APP_REGEXP =
    /^https:\/\/docs\.(?:sandbox\.)?google\.com\/(?:(?:presentation)|(?:document)|(?:spreadsheets)|(?:drawings)|(?:scenes)){1}\//;

async function selectToSpeakContextMenusCallback() {
  // Inform Lacros of the context menu click.
  if (SHOW_CONTEXT_MENU) {
    chrome.accessibilityServicePrivate.speakSelectedText();
  }
}

async function clipboardCopyInActiveGoogleDoc(url: string) {
  const queryOptions = {active: true, currentWindow: true};
  const [tab] = await chrome.tabs.query(queryOptions);
  if (tab?.id && tab.url && tab.url === url &&
      GSUITE_APP_REGEXP.exec(tab.url)) {
    chrome.scripting.executeScript({
      target: {tabId: tab.id, allFrames: true},
      files: ['embedded_a11y_helper/clipboard_copy.js'],
    });
  }
}

async function onSelectToSpeakChanged(
    details: chrome.accessibilityFeatures.ChromeSettingsResponse) {
  if (details.value) {
    const initialized = await chrome.storage.session.get([INITIALIZED_KEY]);
    if (initialized && initialized[INITIALIZED_KEY] === true) {
      return;
    }
    const storageUpdate = {[INITIALIZED_KEY]: true};
    chrome.storage.session.set(storageUpdate);

    //  Add a context menu item to selection contexts.
    if (SHOW_CONTEXT_MENU) {
      await chrome.contextMenus.create({
        title: chrome.i18n.getMessage(
            'select_to_speak_listen_context_menu_option_text'),
        contexts: [chrome.contextMenus.ContextType.SELECTION],
        id: 'embedded_a11y_helper',
      });
    }
    return;
  }

  // Clear the context menu if there was one.
  chrome.contextMenus.removeAll();
  const storageUpdate = {[INITIALIZED_KEY]: false};
  chrome.storage.session.set(storageUpdate);
}

async function main() {
  chrome.contextMenus.onClicked.addListener(selectToSpeakContextMenusCallback);
  chrome.accessibilityServicePrivate.clipboardCopyInActiveGoogleDoc.addListener(
      url => clipboardCopyInActiveGoogleDoc(url));

  // Set up based on current state.
  const currentDetails =
      await chrome.accessibilityFeatures.selectToSpeak.get({});
  await onSelectToSpeakChanged(currentDetails);

  // Add a listener for future changes.
  chrome.accessibilityFeatures.selectToSpeak.onChange.addListener(
      details => onSelectToSpeakChanged(details));
}

main();