Now launching WebRTC-AppRTC test with Collider.
[chromium-blink-merge.git] / ash / drag_drop / drag_drop_tracker.cc
blobd851098c36c020fb04e0fbb67458c206e0742b55
1 // Copyright (c) 2012 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.
5 #include "ash/drag_drop/drag_drop_tracker.h"
7 #include "ash/shell.h"
8 #include "ash/shell_window_ids.h"
9 #include "ash/wm/coordinate_conversion.h"
10 #include "ui/aura/client/window_tree_client.h"
11 #include "ui/aura/window.h"
12 #include "ui/aura/window_event_dispatcher.h"
13 #include "ui/events/event.h"
14 #include "ui/gfx/screen.h"
15 #include "ui/wm/core/coordinate_conversion.h"
16 #include "ui/wm/public/activation_delegate.h"
18 namespace ash {
19 namespace {
21 // An activation delegate which disables activating the drag and drop window.
22 class CaptureWindowActivationDelegate
23 : public aura::client::ActivationDelegate {
24 public:
25 CaptureWindowActivationDelegate() {}
26 ~CaptureWindowActivationDelegate() override {}
28 // aura::client::ActivationDelegate overrides:
29 bool ShouldActivate() const override { return false; }
31 private:
33 DISALLOW_COPY_AND_ASSIGN(CaptureWindowActivationDelegate);
36 // Creates a window for capturing drag events.
37 aura::Window* CreateCaptureWindow(aura::Window* context_root,
38 aura::WindowDelegate* delegate) {
39 static CaptureWindowActivationDelegate* activation_delegate_instance = NULL;
40 if (!activation_delegate_instance)
41 activation_delegate_instance = new CaptureWindowActivationDelegate;
42 aura::Window* window = new aura::Window(delegate);
43 // Set type of window as popup to prevent different window manager codes
44 // trying to manage this window.
45 window->SetType(ui::wm::WINDOW_TYPE_POPUP);
46 window->Init(aura::WINDOW_LAYER_NOT_DRAWN);
47 aura::client::ParentWindowWithContext(window, context_root, gfx::Rect());
48 aura::client::SetActivationDelegate(window, activation_delegate_instance);
49 window->Show();
50 DCHECK(window->bounds().size().IsEmpty());
51 return window;
54 } // namespace
56 DragDropTracker::DragDropTracker(aura::Window* context_root,
57 aura::WindowDelegate* delegate)
58 : capture_window_(CreateCaptureWindow(context_root, delegate)) {
61 DragDropTracker::~DragDropTracker() {
62 capture_window_->ReleaseCapture();
65 void DragDropTracker::TakeCapture() {
66 capture_window_->SetCapture();
69 aura::Window* DragDropTracker::GetTarget(const ui::LocatedEvent& event) {
70 DCHECK(capture_window_.get());
71 gfx::Point location_in_screen = event.location();
72 ::wm::ConvertPointToScreen(capture_window_.get(), &location_in_screen);
73 aura::Window* root_window_at_point =
74 wm::GetRootWindowAt(location_in_screen);
75 gfx::Point location_in_root = location_in_screen;
76 ::wm::ConvertPointFromScreen(root_window_at_point, &location_in_root);
77 return root_window_at_point->GetEventHandlerForPoint(location_in_root);
80 ui::LocatedEvent* DragDropTracker::ConvertEvent(
81 aura::Window* target,
82 const ui::LocatedEvent& event) {
83 DCHECK(capture_window_.get());
84 gfx::Point target_location = event.location();
85 aura::Window::ConvertPointToTarget(capture_window_.get(), target,
86 &target_location);
87 gfx::Point location_in_screen = event.location();
88 ::wm::ConvertPointToScreen(capture_window_.get(), &location_in_screen);
89 gfx::Point target_root_location = event.root_location();
90 aura::Window::ConvertPointToTarget(
91 capture_window_->GetRootWindow(),
92 ash::wm::GetRootWindowAt(location_in_screen),
93 &target_root_location);
94 return new ui::MouseEvent(event.type(),
95 target_location,
96 target_root_location,
97 event.flags(),
98 static_cast<const ui::MouseEvent&>(event).
99 changed_button_flags());
102 } // namespace ash