| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "content/browser/accessibility/accessibility_event_recorder.h" | 5 #include "content/browser/accessibility/accessibility_event_recorder.h" |
| 6 | 6 |
| 7 #include <oleacc.h> | 7 #include <oleacc.h> |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 << " WinAccessibilityEventMonitor at a time."; | 131 << " WinAccessibilityEventMonitor at a time."; |
| 132 instance_ = this; | 132 instance_ = this; |
| 133 win_event_hook_handle_ = SetWinEventHook( | 133 win_event_hook_handle_ = SetWinEventHook( |
| 134 EVENT_MIN, | 134 EVENT_MIN, |
| 135 EVENT_MAX, | 135 EVENT_MAX, |
| 136 GetModuleHandle(NULL), | 136 GetModuleHandle(NULL), |
| 137 &AccessibilityEventRecorderWin::WinEventHookThunk, | 137 &AccessibilityEventRecorderWin::WinEventHookThunk, |
| 138 GetCurrentProcessId(), | 138 GetCurrentProcessId(), |
| 139 0, // Hook all threads | 139 0, // Hook all threads |
| 140 WINEVENT_INCONTEXT); | 140 WINEVENT_INCONTEXT); |
| 141 LOG(INFO) << "SetWinEventHook handle: " << win_event_hook_handle_; |
| 142 CHECK(win_event_hook_handle_); |
| 141 } | 143 } |
| 142 | 144 |
| 143 AccessibilityEventRecorderWin::~AccessibilityEventRecorderWin() { | 145 AccessibilityEventRecorderWin::~AccessibilityEventRecorderWin() { |
| 144 UnhookWinEvent(win_event_hook_handle_); | 146 UnhookWinEvent(win_event_hook_handle_); |
| 145 instance_ = NULL; | 147 instance_ = NULL; |
| 146 } | 148 } |
| 147 | 149 |
| 148 void AccessibilityEventRecorderWin::OnWinEventHook( | 150 void AccessibilityEventRecorderWin::OnWinEventHook( |
| 149 HWINEVENTHOOK handle, | 151 HWINEVENTHOOK handle, |
| 150 DWORD event, | 152 DWORD event, |
| 151 HWND hwnd, | 153 HWND hwnd, |
| 152 LONG obj_id, | 154 LONG obj_id, |
| 153 LONG child_id, | 155 LONG child_id, |
| 154 DWORD event_thread, | 156 DWORD event_thread, |
| 155 DWORD event_time) { | 157 DWORD event_time) { |
| 158 // http://crbug.com/440579 TODO(dmazzoni): remove most logging in this file, |
| 159 // or change to VLOG(1), once flakiness on CrWinClang testers is fixed. |
| 160 LOG(INFO) << "OnWinEventHook handle=" << handle |
| 161 << " event=" << event |
| 162 << " hwnd=" << hwnd |
| 163 << " obj_id=" << obj_id |
| 164 << " child_id=" << child_id |
| 165 << " event_thread=" << event_thread |
| 166 << " event_time=" << event_time; |
| 167 |
| 156 base::win::ScopedComPtr<IAccessible> browser_accessible; | 168 base::win::ScopedComPtr<IAccessible> browser_accessible; |
| 157 HRESULT hr = AccessibleObjectFromWindow( | 169 HRESULT hr = AccessibleObjectFromWindow( |
| 158 hwnd, | 170 hwnd, |
| 159 obj_id, | 171 obj_id, |
| 160 IID_IAccessible, | 172 IID_IAccessible, |
| 161 reinterpret_cast<void**>(browser_accessible.Receive())); | 173 reinterpret_cast<void**>(browser_accessible.Receive())); |
| 162 if (!SUCCEEDED(hr)) { | 174 if (!SUCCEEDED(hr)) { |
| 163 // Note: our event hook will pick up some superfluous events we | 175 // Note: our event hook will pick up some superfluous events we |
| 164 // don't care about, so it's safe to just ignore these failures. | 176 // don't care about, so it's safe to just ignore these failures. |
| 165 // Same below for other HRESULT checks. | 177 // Same below for other HRESULT checks. |
| 166 VLOG(1) << "Ignoring result " << hr << " from AccessibleObjectFromWindow"; | 178 LOG(INFO) << "Ignoring result " << hr << " from AccessibleObjectFromWindow"; |
| 167 return; | 179 return; |
| 168 } | 180 } |
| 169 | 181 |
| 170 base::win::ScopedVariant childid_variant(child_id); | 182 base::win::ScopedVariant childid_variant(child_id); |
| 171 base::win::ScopedComPtr<IDispatch> dispatch; | 183 base::win::ScopedComPtr<IDispatch> dispatch; |
| 172 hr = browser_accessible->get_accChild(childid_variant, dispatch.Receive()); | 184 hr = browser_accessible->get_accChild(childid_variant, dispatch.Receive()); |
| 173 if (!SUCCEEDED(hr) || !dispatch) { | 185 if (!SUCCEEDED(hr) || !dispatch) { |
| 174 VLOG(1) << "Ignoring result " << hr << " and result " << dispatch | 186 LOG(INFO) << "Ignoring result " << hr << " and result " << dispatch |
| 175 << " from get_accChild"; | 187 << " from get_accChild"; |
| 176 return; | 188 return; |
| 177 } | 189 } |
| 178 | 190 |
| 179 base::win::ScopedComPtr<IAccessible> iaccessible; | 191 base::win::ScopedComPtr<IAccessible> iaccessible; |
| 180 hr = dispatch.QueryInterface(iaccessible.Receive()); | 192 hr = dispatch.QueryInterface(iaccessible.Receive()); |
| 181 if (!SUCCEEDED(hr)) { | 193 if (!SUCCEEDED(hr)) { |
| 182 VLOG(1) << "Ignoring result " << hr << " from QueryInterface"; | 194 LOG(INFO) << "Ignoring result " << hr << " from QueryInterface"; |
| 183 return; | 195 return; |
| 184 } | 196 } |
| 185 | 197 |
| 186 std::string event_str = AccessibilityEventToStringUTF8(event); | 198 std::string event_str = AccessibilityEventToStringUTF8(event); |
| 187 if (event_str.empty()) { | 199 if (event_str.empty()) { |
| 188 VLOG(1) << "Ignoring event " << event; | 200 LOG(INFO) << "Ignoring event " << event; |
| 189 return; | 201 return; |
| 190 } | 202 } |
| 191 | 203 |
| 192 base::win::ScopedVariant childid_self(CHILDID_SELF); | 204 base::win::ScopedVariant childid_self(CHILDID_SELF); |
| 193 base::win::ScopedVariant role; | 205 base::win::ScopedVariant role; |
| 194 iaccessible->get_accRole(childid_self, role.Receive()); | 206 iaccessible->get_accRole(childid_self, role.Receive()); |
| 195 base::win::ScopedBstr name_bstr; | 207 base::win::ScopedBstr name_bstr; |
| 196 iaccessible->get_accName(childid_self, name_bstr.Receive()); | 208 iaccessible->get_accName(childid_self, name_bstr.Receive()); |
| 197 base::win::ScopedBstr value_bstr; | 209 base::win::ScopedBstr value_bstr; |
| 198 iaccessible->get_accValue(childid_self, value_bstr.Receive()); | 210 iaccessible->get_accValue(childid_self, value_bstr.Receive()); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 222 IA2TextSegment new_text; | 234 IA2TextSegment new_text; |
| 223 if (SUCCEEDED(accessible_text->get_newText(&new_text))) { | 235 if (SUCCEEDED(accessible_text->get_newText(&new_text))) { |
| 224 log += base::StringPrintf(" new_text={'%s' start=%d end=%d}", | 236 log += base::StringPrintf(" new_text={'%s' start=%d end=%d}", |
| 225 BstrToUTF8(new_text.text).c_str(), | 237 BstrToUTF8(new_text.text).c_str(), |
| 226 new_text.start, | 238 new_text.start, |
| 227 new_text.end); | 239 new_text.end); |
| 228 } | 240 } |
| 229 } | 241 } |
| 230 } | 242 } |
| 231 | 243 |
| 244 LOG(INFO) << "Got event log: " << log; |
| 245 |
| 232 event_logs_.push_back(log); | 246 event_logs_.push_back(log); |
| 233 } | 247 } |
| 234 | 248 |
| 235 } // namespace content | 249 } // namespace content |
| OLD | NEW |