| OLD | NEW |
| (Empty) |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter.h
" | |
| 6 | |
| 7 #include <string> | |
| 8 | |
| 9 #include "base/values.h" | |
| 10 #include "chrome/browser/browser_process.h" | |
| 11 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h" | |
| 12 #include "chrome/browser/profiles/profile_manager.h" | |
| 13 #include "chrome/common/extensions/api/commands/commands_handler.h" | |
| 14 #include "chrome/common/extensions/extension_constants.h" | |
| 15 #include "extensions/browser/event_router.h" | |
| 16 #include "extensions/browser/extension_registry.h" | |
| 17 #include "ui/events/event.h" | |
| 18 | |
| 19 bool SpokenFeedbackEventRewriterDelegate::IsSpokenFeedbackEnabled() const { | |
| 20 return true; | |
| 21 } | |
| 22 | |
| 23 bool SpokenFeedbackEventRewriterDelegate::DispatchKeyToChromeVox( | |
| 24 ui::KeyEvent key_event) { | |
| 25 int kAllModifiers = ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | | |
| 26 ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN; | |
| 27 | |
| 28 if (!g_browser_process->profile_manager()) | |
| 29 return false; | |
| 30 | |
| 31 content::BrowserContext* context = | |
| 32 g_browser_process->profile_manager()->GetLastUsedProfile(); | |
| 33 | |
| 34 const extensions::Extension* extension = | |
| 35 extensions::ExtensionRegistry::Get(context)->enabled_extensions().GetByID( | |
| 36 extension_misc::kChromeVoxExtensionId); | |
| 37 if (!extension) | |
| 38 return false; | |
| 39 | |
| 40 extensions::EventRouter* event_router = extensions::EventRouter::Get(context); | |
| 41 if (!event_router->ExtensionHasEventListener( | |
| 42 extension_misc::kChromeVoxExtensionId, "commands.onCommand")) | |
| 43 return false; | |
| 44 | |
| 45 const extensions::CommandMap* commands = | |
| 46 extensions::CommandsInfo::GetNamedCommands(extension); | |
| 47 if (!commands) | |
| 48 return false; | |
| 49 | |
| 50 int modifiers = key_event.flags() & kAllModifiers; | |
| 51 std::string command_name; | |
| 52 for (extensions::CommandMap::const_iterator iter = commands->begin(); | |
| 53 iter != commands->end(); ++iter) { | |
| 54 int command_modifiers = | |
| 55 iter->second.accelerator().modifiers() & kAllModifiers; | |
| 56 if (iter->second.accelerator().key_code() == key_event.key_code() && | |
| 57 command_modifiers == modifiers) | |
| 58 command_name = iter->second.command_name(); | |
| 59 } | |
| 60 | |
| 61 if (command_name.empty()) | |
| 62 return false; | |
| 63 | |
| 64 scoped_ptr<base::ListValue> args(new base::ListValue()); | |
| 65 args->Append(new base::StringValue(command_name)); | |
| 66 | |
| 67 scoped_ptr<extensions::Event> extension_event( | |
| 68 new extensions::Event("commands.onCommand", args.Pass())); | |
| 69 extension_event->restrict_to_browser_context = context; | |
| 70 | |
| 71 event_router->DispatchEventToExtension(extension_misc::kChromeVoxExtensionId, | |
| 72 extension_event.Pass()); | |
| 73 | |
| 74 return true; | |
| 75 } | |
| 76 | |
| 77 SpokenFeedbackEventRewriter::SpokenFeedbackEventRewriter( | |
| 78 SpokenFeedbackEventRewriterDelegate* delegate) | |
| 79 : delegate_(delegate) { | |
| 80 if (!delegate_) | |
| 81 delegate_ = &default_delegate_; | |
| 82 } | |
| 83 | |
| 84 SpokenFeedbackEventRewriter::~SpokenFeedbackEventRewriter() { | |
| 85 } | |
| 86 | |
| 87 ui::EventRewriteStatus SpokenFeedbackEventRewriter::RewriteEvent( | |
| 88 const ui::Event& event, | |
| 89 scoped_ptr<ui::Event>* new_event) { | |
| 90 if (!delegate_->IsSpokenFeedbackEnabled()) | |
| 91 return ui::EVENT_REWRITE_CONTINUE; | |
| 92 | |
| 93 if ((event.type() != ui::ET_KEY_PRESSED && | |
| 94 event.type() != ui::ET_KEY_RELEASED)) | |
| 95 return ui::EVENT_REWRITE_CONTINUE; | |
| 96 | |
| 97 const ui::KeyEvent key_event = static_cast<const ui::KeyEvent&>(event); | |
| 98 if (event.type() == ui::ET_KEY_RELEASED) { | |
| 99 std::vector<int>::iterator it = | |
| 100 std::find(captured_key_codes_.begin(), captured_key_codes_.end(), | |
| 101 key_event.key_code()); | |
| 102 if (it != captured_key_codes_.end()) { | |
| 103 captured_key_codes_.erase(it); | |
| 104 return ui::EVENT_REWRITE_DISCARD; | |
| 105 } | |
| 106 return ui::EVENT_REWRITE_CONTINUE; | |
| 107 } | |
| 108 | |
| 109 if (delegate_->DispatchKeyToChromeVox(key_event)) { | |
| 110 captured_key_codes_.push_back(key_event.key_code()); | |
| 111 return ui::EVENT_REWRITE_DISCARD; | |
| 112 } | |
| 113 return ui::EVENT_REWRITE_CONTINUE; | |
| 114 } | |
| 115 | |
| 116 ui::EventRewriteStatus SpokenFeedbackEventRewriter::NextDispatchEvent( | |
| 117 const ui::Event& last_event, | |
| 118 scoped_ptr<ui::Event>* new_event) { | |
| 119 return ui::EVENT_REWRITE_CONTINUE; | |
| 120 } | |
| OLD | NEW |