diff options
author | erg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-14 20:34:58 +0000 |
---|---|---|
committer | erg@chromium.org <erg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-14 20:34:58 +0000 |
commit | 19d02e07b8c964d9cb95fda001ae186a7f0e3f36 (patch) | |
tree | 9826d7b33b8385bc725032623fd38b16cc28d42d | |
parent | 9066f2add856dc2d43fe790b22657c61c7c3c34b (diff) | |
download | chromium_src-19d02e07b8c964d9cb95fda001ae186a7f0e3f36.zip chromium_src-19d02e07b8c964d9cb95fda001ae186a7f0e3f36.tar.gz chromium_src-19d02e07b8c964d9cb95fda001ae186a7f0e3f36.tar.bz2 |
Desktop Aura: Reset the mouse pressed handler when capture changes.
This bug has two parts: (a) RootWindow holds state about mouse{up,down} that isn't reflected in the capture state, (b) The DefaultCaptureClient isn't aware of all instances of the CaptureClient.
This creates a DesktopCaptureClient that, when one takes capture, also messages each other DesktopCaptureClient making them drop their capture and reset their extra mouse state.
BUG=181275, 181101
Review URL: https://chromiumcodereview.appspot.com/12723002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@188179 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | ui/aura/root_window.cc | 10 | ||||
-rw-r--r-- | ui/aura/root_window.h | 4 | ||||
-rw-r--r-- | ui/aura/root_window_unittest.cc | 37 | ||||
-rw-r--r-- | ui/aura/test/aura_test_base.cc | 14 | ||||
-rw-r--r-- | ui/aura/test/aura_test_base.h | 5 | ||||
-rw-r--r-- | ui/views/views.gyp | 8 | ||||
-rw-r--r-- | ui/views/widget/desktop_aura/desktop_capture_client.cc | 67 | ||||
-rw-r--r-- | ui/views/widget/desktop_aura/desktop_capture_client.h | 44 | ||||
-rw-r--r-- | ui/views/widget/desktop_aura/desktop_capture_client_unittest.cc | 65 | ||||
-rw-r--r-- | ui/views/widget/desktop_aura/desktop_root_window_host_linux.cc | 4 | ||||
-rw-r--r-- | ui/views/widget/desktop_aura/desktop_root_window_host_linux.h | 4 | ||||
-rw-r--r-- | ui/views/widget/desktop_aura/desktop_root_window_host_win.cc | 4 | ||||
-rw-r--r-- | ui/views/widget/desktop_aura/desktop_root_window_host_win.h | 4 |
13 files changed, 231 insertions, 39 deletions
diff --git a/ui/aura/root_window.cc b/ui/aura/root_window.cc index 13988b2..729ceab 100644 --- a/ui/aura/root_window.cc +++ b/ui/aura/root_window.cc @@ -630,6 +630,12 @@ bool RootWindow::QueryMouseLocationForTest(gfx::Point* point) const { return host_->QueryMouseLocation(point); } +void RootWindow::ClearMouseHandlers() { + mouse_pressed_handler_ = NULL; + mouse_moved_handler_ = NULL; + mouse_event_dispatch_target_ = NULL; +} + //////////////////////////////////////////////////////////////////////////////// // RootWindow, private: @@ -958,9 +964,7 @@ void RootWindow::OnHostLostWindowCapture() { } void RootWindow::OnHostLostMouseGrab() { - mouse_pressed_handler_ = NULL; - mouse_moved_handler_ = NULL; - mouse_event_dispatch_target_ = NULL; + ClearMouseHandlers(); } void RootWindow::OnHostPaint() { diff --git a/ui/aura/root_window.h b/ui/aura/root_window.h index de9f034..a1d6358 100644 --- a/ui/aura/root_window.h +++ b/ui/aura/root_window.h @@ -277,6 +277,10 @@ class AURA_EXPORT RootWindow : public ui::CompositorDelegate, // Exposes RootWindowHost::QueryMouseLocation() for test purposes. bool QueryMouseLocationForTest(gfx::Point* point) const; + // Clears internal mouse state (such as mouse ups should be sent to the same + // window that ate mouse downs). + void ClearMouseHandlers(); + private: friend class Window; friend class TestScreen; diff --git a/ui/aura/root_window_unittest.cc b/ui/aura/root_window_unittest.cc index cc2a857..cb52b1b 100644 --- a/ui/aura/root_window_unittest.cc +++ b/ui/aura/root_window_unittest.cc @@ -26,13 +26,6 @@ #include "ui/gfx/rect.h" #include "ui/gfx/screen.h" -#if defined(OS_WIN) -// Windows headers define macros for these function names which screw with us. -#if defined(CreateWindow) -#undef CreateWindow -#endif -#endif - namespace aura { namespace { @@ -91,18 +84,6 @@ class ConsumeKeyHandler : public test::TestEventHandler { DISALLOW_COPY_AND_ASSIGN(ConsumeKeyHandler); }; -Window* CreateWindow(int id, Window* parent, WindowDelegate* delegate) { - Window* window = new Window( - delegate ? delegate : - test::TestWindowDelegate::CreateSelfDestroyingDelegate()); - window->set_id(id); - window->Init(ui::LAYER_TEXTURED); - parent->AddChild(window); - window->SetBounds(gfx::Rect(0, 0, 100, 100)); - window->Show(); - return window; -} - bool IsFocusedWindow(aura::Window* window) { return client::GetFocusClient(window)->GetFocusedWindow() == window; } @@ -376,7 +357,7 @@ TEST_F(RootWindowTest, ScrollEventDispatch) { root_window()->SetEventFilter(filter); test::TestWindowDelegate delegate; - scoped_ptr<Window> w1(CreateWindow(1, root_window(), &delegate)); + scoped_ptr<Window> w1(CreateNormalWindow(1, root_window(), &delegate)); w1->SetBounds(gfx::Rect(20, 20, 40, 40)); // A scroll event on the root-window itself is dispatched. @@ -666,9 +647,9 @@ TEST_F(RootWindowTest, DeleteWindowDuringDispatch) { // Verifies that we can delete a window during each phase of event handling. // Deleting the window should not cause a crash, only prevent further // processing from occurring. - scoped_ptr<Window> w1(CreateWindow(1, root_window(), NULL)); + scoped_ptr<Window> w1(CreateNormalWindow(1, root_window(), NULL)); DeletingWindowDelegate d11; - Window* w11 = CreateWindow(11, w1.get(), &d11); + Window* w11 = CreateNormalWindow(11, w1.get(), &d11); WindowTracker tracker; DeletingEventFilter* w1_filter = new DeletingEventFilter; w1->SetEventFilter(w1_filter); @@ -694,7 +675,7 @@ TEST_F(RootWindowTest, DeleteWindowDuringDispatch) { // Pre-handle step deletes w11. This will prevent the delegate and the post- // handle steps from applying. - w11 = CreateWindow(11, w1.get(), &d11); + w11 = CreateNormalWindow(11, w1.get(), &d11); w1_filter->Reset(true); d11.Reset(w11, false); generator.PressLeftButton(); @@ -733,10 +714,10 @@ class DetachesParentOnTapDelegate : public test::TestWindowDelegate { // Tests that the gesture recognizer is reset for all child windows when a // window hides. No expectations, just checks that the test does not crash. TEST_F(RootWindowTest, GestureRecognizerResetsTargetWhenParentHides) { - scoped_ptr<Window> w1(CreateWindow(1, root_window(), NULL)); + scoped_ptr<Window> w1(CreateNormalWindow(1, root_window(), NULL)); DetachesParentOnTapDelegate delegate; - scoped_ptr<Window> parent(CreateWindow(22, w1.get(), NULL)); - Window* child = CreateWindow(11, parent.get(), &delegate); + scoped_ptr<Window> parent(CreateNormalWindow(22, w1.get(), NULL)); + Window* child = CreateNormalWindow(11, parent.get(), &delegate); test::EventGenerator generator(root_window(), child); generator.GestureTapAt(gfx::Point(40, 40)); } @@ -785,12 +766,12 @@ class NestedGestureDelegate : public test::TestWindowDelegate { // Tests that gesture end is delivered after nested gesture processing. TEST_F(RootWindowTest, GestureEndDeliveredAfterNestedGestures) { NestedGestureDelegate d1(NULL, gfx::Point()); - scoped_ptr<Window> w1(CreateWindow(1, root_window(), &d1)); + scoped_ptr<Window> w1(CreateNormalWindow(1, root_window(), &d1)); w1->SetBounds(gfx::Rect(0, 0, 100, 100)); test::EventGenerator nested_generator(root_window(), w1.get()); NestedGestureDelegate d2(&nested_generator, w1->bounds().CenterPoint()); - scoped_ptr<Window> w2(CreateWindow(1, root_window(), &d2)); + scoped_ptr<Window> w2(CreateNormalWindow(1, root_window(), &d2)); w2->SetBounds(gfx::Rect(100, 0, 100, 100)); // Tap on w2 which triggers nested gestures for w1. diff --git a/ui/aura/test/aura_test_base.cc b/ui/aura/test/aura_test_base.cc index c507439..f6ad08c 100644 --- a/ui/aura/test/aura_test_base.cc +++ b/ui/aura/test/aura_test_base.cc @@ -5,6 +5,7 @@ #include "ui/aura/test/aura_test_base.h" #include "ui/aura/test/aura_test_helper.h" +#include "ui/aura/test/test_window_delegate.h" #include "ui/aura/window.h" #include "ui/base/gestures/gesture_configuration.h" #include "ui/base/ime/text_input_test_support.h" @@ -78,6 +79,19 @@ void AuraTestBase::TearDown() { #endif } +Window* AuraTestBase::CreateNormalWindow(int id, Window* parent, + WindowDelegate* delegate) { + Window* window = new Window( + delegate ? delegate : + test::TestWindowDelegate::CreateSelfDestroyingDelegate()); + window->set_id(id); + window->Init(ui::LAYER_TEXTURED); + parent->AddChild(window); + window->SetBounds(gfx::Rect(0, 0, 100, 100)); + window->Show(); + return window; +} + Window* AuraTestBase::CreateTransientChild(int id, Window* parent) { Window* window = new Window(NULL); window->set_id(id); diff --git a/ui/aura/test/aura_test_base.h b/ui/aura/test/aura_test_base.h index c7daec3..58e4647 100644 --- a/ui/aura/test/aura_test_base.h +++ b/ui/aura/test/aura_test_base.h @@ -14,6 +14,7 @@ namespace aura { class RootWindow; class Window; +class WindowDelegate; namespace test { // A base class for aura unit tests. @@ -27,6 +28,10 @@ class AuraTestBase : public testing::Test { virtual void SetUp() OVERRIDE; virtual void TearDown() OVERRIDE; + // Creates a normal window parented to |parent|. + aura::Window* CreateNormalWindow(int id, Window* parent, + aura::WindowDelegate* delegate); + // Creates a transient window that is transient to |parent|. aura::Window* CreateTransientChild(int id, aura::Window* parent); diff --git a/ui/views/views.gyp b/ui/views/views.gyp index 032f819..e4b1cc8e 100644 --- a/ui/views/views.gyp +++ b/ui/views/views.gyp @@ -343,6 +343,8 @@ 'widget/default_theme_provider.h', 'widget/desktop_aura/desktop_activation_client.cc', 'widget/desktop_aura/desktop_activation_client.h', + 'widget/desktop_aura/desktop_capture_client.cc', + 'widget/desktop_aura/desktop_capture_client.h', 'widget/desktop_aura/desktop_dispatcher_client.cc', 'widget/desktop_aura/desktop_dispatcher_client.h', 'widget/desktop_aura/desktop_drag_drop_client_win.cc', @@ -699,6 +701,7 @@ 'view_model_unittest.cc', 'view_model_utils_unittest.cc', 'view_unittest.cc', + 'widget/desktop_aura/desktop_capture_client_unittest.cc', 'widget/native_widget_aura_unittest.cc', 'widget/native_widget_unittest.cc', 'widget/native_widget_win_unittest.cc', @@ -710,6 +713,10 @@ 'sources!': [ 'touchui/touch_selection_controller_impl_unittest.cc', ], + }, { # use_aura==0 + 'sources/': [ + ['exclude', 'widget/desktop_aura'], + ], }], ['OS=="win"', { 'link_settings': { @@ -741,6 +748,7 @@ ], 'sources/': [ ['exclude', 'corewm'], + ['exclude', 'widget/desktop_aura'], ], }], ], diff --git a/ui/views/widget/desktop_aura/desktop_capture_client.cc b/ui/views/widget/desktop_aura/desktop_capture_client.cc new file mode 100644 index 0000000..f52d00a --- /dev/null +++ b/ui/views/widget/desktop_aura/desktop_capture_client.cc @@ -0,0 +1,67 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/views/widget/desktop_aura/desktop_capture_client.h" + +#include "ui/aura/root_window.h" + +namespace views { + +std::set<DesktopCaptureClient*> DesktopCaptureClient::live_capture_clients_; + +DesktopCaptureClient::DesktopCaptureClient(aura::RootWindow* root_window) + : root_window_(root_window), + capture_window_(NULL) { + aura::client::SetCaptureClient(root_window_, this); + live_capture_clients_.insert(this); +} + +DesktopCaptureClient::~DesktopCaptureClient() { + live_capture_clients_.erase(this); + aura::client::SetCaptureClient(root_window_, NULL); +} + +void DesktopCaptureClient::OnOtherCaptureClientTookCapture() { + if (capture_window_ == NULL) { + // While RootWindow may not technically have capture, it will store state + // that needs to be cleared on capture changed regarding mouse up/down. + root_window_->ClearMouseHandlers(); + } +} + +void DesktopCaptureClient::SetCapture(aura::Window* window) { + if (capture_window_ == window) + return; + root_window_->gesture_recognizer()->TransferEventsTo(capture_window_, window); + + aura::Window* old_capture_window = capture_window_; + capture_window_ = window; + + if (capture_window_) { + root_window_->SetNativeCapture(); + + for (std::set<DesktopCaptureClient*>::iterator it = + live_capture_clients_.begin(); it != live_capture_clients_.end(); + ++it) { + if (*it != this) + (*it)->OnOtherCaptureClientTookCapture(); + } + } else { + root_window_->ReleaseNativeCapture(); + } + + root_window_->UpdateCapture(old_capture_window, capture_window_); +} + +void DesktopCaptureClient::ReleaseCapture(aura::Window* window) { + if (capture_window_ != window) + return; + SetCapture(NULL); +} + +aura::Window* DesktopCaptureClient::GetCaptureWindow() { + return capture_window_; +} + +} // namespace views diff --git a/ui/views/widget/desktop_aura/desktop_capture_client.h b/ui/views/widget/desktop_aura/desktop_capture_client.h new file mode 100644 index 0000000..6ba64be --- /dev/null +++ b/ui/views/widget/desktop_aura/desktop_capture_client.h @@ -0,0 +1,44 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_VIEWS_WIDGET_DESKTOP_AURA_DESKTOP_CAPTURE_CLIENT_H_ +#define UI_VIEWS_WIDGET_DESKTOP_AURA_DESKTOP_CAPTURE_CLIENT_H_ + +#include <set> + +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "ui/aura/client/capture_client.h" +#include "ui/views/views_export.h" + +namespace views { + +// A capture client which will collaborate with all other capture clients of +// its class. When capture is changed in an instance of this capture client, +// capture is released in all other windows. +class VIEWS_EXPORT DesktopCaptureClient : public aura::client::CaptureClient { + public: + explicit DesktopCaptureClient(aura::RootWindow* root_window); + virtual ~DesktopCaptureClient(); + + private: + // Called when another instance of the capture client takes capture. + void OnOtherCaptureClientTookCapture(); + + // Overridden from client::CaptureClient: + virtual void SetCapture(aura::Window* window) OVERRIDE; + virtual void ReleaseCapture(aura::Window* window) OVERRIDE; + virtual aura::Window* GetCaptureWindow() OVERRIDE; + + aura::RootWindow* root_window_; + aura::Window* capture_window_; + + static std::set<DesktopCaptureClient*> live_capture_clients_; + + DISALLOW_COPY_AND_ASSIGN(DesktopCaptureClient); +}; + +} // namespace views + +#endif // UI_VIEWS_WIDGET_DESKTOP_AURA_DESKTOP_CAPTURE_CLIENT_H_ diff --git a/ui/views/widget/desktop_aura/desktop_capture_client_unittest.cc b/ui/views/widget/desktop_aura/desktop_capture_client_unittest.cc new file mode 100644 index 0000000..4d78a65 --- /dev/null +++ b/ui/views/widget/desktop_aura/desktop_capture_client_unittest.cc @@ -0,0 +1,65 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/views/widget/desktop_aura/desktop_capture_client.h" + +#include "ui/aura/root_window.h" +#include "ui/aura/test/aura_test_base.h" +#include "ui/aura/test/test_screen.h" +#include "ui/aura/test/test_window_delegate.h" +#include "ui/base/events/event.h" + +namespace views { + +class DesktopCaptureClientTest : public aura::test::AuraTestBase { + public: + virtual void SetUp() OVERRIDE { + AuraTestBase::SetUp(); + desktop_capture_client_.reset(new DesktopCaptureClient(root_window())); + + second_root_.reset(new aura::RootWindow( + aura::RootWindow::CreateParams(gfx::Rect(0, 0, 800, 600)))); + second_root_->Init(); + second_root_->Show(); + second_root_->SetHostSize(gfx::Size(800, 600)); + second_desktop_capture_client_.reset( + new DesktopCaptureClient(second_root_.get())); + } + + virtual void TearDown() OVERRIDE { + RunAllPendingInMessageLoop(); + desktop_capture_client_.reset(); + + AuraTestBase::TearDown(); + } + + scoped_ptr<DesktopCaptureClient> desktop_capture_client_; + scoped_ptr<aura::RootWindow> second_root_; + scoped_ptr<DesktopCaptureClient> second_desktop_capture_client_; +}; + +// Makes sure that internal details that are set on mouse down (such as +// mouse_pressed_handler()) are cleared when another root window takes capture. +TEST_F(DesktopCaptureClientTest, ResetMouseEventHandlerOnCapture) { + // Create a window inside the RootWindow. + scoped_ptr<aura::Window> w1(CreateNormalWindow(1, root_window(), NULL)); + + // Make a synthesized mouse down event. Ensure that the RootWindow will + // dispatch further mouse events to |w1|. + ui::MouseEvent mouse_pressed_event(ui::ET_MOUSE_PRESSED, gfx::Point(5, 5), + gfx::Point(5, 5), 0); + root_window()->AsRootWindowHostDelegate()->OnHostMouseEvent( + &mouse_pressed_event); + EXPECT_EQ(w1.get(), root_window()->mouse_pressed_handler()); + + // Build a window in the second RootWindow. + scoped_ptr<aura::Window> w2(CreateNormalWindow(2, second_root_.get(), NULL)); + + // The act of having the second window take capture should clear out mouse + // pressed handler in the first RootWindow. + w2->SetCapture(); + EXPECT_EQ(NULL, root_window()->mouse_pressed_handler()); +} + +} // namespace views diff --git a/ui/views/widget/desktop_aura/desktop_root_window_host_linux.cc b/ui/views/widget/desktop_aura/desktop_root_window_host_linux.cc index a402d72..b95095e 100644 --- a/ui/views/widget/desktop_aura/desktop_root_window_host_linux.cc +++ b/ui/views/widget/desktop_aura/desktop_root_window_host_linux.cc @@ -11,7 +11,6 @@ #include "base/message_pump_aurax11.h" #include "base/stringprintf.h" #include "base/utf_string_conversions.h" -#include "ui/aura/client/default_capture_client.h" #include "ui/aura/client/screen_position_client.h" #include "ui/aura/client/user_action_client.h" #include "ui/aura/focus_manager.h" @@ -29,6 +28,7 @@ #include "ui/views/corewm/focus_controller.h" #include "ui/views/ime/input_method.h" #include "ui/views/widget/desktop_aura/desktop_activation_client.h" +#include "ui/views/widget/desktop_aura/desktop_capture_client.h" #include "ui/views/widget/desktop_aura/desktop_dispatcher_client.h" #include "ui/views/widget/desktop_aura/desktop_focus_rules.h" #include "ui/views/widget/desktop_aura/desktop_layout_manager.h" @@ -221,7 +221,7 @@ aura::RootWindow* DesktopRootWindowHostLinux::InitRootWindow( native_widget_delegate_->OnNativeWidgetCreated(); - capture_client_.reset(new aura::client::DefaultCaptureClient(root_window_)); + capture_client_.reset(new views::DesktopCaptureClient(root_window_)); aura::client::SetCaptureClient(root_window_, capture_client_.get()); // Ensure that the X11DesktopHandler exists so that it dispatches activation diff --git a/ui/views/widget/desktop_aura/desktop_root_window_host_linux.h b/ui/views/widget/desktop_aura/desktop_root_window_host_linux.h index 8c4a97f..6d56ff9 100644 --- a/ui/views/widget/desktop_aura/desktop_root_window_host_linux.h +++ b/ui/views/widget/desktop_aura/desktop_root_window_host_linux.h @@ -22,7 +22,6 @@ namespace aura { namespace client { -class DefaultCaptureClient; class FocusClient; class ScreenPositionClient; } @@ -30,6 +29,7 @@ class ScreenPositionClient; namespace views { class DesktopActivationClient; +class DesktopCaptureClient; class DesktopDispatcherClient; class X11DesktopWindowMoveClient; class X11WindowEventFilter; @@ -201,7 +201,7 @@ class VIEWS_EXPORT DesktopRootWindowHostLinux aura::RootWindow* root_window_; // aura:: objects that we own. - scoped_ptr<aura::client::DefaultCaptureClient> capture_client_; + scoped_ptr<DesktopCaptureClient> capture_client_; scoped_ptr<aura::client::FocusClient> focus_client_; scoped_ptr<DesktopActivationClient> activation_client_; scoped_ptr<views::corewm::CursorManager> cursor_client_; diff --git a/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc b/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc index 5997cf1..199a9e1 100644 --- a/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc +++ b/ui/views/widget/desktop_aura/desktop_root_window_host_win.cc @@ -7,7 +7,6 @@ #include "third_party/skia/include/core/SkPath.h" #include "third_party/skia/include/core/SkRegion.h" #include "ui/aura/client/aura_constants.h" -#include "ui/aura/client/default_capture_client.h" #include "ui/aura/focus_manager.h" #include "ui/aura/root_window.h" #include "ui/aura/window_property.h" @@ -26,6 +25,7 @@ #include "ui/views/corewm/input_method_event_filter.h" #include "ui/views/ime/input_method_bridge.h" #include "ui/views/widget/desktop_aura/desktop_activation_client.h" +#include "ui/views/widget/desktop_aura/desktop_capture_client.h" #include "ui/views/widget/desktop_aura/desktop_dispatcher_client.h" #include "ui/views/widget/desktop_aura/desktop_drag_drop_client_win.h" #include "ui/views/widget/desktop_aura/desktop_focus_rules.h" @@ -124,7 +124,7 @@ aura::RootWindow* DesktopRootWindowHostWin::Init( native_widget_delegate_->OnNativeWidgetCreated(); - capture_client_.reset(new aura::client::DefaultCaptureClient(root_window_)); + capture_client_.reset(new views::DesktopCaptureClient(root_window_)); aura::client::SetCaptureClient(root_window_, capture_client_.get()); if (corewm::UseFocusControllerOnDesktop()) { diff --git a/ui/views/widget/desktop_aura/desktop_root_window_host_win.h b/ui/views/widget/desktop_aura/desktop_root_window_host_win.h index 0ef05d5..6e4ae8a 100644 --- a/ui/views/widget/desktop_aura/desktop_root_window_host_win.h +++ b/ui/views/widget/desktop_aura/desktop_root_window_host_win.h @@ -12,7 +12,6 @@ namespace aura { namespace client { -class DefaultCaptureClient; class FocusClient; class ScreenPositionClient; } @@ -20,6 +19,7 @@ class ScreenPositionClient; namespace views { class DesktopActivationClient; +class DesktopCaptureClient; class DesktopCursorClient; class DesktopDispatcherClient; class DesktopDragDropClientWin; @@ -210,7 +210,7 @@ class VIEWS_EXPORT DesktopRootWindowHostWin aura::RootWindow* root_window_; scoped_ptr<HWNDMessageHandler> message_handler_; - scoped_ptr<aura::client::DefaultCaptureClient> capture_client_; + scoped_ptr<DesktopCaptureClient> capture_client_; scoped_ptr<DesktopDispatcherClient> dispatcher_client_; scoped_ptr<aura::client::FocusClient> focus_client_; // Depends on focus_manager_. |