Commit 5288b261 authored by dmazzoni's avatar dmazzoni Committed by Commit bot

Add skeleton for select-to-speak component extension.

Shares some of the build rules from ChromeVox, but with no extension tests or
Closure compilation rules yet. We can add those later as needed.

If you run Chrome with the --enable-experimental-accessibility-features
flag, then toggling the Select-to-speak checkbox in the accessibility
preferences loads or unloads this component extension, as verified by the
presence of the (empty) background script in chrome://inspect

BUG=593887
CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:closure_compilation
TBR=rdevlin.cronin

Review-Url: https://codereview.chromium.org/2216433004
Cr-Commit-Position: refs/heads/master@{#419318}
parent c434bdbf
......@@ -1290,6 +1290,7 @@ group("extra_resources") {
if (is_chromeos) {
public_deps += [ "//chrome/browser/resources/chromeos/chromevox" ]
public_deps += [ "//chrome/browser/resources/chromeos/select_to_speak" ]
}
if (enable_extensions) {
......
......@@ -304,6 +304,10 @@ AccessibilityManager::AccessibilityManager()
resources_path.Append(extension_misc::kChromeVoxExtensionPath),
base::Bind(&AccessibilityManager::PostUnloadChromeVox,
weak_ptr_factory_.GetWeakPtr())));
select_to_speak_loader_ = base::WrapUnique(new AccessibilityExtensionLoader(
extension_misc::kSelectToSpeakExtensionId,
resources_path.Append(extension_misc::kSelectToSpeakExtensionPath),
base::Closure()));
}
AccessibilityManager::~AccessibilityManager() {
......@@ -839,7 +843,12 @@ void AccessibilityManager::UpdateSelectToSpeakFromPref() {
return;
select_to_speak_enabled_ = enabled;
// TODO(dmazzoni): implement feature here.
if (enabled) {
select_to_speak_loader_->Load(profile_, "" /* init_script_str */,
base::Closure() /* done_cb */);
} else {
select_to_speak_loader_->Unload();
}
}
void AccessibilityManager::SetSwitchAccessEnabled(bool enabled) {
......
......@@ -406,6 +406,8 @@ class AccessibilityManager
std::unique_ptr<AccessibilityExtensionLoader> chromevox_loader_;
std::unique_ptr<AccessibilityExtensionLoader> select_to_speak_loader_;
base::WeakPtrFactory<AccessibilityManager> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(AccessibilityManager);
......
......@@ -36,6 +36,7 @@ bool IsComponentExtensionWhitelisted(const std::string& extension_id) {
extension_misc::kPdfExtensionId,
#if defined(OS_CHROMEOS)
extension_misc::kChromeVoxExtensionId,
extension_misc::kSelectToSpeakExtensionId,
extension_misc::kSpeechSynthesisExtensionId,
extension_misc::kZIPUnpackerExtensionId,
#endif
......
......@@ -5,6 +5,7 @@
import("//build/config/features.gni")
import("//testing/test.gni")
import("//chrome/test/base/js2gtest.gni")
import("run_jsbundler.gni")
assert(is_chromeos)
......@@ -17,16 +18,6 @@ declare_args() {
closure_library_dir =
"//chrome/third_party/chromevox/third_party/closure-library/closure/goog"
jsbundler_modules = rebase_path([
"depstree.py",
"source.py",
"treescan.py",
],
".",
"$closure_library_dir/../bin/build")
jsbundler_modules +=
[ "//third_party/WebKit/Source/devtools/scripts/rjsmin.py" ]
# List of all modules that are included in one or more of the production
# chromevox scripts.
chromevox_modules = [
......@@ -258,82 +249,6 @@ group("chromevox") {
}
}
template("run_jsbundler") {
assert(defined(invoker.mode))
assert(defined(invoker.sources))
if (defined(invoker.modules)) {
modules = invoker.modules
} else {
modules = []
}
if (defined(invoker.rewrite_rules)) {
rewrite_rules = invoker.rewrite_rules
} else {
rewrite_rules = []
}
action(target_name) {
script = "tools/jsbundler.py"
inputs = jsbundler_modules
sources = invoker.sources
if (defined(invoker.output_file)) {
if (defined(invoker.modules)) {
depfile = "$target_out_dir/" +
get_path_info(invoker.output_file, "name") + ".d"
}
outputs = [
invoker.output_file,
]
} else {
assert(!defined(invoker.modules))
stampfile = "$target_out_dir/${target_name}_copy.stamp"
outputs = [
stampfile,
]
}
args = [
"-m",
invoker.mode,
]
if (defined(depfile)) {
args += [
"--depfile",
rebase_path(depfile, root_build_dir),
]
}
if (defined(stampfile)) {
args += [
"--stampfile",
rebase_path(stampfile, root_build_dir),
]
}
if (defined(invoker.output_file)) {
args += [
"-o",
rebase_path(invoker.output_file, root_build_dir),
]
}
if (defined(invoker.dest_dir)) {
args += [
"-d",
rebase_path(invoker.dest_dir, root_build_dir),
]
}
foreach(module, modules) {
args += [
"-M",
rebase_path(module, root_build_dir),
]
}
foreach(rule, rewrite_rules) {
args += [
"-w",
rule,
]
}
args += rebase_path(sources, root_build_dir)
}
}
chromevox_background_script_loader_file = "cvox2/background/loader.js"
chromevox_content_script_loader_file = "chromevox/injected/loader.js"
chromevox_kbexplorer_loader_file = "chromevox/background/kbexplorer_loader.js"
......@@ -453,6 +368,8 @@ run_jsbundler("chromevox_copied_files") {
]
}
# TODO: refactor this into another file like generate_manifest.gni
# to share with other extensions.
template("manifest") {
version_file = "//chrome/VERSION"
version_script = "//build/util/version.py"
......
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
assert(is_chromeos)
closure_library_dir =
"//chrome/third_party/chromevox/third_party/closure-library/closure/goog"
jsbundler_modules = rebase_path([
"depstree.py",
"source.py",
"treescan.py",
],
".",
"$closure_library_dir/../bin/build")
jsbundler_modules +=
[ "//third_party/WebKit/Source/devtools/scripts/rjsmin.py" ]
template("run_jsbundler") {
assert(defined(invoker.mode))
assert(defined(invoker.sources))
if (defined(invoker.modules)) {
modules = invoker.modules
} else {
modules = []
}
if (defined(invoker.rewrite_rules)) {
rewrite_rules = invoker.rewrite_rules
} else {
rewrite_rules = []
}
action(target_name) {
script = "//chrome/browser/resources/chromeos/chromevox/tools/jsbundler.py"
inputs = jsbundler_modules
sources = invoker.sources
if (defined(invoker.output_file)) {
if (defined(invoker.modules)) {
depfile = "$target_out_dir/" +
get_path_info(invoker.output_file, "name") + ".d"
}
outputs = [
invoker.output_file,
]
} else {
assert(!defined(invoker.modules))
stampfile = "$target_out_dir/${target_name}_copy.stamp"
outputs = [
stampfile,
]
}
args = [
"-m",
invoker.mode,
]
if (defined(depfile)) {
args += [
"--depfile",
rebase_path(depfile, root_build_dir),
]
}
if (defined(stampfile)) {
args += [
"--stampfile",
rebase_path(stampfile, root_build_dir),
]
}
if (defined(invoker.output_file)) {
args += [
"-o",
rebase_path(invoker.output_file, root_build_dir),
]
}
if (defined(invoker.dest_dir)) {
args += [
"-d",
rebase_path(invoker.dest_dir, root_build_dir),
]
}
foreach(module, modules) {
args += [
"-M",
rebase_path(module, root_build_dir),
]
}
foreach(rule, rewrite_rules) {
args += [
"-w",
rule,
]
}
args += rebase_path(sources, root_build_dir)
}
}
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//build/config/features.gni")
import("//testing/test.gni")
import("//chrome/test/base/js2gtest.gni")
import("//chrome/browser/resources/chromeos/chromevox/run_jsbundler.gni")
assert(is_chromeos)
select_to_speak_out_dir = "$root_out_dir/resources/chromeos/select_to_speak"
group("select_to_speak") {
deps = [
":select_to_speak_copied_files",
":select_to_speak_guest_manifest",
":select_to_speak_manifest",
]
}
# Instead of setting up one copy target for each subdirectory, use a script
# to copy all files.
run_jsbundler("select_to_speak_copied_files") {
mode = "copy"
dest_dir = select_to_speak_out_dir
sources = [
"background.js",
]
rewrite_rules = [
rebase_path(".", root_build_dir) + ":",
rebase_path(closure_library_dir, root_build_dir) + ":closure",
]
}
# TODO: refactor this into another file like generate_manifest.gni
# to share with other extensions.
template("manifest") {
version_file = "//chrome/VERSION"
version_script = "//build/util/version.py"
template_file = "manifest.json.jinja2"
output_file = invoker.output_file
key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAukZ6JJWr0jHmFTkn0pcigpjI+cP0FqTo8FRIcCwy2fPeM+Ymf+7C9MK642i+Nhdr2qSsRF26AMIKbBdSDUnh04bfg5J/rKa/VO88LvXENYQMGhTo1y9mVg2OsbQJtEL9aTLU2G0SoKcr3g/+lggBKR5ydW1Qa0WGGAM9XrLm8iu/wn2uF4mfcMii6KfyEsAwWalpr/Td5WbtIoNNDpNeKO4ZSZJis1n9PZXqaOKpW7PqFDpEHw2PnPATxkcqj/wIx+Shgada0fhrzMlhXLhhj7ThSSWbuTz5n5NebuQ49/Z2ATgpBCSzYBVXEXMDe6LBBtGiZ/QR9UkA8Lz8bP6xIQIDAQAB"
action(target_name) {
script = "//chrome/browser/resources/chromeos/chromevox/tools/generate_manifest.py"
inputs = [
version_file,
version_script,
]
sources = [
template_file,
]
outputs = [
output_file,
]
args = [
"--key=$key",
"--version_file=" + rebase_path(version_file, root_build_dir),
"--output_manifest=" + rebase_path(output_file, root_build_dir),
]
if (defined(invoker.is_guest_manifest) && invoker.is_guest_manifest) {
args += [ "--is_guest_manifest=1" ]
}
args += rebase_path(sources, root_build_dir)
}
}
manifest("select_to_speak_manifest") {
output_file = "$select_to_speak_out_dir/manifest.json"
}
manifest("select_to_speak_guest_manifest") {
output_file = "$select_to_speak_out_dir/manifest_guest.json"
is_guest_manifest = true
}
dmazzoni@chromium.org
dtseng@chromium.org
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
{
{%if key is defined %}
"key": "{{key}}",
{% endif %}
"manifest_version": 2,
"name": "TODO: Translated Select to speak name",
"version": "{{set_version}}",
"description": "TODO: Translated Select to speak description",
{% if is_guest_manifest == '1' %}
"incognito": "split",
{% endif %}
"background": {
"scripts": [
"background.js"
]
},
"permissions": [
"accessibilityPrivate"
],
"automation": {
"desktop": true
}
}
......@@ -59,9 +59,10 @@ const char kMediaRouterStableExtensionId[] = "pkedcjkdefgpdelpbcmbmeomcjbeemfm";
#if defined(OS_CHROMEOS)
// The extension id for the built-in component extension.
const char kChromeVoxExtensionId[] =
"mndnfokpggljbaajbnioimlmbfngpief";
const char kChromeVoxExtensionId[] = "mndnfokpggljbaajbnioimlmbfngpief";
const char kChromeVoxExtensionPath[] = "chromeos/chromevox";
const char kSelectToSpeakExtensionId[] = "klbcgckkldhdhonijdbnhhaiedfkllef";
const char kSelectToSpeakExtensionPath[] = "chromeos/select_to_speak";
const char kGuestManifestFilename[] = "manifest_guest.json";
const char kBrailleImeExtensionId[] =
"jddehjeebkoimngcbdkaahpobgicbffp";
......
......@@ -198,6 +198,11 @@ extern const char kChromeVoxExtensionId[];
// Path to preinstalled ChromeVox screen reader extension (relative to
// |chrome::DIR_RESOURCES|).
extern const char kChromeVoxExtensionPath[];
// The extension id of the Select-to-speak extension.
extern const char kSelectToSpeakExtensionId[];
// Path to preinstalled Select-to-speak extension (relative to
// |chrome::DIR_RESOURCES|).
extern const char kSelectToSpeakExtensionPath[];
// Name of the manifest file in an extension when a special manifest is used
// for guest mode.
extern const char kGuestManifestFilename[];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment