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

Side by Side Diff: chrome/browser/chromeos/accessibility/spoken_feedback_event_rewriter.cc

Issue 1185753008: Proposed alternative for supporting ChromeVox keyboard commands. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove ui/events/* changes. Created 5 years, 6 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
OLDNEW
(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)) {
stevenjb 2015/06/25 16:10:14 We are seeing a crash in DispatchKeyToChromeVox wh
David Tseng 2015/06/25 16:44:06 According to the stack, it looks like the call to
oshima 2015/06/25 17:02:37 I couldn't access the stack info. Can you post it
oshima 2015/06/25 17:13:36 My guess is that this is called before profiles ar
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698