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

Side by Side Diff: views/widget/native_widget_win.cc

Issue 8391010: Improve omnibox accessibility on Windows. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month 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 "views/widget/native_widget_win.h" 5 #include "views/widget/native_widget_win.h"
6 6
7 #include <dwmapi.h> 7 #include <dwmapi.h>
8 #include <shellapi.h> 8 #include <shellapi.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 NativeWidgetWin::NativeWidgetWin(internal::NativeWidgetDelegate* delegate) 373 NativeWidgetWin::NativeWidgetWin(internal::NativeWidgetDelegate* delegate)
374 : delegate_(delegate), 374 : delegate_(delegate),
375 ALLOW_THIS_IN_INITIALIZER_LIST(close_widget_factory_(this)), 375 ALLOW_THIS_IN_INITIALIZER_LIST(close_widget_factory_(this)),
376 active_mouse_tracking_flags_(0), 376 active_mouse_tracking_flags_(0),
377 use_layered_buffer_(false), 377 use_layered_buffer_(false),
378 layered_alpha_(255), 378 layered_alpha_(255),
379 ALLOW_THIS_IN_INITIALIZER_LIST(paint_layered_window_factory_(this)), 379 ALLOW_THIS_IN_INITIALIZER_LIST(paint_layered_window_factory_(this)),
380 ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET), 380 ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET),
381 can_update_layered_window_(true), 381 can_update_layered_window_(true),
382 restore_focus_when_enabled_(false), 382 restore_focus_when_enabled_(false),
383 accessibility_view_events_index_(-1),
384 accessibility_view_events_(kMaxAccessibilityViewEvents),
385 previous_cursor_(NULL), 383 previous_cursor_(NULL),
386 fullscreen_(false), 384 fullscreen_(false),
387 force_hidden_count_(0), 385 force_hidden_count_(0),
388 lock_updates_count_(0), 386 lock_updates_count_(0),
389 saved_window_style_(0), 387 saved_window_style_(0),
390 ignore_window_pos_changes_(false), 388 ignore_window_pos_changes_(false),
391 ALLOW_THIS_IN_INITIALIZER_LIST(ignore_pos_changes_factory_(this)), 389 ALLOW_THIS_IN_INITIALIZER_LIST(ignore_pos_changes_factory_(this)),
392 last_monitor_(NULL), 390 last_monitor_(NULL),
393 is_right_mouse_pressed_on_caption_(false), 391 is_right_mouse_pressed_on_caption_(false),
394 restored_enabled_(false), 392 restored_enabled_(false),
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
440 // We need to explicitly activate the window if we've been shown with a state 438 // We need to explicitly activate the window if we've been shown with a state
441 // that should activate, because if we're opened from a desktop shortcut while 439 // that should activate, because if we're opened from a desktop shortcut while
442 // an existing window is already running it doesn't seem to be enough to use 440 // an existing window is already running it doesn't seem to be enough to use
443 // one of these flags to activate the window. 441 // one of these flags to activate the window.
444 if (show_state == SW_SHOWNORMAL || show_state == SW_SHOWMAXIMIZED) 442 if (show_state == SW_SHOWNORMAL || show_state == SW_SHOWMAXIMIZED)
445 Activate(); 443 Activate();
446 444
447 SetInitialFocus(); 445 SetInitialFocus();
448 } 446 }
449 447
450 View* NativeWidgetWin::GetAccessibilityViewEventAt(int id) { 448 View* NativeWidgetWin::GetViewByAccessibleId(long child_id) {
451 // Convert from MSAA child id. 449 // The IAccessible2 unique ID is the negation of the child ID;
452 id = -(id + 1); 450 // see the comments in SendNativeAccessibilityEvent for details.
453 DCHECK(id >= 0 && id < kMaxAccessibilityViewEvents); 451 return FindViewByIA2UniqueId(-child_id, GetWidget()->GetRootView());
454 return accessibility_view_events_[id];
455 }
456
457 int NativeWidgetWin::AddAccessibilityViewEvent(View* view) {
458 accessibility_view_events_index_ =
459 (accessibility_view_events_index_ + 1) % kMaxAccessibilityViewEvents;
460 accessibility_view_events_[accessibility_view_events_index_] = view;
461
462 // Convert to MSAA child id.
463 return -(accessibility_view_events_index_ + 1);
464 }
465
466 void NativeWidgetWin::ClearAccessibilityViewEvent(View* view) {
467 for (std::vector<View*>::iterator it = accessibility_view_events_.begin();
468 it != accessibility_view_events_.end();
469 ++it) {
470 if (*it == view)
471 *it = NULL;
472 }
473 } 452 }
474 453
475 void NativeWidgetWin::PushForceHidden() { 454 void NativeWidgetWin::PushForceHidden() {
476 if (force_hidden_count_++ == 0) 455 if (force_hidden_count_++ == 0)
477 Hide(); 456 Hide();
478 } 457 }
479 458
480 void NativeWidgetWin::PopForceHidden() { 459 void NativeWidgetWin::PopForceHidden() {
481 if (--force_hidden_count_ <= 0) { 460 if (--force_hidden_count_ <= 0) {
482 force_hidden_count_ = 0; 461 force_hidden_count_ = 0;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 gfx::Point* offset, 563 gfx::Point* offset,
585 ui::Layer** layer_parent) { 564 ui::Layer** layer_parent) {
586 } 565 }
587 566
588 void NativeWidgetWin::ReorderLayers() { 567 void NativeWidgetWin::ReorderLayers() {
589 } 568 }
590 569
591 void NativeWidgetWin::ViewRemoved(View* view) { 570 void NativeWidgetWin::ViewRemoved(View* view) {
592 if (drop_target_.get()) 571 if (drop_target_.get())
593 drop_target_->ResetTargetViewIfEquals(view); 572 drop_target_->ResetTargetViewIfEquals(view);
594
595 ClearAccessibilityViewEvent(view);
596 } 573 }
597 574
598 void NativeWidgetWin::SetNativeWindowProperty(const char* name, void* value) { 575 void NativeWidgetWin::SetNativeWindowProperty(const char* name, void* value) {
599 // Remove the existing property (if any). 576 // Remove the existing property (if any).
600 for (ViewProps::iterator i = props_.begin(); i != props_.end(); ++i) { 577 for (ViewProps::iterator i = props_.begin(); i != props_.end(); ++i) {
601 if ((*i)->Key() == name) { 578 if ((*i)->Key() == name) {
602 props_.erase(i); 579 props_.erase(i);
603 break; 580 break;
604 } 581 }
605 } 582 }
(...skipping 10 matching lines...) Expand all
616 return tooltip_manager_.get(); 593 return tooltip_manager_.get();
617 } 594 }
618 595
619 bool NativeWidgetWin::IsScreenReaderActive() const { 596 bool NativeWidgetWin::IsScreenReaderActive() const {
620 return screen_reader_active_; 597 return screen_reader_active_;
621 } 598 }
622 599
623 void NativeWidgetWin::SendNativeAccessibilityEvent( 600 void NativeWidgetWin::SendNativeAccessibilityEvent(
624 View* view, 601 View* view,
625 ui::AccessibilityTypes::Event event_type) { 602 ui::AccessibilityTypes::Event event_type) {
626 // Now call the Windows-specific method to notify MSAA clients of this 603 DWORD native_event = NativeViewAccessibilityWin::MSAAEvent(event_type);
627 // event. The widget gives us a temporary unique child ID to associate 604 gfx::NativeView native_view = this->GetNativeView();
628 // with this view so that clients can call get_accChild in 605
629 // NativeViewAccessibilityWin to retrieve the IAccessible associated 606 // Get the unique ID from the view's IAccessible2 interface.
630 // with this view. 607 IAccessible* accessible = view->GetNativeViewAccessible();
631 int child_id = AddAccessibilityViewEvent(view); 608 IAccessible2* accessible2 = NULL;
632 ::NotifyWinEvent(NativeViewAccessibilityWin::MSAAEvent(event_type), 609 HRESULT hr = accessible->QueryInterface(
633 GetNativeView(), OBJID_CLIENT, child_id); 610 IID_IAccessible2, reinterpret_cast<void**>(&accessible2));
611 if (hr != S_OK) {
612 // If this is reached, you're probably trying to fire a notification on a
613 // views::NativeViewHost that has only a default IAccessible. You have to
614 // either call ::NotifyWinEvent directly, or override
615 // GetNativeViewAccessible for that view.
616 NOTREACHED();
617 return;
618 }
619 long unique_id;
620 hr = accessible2->get_uniqueID(&unique_id);
621 DCHECK_EQ(hr, S_OK);
622
623 // Send the negation of the unique id as the child id parameter to
624 // NotifyWinEvent. The client will call get_accChild on the top-level
625 // NativeViewAccessibilityWin object, where positive child ids are
626 // interpreted as 1-based child indices, and negative child ids are
627 // interpreted as unique ids.
628 ::NotifyWinEvent(native_event, native_view, OBJID_CLIENT, -unique_id);
634 } 629 }
635 630
636 void NativeWidgetWin::SetMouseCapture() { 631 void NativeWidgetWin::SetMouseCapture() {
637 DCHECK(!HasMouseCapture()); 632 DCHECK(!HasMouseCapture());
638 SetCapture(hwnd()); 633 SetCapture(hwnd());
639 } 634 }
640 635
641 void NativeWidgetWin::ReleaseMouseCapture() { 636 void NativeWidgetWin::ReleaseMouseCapture() {
642 ReleaseCapture(); 637 ReleaseCapture();
643 } 638 }
(...skipping 1814 matching lines...) Expand 10 before | Expand all | Expand 10 after
2458 ::EnableWindow(start, TRUE); 2453 ::EnableWindow(start, TRUE);
2459 start = ::GetParent(start); 2454 start = ::GetParent(start);
2460 } 2455 }
2461 } 2456 }
2462 } 2457 }
2463 2458
2464 void NativeWidgetWin::DispatchKeyEventPostIME(const KeyEvent& key) { 2459 void NativeWidgetWin::DispatchKeyEventPostIME(const KeyEvent& key) {
2465 SetMsgHandled(delegate_->OnKeyEvent(key)); 2460 SetMsgHandled(delegate_->OnKeyEvent(key));
2466 } 2461 }
2467 2462
2463 View* NativeWidgetWin::FindViewByIA2UniqueId(long id, View* view) {
2464 IAccessible* accessible = view->GetNativeViewAccessible();
2465 IAccessible2* accessible2 = NULL;
2466 if (S_OK == accessible->QueryInterface(
2467 IID_IAccessible2, reinterpret_cast<void**>(&accessible2))) {
2468 long unique_id;
2469 if (S_OK == accessible2->get_uniqueID(&unique_id) && id == unique_id)
2470 return view;
2471 }
2472
2473 for (int i = 0; i < view->child_count(); i++) {
2474 View* result = FindViewByIA2UniqueId(id, view->child_at(i));
2475 if (result)
2476 return result;
2477 }
2478
2479 return NULL;
2480 }
2481
2468 //////////////////////////////////////////////////////////////////////////////// 2482 ////////////////////////////////////////////////////////////////////////////////
2469 // Widget, public: 2483 // Widget, public:
2470 2484
2471 // static 2485 // static
2472 void Widget::NotifyLocaleChanged() { 2486 void Widget::NotifyLocaleChanged() {
2473 NOTIMPLEMENTED(); 2487 NOTIMPLEMENTED();
2474 } 2488 }
2475 2489
2476 namespace { 2490 namespace {
2477 BOOL CALLBACK WindowCallbackProc(HWND hwnd, LPARAM lParam) { 2491 BOOL CALLBACK WindowCallbackProc(HWND hwnd, LPARAM lParam) {
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
2625 return (GetKeyState(VK_LBUTTON) & 0x80) || 2639 return (GetKeyState(VK_LBUTTON) & 0x80) ||
2626 (GetKeyState(VK_RBUTTON) & 0x80) || 2640 (GetKeyState(VK_RBUTTON) & 0x80) ||
2627 (GetKeyState(VK_MBUTTON) & 0x80) || 2641 (GetKeyState(VK_MBUTTON) & 0x80) ||
2628 (GetKeyState(VK_XBUTTON1) & 0x80) || 2642 (GetKeyState(VK_XBUTTON1) & 0x80) ||
2629 (GetKeyState(VK_XBUTTON2) & 0x80); 2643 (GetKeyState(VK_XBUTTON2) & 0x80);
2630 } 2644 }
2631 2645
2632 } // namespace internal 2646 } // namespace internal
2633 2647
2634 } // namespace views 2648 } // namespace views
OLDNEW
« chrome/browser/ui/views/omnibox/omnibox_view_win.cc ('K') | « views/widget/native_widget_win.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698