Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(386)

Side by Side Diff: chrome/browser/chromeos/accessibility_util.cc

Issue 7550027: Make it possible to load ChromeVox on the oobe and login screens. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/accessibility_util.h" 5 #include "chrome/browser/chromeos/accessibility_util.h"
6 6
7 #include "base/callback.h"
7 #include "chrome/browser/browser_process.h" 8 #include "chrome/browser/browser_process.h"
8 #include "chrome/browser/extensions/extension_accessibility_api.h" 9 #include "chrome/browser/extensions/extension_accessibility_api.h"
9 #include "chrome/browser/extensions/extension_service.h" 10 #include "chrome/browser/extensions/extension_service.h"
11 #include "chrome/browser/extensions/file_reader.h"
10 #include "chrome/browser/profiles/profile.h" 12 #include "chrome/browser/profiles/profile.h"
11 #include "chrome/browser/profiles/profile_manager.h" 13 #include "chrome/browser/profiles/profile_manager.h"
14 #include "chrome/common/extensions/extension_messages.h"
15 #include "chrome/common/extensions/extension_resource.h"
12 #include "chrome/common/pref_names.h" 16 #include "chrome/common/pref_names.h"
17 #include "content/browser/webui/web_ui.h"
18 #include "content/browser/renderer_host/render_view_host.h"
13 #include "grit/browser_resources.h" 19 #include "grit/browser_resources.h"
14 #include "ui/base/resource/resource_bundle.h" 20 #include "ui/base/resource/resource_bundle.h"
15 21
16 namespace chromeos { 22 namespace chromeos {
17 namespace accessibility { 23 namespace accessibility {
18 24
25 // Helper class that directly loads an extension's content scripts into
26 // all of the frames corresponding to a given RenderViewHost.
27 class ContentScriptLoader {
28 public:
29 // Initialize the ContentScriptLoader with the ID of the extension
30 // and the RenderViewHost where the scripts should be loaded.
31 ContentScriptLoader(const std::string& extension_id,
32 RenderViewHost* render_view_host)
33 : extension_id_(extension_id),
34 render_view_host_(render_view_host) {}
19 35
20 void EnableAccessibility(bool enabled) { 36 // Call this once with the ExtensionResource corresponding to each
37 // content script to be loaded.
38 void AppendScript(ExtensionResource resource) {
39 resources_.push(resource);
40 }
41
42 // Fianlly, call this method once to fetch all of the resources and
43 // load them. This method will delete this object when done.
44 void Run() {
45 if (resources_.empty()) {
46 delete this;
47 return;
48 }
49
50 ExtensionResource resource = resources_.front();
51 resources_.pop();
52 scoped_refptr<FileReader> reader(new FileReader(resource, NewCallback(
53 this, &ContentScriptLoader::OnFileLoaded)));
54 reader->Start();
55 }
56
57 private:
58 void OnFileLoaded(bool success, const std::string& data) {
59 if (success) {
60 ExtensionMsg_ExecuteCode_Params params;
61 params.request_id = 0;
62 params.extension_id = extension_id_;
63 params.is_javascript = true;
64 params.code = data;
65 params.all_frames = true;
66 params.in_main_world = false;
67 render_view_host_->Send(new ExtensionMsg_ExecuteCode(
68 render_view_host_->routing_id(), params));
69 }
70 Run();
71 }
72
73 std::string extension_id_;
74 RenderViewHost* render_view_host_;
75 std::queue<ExtensionResource> resources_;
76 };
77
78 void EnableAccessibility(bool enabled, WebUI* login_web_ui) {
21 bool accessibility_enabled = g_browser_process && 79 bool accessibility_enabled = g_browser_process &&
22 g_browser_process->local_state()->GetBoolean( 80 g_browser_process->local_state()->GetBoolean(
23 prefs::kAccessibilityEnabled); 81 prefs::kAccessibilityEnabled);
24 if (accessibility_enabled == enabled) { 82 if (accessibility_enabled == enabled) {
25 return; 83 return;
26 } 84 }
27 85
28 g_browser_process->local_state()->SetBoolean( 86 g_browser_process->local_state()->SetBoolean(
29 prefs::kAccessibilityEnabled, enabled); 87 prefs::kAccessibilityEnabled, enabled);
30 ExtensionAccessibilityEventRouter::GetInstance()-> 88 ExtensionAccessibilityEventRouter::GetInstance()->
31 SetAccessibilityEnabled(enabled); 89 SetAccessibilityEnabled(enabled);
32 90
33 // Load/Unload ChromeVox 91 // Load/Unload ChromeVox
34 Profile* profile = ProfileManager::GetDefaultProfile(); 92 Profile* profile = ProfileManager::GetDefaultProfile();
35 ExtensionService* extension_service = 93 ExtensionService* extension_service =
36 profile->GetExtensionService(); 94 profile->GetExtensionService();
37 std::string manifest = ResourceBundle::GetSharedInstance(). 95 std::string manifest = ResourceBundle::GetSharedInstance().
38 GetRawDataResource(IDR_CHROMEVOX_MANIFEST).as_string(); 96 GetRawDataResource(IDR_CHROMEVOX_MANIFEST).as_string();
39 FilePath path = FilePath(extension_misc::kAccessExtensionPath) 97 FilePath path = FilePath(extension_misc::kAccessExtensionPath)
40 .AppendASCII(extension_misc::kChromeVoxDirectoryName); 98 .AppendASCII(extension_misc::kChromeVoxDirectoryName);
41 ExtensionService::ComponentExtensionInfo info(manifest, path); 99 ExtensionService::ComponentExtensionInfo info(manifest, path);
42 if (enabled) { // Load ChromeVox 100 if (enabled) { // Load ChromeVox
43 extension_service->register_component_extension(info); 101 extension_service->register_component_extension(info);
44 extension_service->LoadComponentExtension(info); 102 const Extension* extension =
103 extension_service->LoadComponentExtension(info);
104
105 if (login_web_ui) {
106 RenderViewHost* render_view_host = login_web_ui->GetRenderViewHost();
107 ContentScriptLoader* loader = new ContentScriptLoader(
108 extension->id(), render_view_host);
109
110 for (size_t i = 0; i < extension->content_scripts().size(); i++) {
111 const UserScript& script = extension->content_scripts()[i];
112 for (size_t j = 0; j < script.js_scripts().size(); ++j) {
113 const UserScript::File &file = script.js_scripts()[j];
114 ExtensionResource resource = extension->GetResource(
115 file.relative_path());
116 loader->AppendScript(resource);
117 }
118 }
119 loader->Run(); // It cleans itself up when done.
120 }
121
45 } else { // Unload ChromeVox 122 } else { // Unload ChromeVox
46 extension_service->UnloadComponentExtension(info); 123 extension_service->UnloadComponentExtension(info);
47 extension_service->UnregisterComponentExtension(info); 124 extension_service->UnregisterComponentExtension(info);
48 } 125 }
49 } 126 }
50 127
51 void ToggleAccessibility() { 128 void ToggleAccessibility(WebUI* login_web_ui) {
52 bool accessibility_enabled = g_browser_process && 129 bool accessibility_enabled = g_browser_process &&
53 g_browser_process->local_state()->GetBoolean( 130 g_browser_process->local_state()->GetBoolean(
54 prefs::kAccessibilityEnabled); 131 prefs::kAccessibilityEnabled);
55 accessibility_enabled = !accessibility_enabled; 132 accessibility_enabled = !accessibility_enabled;
56 EnableAccessibility(accessibility_enabled); 133 EnableAccessibility(accessibility_enabled, login_web_ui);
57 }; 134 };
58 135
59 } // namespace accessibility 136 } // namespace accessibility
60 } // namespace chromeos 137 } // namespace chromeos
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/accessibility_util.h ('k') | chrome/browser/chromeos/login/webui_login_view.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698