OLD | NEW |
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 |
OLD | NEW |