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

Side by Side Diff: ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.cc

Issue 800183005: Adding UMA stats for dragdrop events for both touch and mouse. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixing issue that would have resulted in overcounting cancel events. Created 5 years, 11 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
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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 "ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.h" 5 #include "ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.h"
6 6
7 #include <X11/Xatom.h> 7 #include <X11/Xatom.h>
8 8
9 #include "base/event_types.h" 9 #include "base/event_types.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
11 #include "base/message_loop/message_loop.h" 11 #include "base/message_loop/message_loop.h"
12 #include "base/metrics/histogram_macros.h"
12 #include "third_party/skia/include/core/SkBitmap.h" 13 #include "third_party/skia/include/core/SkBitmap.h"
13 #include "ui/aura/client/capture_client.h" 14 #include "ui/aura/client/capture_client.h"
14 #include "ui/aura/window.h" 15 #include "ui/aura/window.h"
15 #include "ui/aura/window_tree_host.h" 16 #include "ui/aura/window_tree_host.h"
16 #include "ui/base/clipboard/clipboard.h" 17 #include "ui/base/clipboard/clipboard.h"
17 #include "ui/base/dragdrop/drop_target_event.h" 18 #include "ui/base/dragdrop/drop_target_event.h"
18 #include "ui/base/dragdrop/os_exchange_data.h" 19 #include "ui/base/dragdrop/os_exchange_data.h"
19 #include "ui/base/dragdrop/os_exchange_data_provider_aurax11.h" 20 #include "ui/base/dragdrop/os_exchange_data_provider_aurax11.h"
20 #include "ui/base/x/selection_utils.h" 21 #include "ui/base/x/selection_utils.h"
21 #include "ui/base/x/x11_foreign_window_manager.h" 22 #include "ui/base/x/x11_foreign_window_manager.h"
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 xwindow_(xwindow), 411 xwindow_(xwindow),
411 atom_cache_(xdisplay_, kAtomsToCache), 412 atom_cache_(xdisplay_, kAtomsToCache),
412 current_modifier_state_(ui::EF_NONE), 413 current_modifier_state_(ui::EF_NONE),
413 target_window_(NULL), 414 target_window_(NULL),
414 waiting_on_status_(false), 415 waiting_on_status_(false),
415 status_received_since_enter_(false), 416 status_received_since_enter_(false),
416 source_provider_(NULL), 417 source_provider_(NULL),
417 source_current_window_(None), 418 source_current_window_(None),
418 source_state_(SOURCE_STATE_OTHER), 419 source_state_(SOURCE_STATE_OTHER),
419 drag_operation_(0), 420 drag_operation_(0),
421 current_drag_event_source_(ui::DragDropTypes::DRAG_EVENT_SOURCE_MOUSE),
420 negotiated_operation_(ui::DragDropTypes::DRAG_NONE), 422 negotiated_operation_(ui::DragDropTypes::DRAG_NONE),
421 weak_ptr_factory_(this) { 423 weak_ptr_factory_(this) {
422 // Some tests change the DesktopDragDropClientAuraX11 associated with an 424 // Some tests change the DesktopDragDropClientAuraX11 associated with an
423 // |xwindow|. 425 // |xwindow|.
424 g_live_client_map.Get()[xwindow] = this; 426 g_live_client_map.Get()[xwindow] = this;
425 427
426 // Mark that we are aware of drag and drop concepts. 428 // Mark that we are aware of drag and drop concepts.
427 unsigned long xdnd_version = kMinXdndVersion; 429 unsigned long xdnd_version = kMinXdndVersion;
428 XChangeProperty(xdisplay_, xwindow_, atom_cache_.GetAtom("XdndAware"), 430 XChangeProperty(xdisplay_, xwindow_, atom_cache_.GetAtom("XdndAware"),
429 XA_ATOM, 32, PropModeReplace, 431 XA_ATOM, 32, PropModeReplace,
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
603 target_window_location_, 605 target_window_location_,
604 target_window_root_location_, 606 target_window_root_location_,
605 target_current_context_->GetDragOperation()); 607 target_current_context_->GetDragOperation());
606 if (target_current_context_->source_client()) { 608 if (target_current_context_->source_client()) {
607 event.set_flags(target_current_context_->source_client() 609 event.set_flags(target_current_context_->source_client()
608 ->current_modifier_state()); 610 ->current_modifier_state());
609 } else { 611 } else {
610 event.set_flags(XGetModifiers()); 612 event.set_flags(XGetModifiers());
611 } 613 }
612 614
613 drag_operation = delegate->OnPerformDrop(event); 615 drag_operation = delegate->OnPerformDrop(event);
pkotwicz 2015/01/14 18:31:30 If you put a histogram here, you would be able to
caelyn 2015/01/14 20:00:26 The real question is whether we can do the same th
pkotwicz 2015/01/14 20:39:55 I think that DesktopDropTargetWin::OnDrop() gets c
614 } 616 }
615 617
616 target_window_->RemoveObserver(this); 618 target_window_->RemoveObserver(this);
617 target_window_ = NULL; 619 target_window_ = NULL;
618 } 620 }
619 621
620 XEvent xev; 622 XEvent xev;
621 xev.xclient.type = ClientMessage; 623 xev.xclient.type = ClientMessage;
622 xev.xclient.message_type = atom_cache_.GetAtom("XdndFinished"); 624 xev.xclient.message_type = atom_cache_.GetAtom("XdndFinished");
623 xev.xclient.format = 32; 625 xev.xclient.format = 32;
(...skipping 15 matching lines...) Expand all
639 XDeleteProperty(xdisplay_, xwindow_, xselection.property); 641 XDeleteProperty(xdisplay_, xwindow_, xselection.property);
640 } 642 }
641 643
642 int DesktopDragDropClientAuraX11::StartDragAndDrop( 644 int DesktopDragDropClientAuraX11::StartDragAndDrop(
643 const ui::OSExchangeData& data, 645 const ui::OSExchangeData& data,
644 aura::Window* root_window, 646 aura::Window* root_window,
645 aura::Window* source_window, 647 aura::Window* source_window,
646 const gfx::Point& root_location, 648 const gfx::Point& root_location,
647 int operation, 649 int operation,
648 ui::DragDropTypes::DragEventSource source) { 650 ui::DragDropTypes::DragEventSource source) {
651 UMA_HISTOGRAM_ENUMERATION("DragDrop.Start", source,
652 ui::DragDropTypes::DRAG_EVENT_SOURCE_COUNT);
653
649 source_current_window_ = None; 654 source_current_window_ = None;
650 DCHECK(!g_current_drag_drop_client); 655 DCHECK(!g_current_drag_drop_client);
651 g_current_drag_drop_client = this; 656 g_current_drag_drop_client = this;
652 waiting_on_status_ = false; 657 waiting_on_status_ = false;
653 next_position_message_.reset(); 658 next_position_message_.reset();
654 status_received_since_enter_ = false; 659 status_received_since_enter_ = false;
655 source_state_ = SOURCE_STATE_OTHER; 660 source_state_ = SOURCE_STATE_OTHER;
656 drag_operation_ = operation; 661 drag_operation_ = operation;
657 negotiated_operation_ = ui::DragDropTypes::DRAG_NONE; 662 negotiated_operation_ = ui::DragDropTypes::DRAG_NONE;
663 current_drag_event_source_ = source;
pkotwicz 2015/01/14 18:31:30 Chrome for Desktop Linux does not support initiati
caelyn 2015/01/14 20:00:26 I know that chrome on linux does not support touch
pkotwicz 2015/01/14 20:39:55 Once you move all of the histograms to this method
caelyn 2015/01/21 16:29:53 Done.
658 664
659 const ui::OSExchangeData::Provider* provider = &data.provider(); 665 const ui::OSExchangeData::Provider* provider = &data.provider();
660 source_provider_ = static_cast<const ui::OSExchangeDataProviderAuraX11*>( 666 source_provider_ = static_cast<const ui::OSExchangeDataProviderAuraX11*>(
661 provider); 667 provider);
662 668
663 source_provider_->TakeOwnershipOfSelection(); 669 source_provider_->TakeOwnershipOfSelection();
664 670
665 std::vector< ::Atom> actions = GetOfferedDragOperations(); 671 std::vector< ::Atom> actions = GetOfferedDragOperations();
666 if (!source_provider_->file_contents_name().empty()) { 672 if (!source_provider_->file_contents_name().empty()) {
667 actions.push_back(atom_cache_.GetAtom(kXdndActionDirectSave)); 673 actions.push_back(atom_cache_.GetAtom(kXdndActionDirectSave));
(...skipping 22 matching lines...) Expand all
690 // whether it is alive after the drag ends. 696 // whether it is alive after the drag ends.
691 base::WeakPtr<DesktopDragDropClientAuraX11> alive( 697 base::WeakPtr<DesktopDragDropClientAuraX11> alive(
692 weak_ptr_factory_.GetWeakPtr()); 698 weak_ptr_factory_.GetWeakPtr());
693 699
694 // Windows has a specific method, DoDragDrop(), which performs the entire 700 // Windows has a specific method, DoDragDrop(), which performs the entire
695 // drag. We have to emulate this, so we spin off a nested runloop which will 701 // drag. We have to emulate this, so we spin off a nested runloop which will
696 // track all cursor movement and reroute events to a specific handler. 702 // track all cursor movement and reroute events to a specific handler.
697 move_loop_->RunMoveLoop( 703 move_loop_->RunMoveLoop(
698 source_window, 704 source_window,
699 cursor_manager_->GetInitializedCursor(ui::kCursorGrabbing)); 705 cursor_manager_->GetInitializedCursor(ui::kCursorGrabbing));
700 706
pkotwicz 2015/01/14 18:31:30 Can you move the histogram code for whether a drag
caelyn 2015/01/14 20:00:26 Acknowledged. - My tests show moving it here has t
701 if (alive) { 707 if (alive) {
702 drag_widget_.reset(); 708 drag_widget_.reset();
703 709
704 source_provider_ = NULL; 710 source_provider_ = NULL;
705 g_current_drag_drop_client = NULL; 711 g_current_drag_drop_client = NULL;
706 drag_operation_ = 0; 712 drag_operation_ = 0;
707 XDeleteProperty(xdisplay_, xwindow_, atom_cache_.GetAtom("XdndActionList")); 713 XDeleteProperty(xdisplay_, xwindow_, atom_cache_.GetAtom("XdndActionList"));
708 XDeleteProperty(xdisplay_, xwindow_, atom_cache_.GetAtom(kXdndDirectSave0)); 714 XDeleteProperty(xdisplay_, xwindow_, atom_cache_.GetAtom(kXdndDirectSave0));
709 715
710 return negotiated_operation_; 716 return negotiated_operation_;
711 } 717 }
712 return ui::DragDropTypes::DRAG_NONE; 718 return ui::DragDropTypes::DRAG_NONE;
713 } 719 }
714 720
715 void DesktopDragDropClientAuraX11::DragUpdate(aura::Window* target, 721 void DesktopDragDropClientAuraX11::DragUpdate(aura::Window* target,
716 const ui::LocatedEvent& event) { 722 const ui::LocatedEvent& event) {
717 NOTIMPLEMENTED(); 723 NOTIMPLEMENTED();
718 } 724 }
719 725
720 void DesktopDragDropClientAuraX11::Drop(aura::Window* target, 726 void DesktopDragDropClientAuraX11::Drop(aura::Window* target,
721 const ui::LocatedEvent& event) { 727 const ui::LocatedEvent& event) {
722 NOTIMPLEMENTED(); 728 NOTIMPLEMENTED();
723 } 729 }
724 730
725 void DesktopDragDropClientAuraX11::DragCancel() { 731 void DesktopDragDropClientAuraX11::DragCancel() {
732 // EndMoveLoop will call DesktopDragDropClientAuraX11::OnMoveLoopEnded and
mfomitchev 2015/01/14 17:03:41 IMHO this is not really worth explaining in a comm
caelyn 2015/01/21 16:29:53 Done.
733 // record a DragDrop.Cancel event in UMA
726 move_loop_->EndMoveLoop(); 734 move_loop_->EndMoveLoop();
727 } 735 }
728 736
729 bool DesktopDragDropClientAuraX11::IsDragDropInProgress() { 737 bool DesktopDragDropClientAuraX11::IsDragDropInProgress() {
730 return !!g_current_drag_drop_client; 738 return !!g_current_drag_drop_client;
731 } 739 }
732 740
733 void DesktopDragDropClientAuraX11::OnWindowDestroyed(aura::Window* window) { 741 void DesktopDragDropClientAuraX11::OnWindowDestroyed(aura::Window* window) {
734 DCHECK_EQ(target_window_, window); 742 DCHECK_EQ(target_window_, window);
735 target_window_ = NULL; 743 target_window_ = NULL;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
793 source_state_ = SOURCE_STATE_DROPPED; 801 source_state_ = SOURCE_STATE_DROPPED;
794 SendXdndDrop(source_current_window_); 802 SendXdndDrop(source_current_window_);
795 return; 803 return;
796 } 804 }
797 } 805 }
798 806
799 move_loop_->EndMoveLoop(); 807 move_loop_->EndMoveLoop();
800 } 808 }
801 809
802 void DesktopDragDropClientAuraX11::OnMoveLoopEnded() { 810 void DesktopDragDropClientAuraX11::OnMoveLoopEnded() {
811 if (negotiated_operation_ == ui::DragDropTypes::DRAG_NONE) {
812 UMA_HISTOGRAM_ENUMERATION("DragDrop.Cancel", current_drag_event_source_,
813 ui::DragDropTypes::DRAG_EVENT_SOURCE_COUNT);
814 } else {
815 UMA_HISTOGRAM_ENUMERATION("DragDrop.Drop", current_drag_event_source_,
816 ui::DragDropTypes::DRAG_EVENT_SOURCE_COUNT);
817 }
803 if (source_current_window_ != None) { 818 if (source_current_window_ != None) {
804 SendXdndLeave(source_current_window_); 819 SendXdndLeave(source_current_window_);
805 source_current_window_ = None; 820 source_current_window_ = None;
806 } 821 }
807 target_current_context_.reset(); 822 target_current_context_.reset();
808 repeat_mouse_move_timer_.Stop(); 823 repeat_mouse_move_timer_.Stop();
809 end_move_loop_timer_.Stop(); 824 end_move_loop_timer_.Stop();
810 } 825 }
811 826
812 scoped_ptr<X11MoveLoop> DesktopDragDropClientAuraX11::CreateMoveLoop( 827 scoped_ptr<X11MoveLoop> DesktopDragDropClientAuraX11::CreateMoveLoop(
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
1192 for (int x = 0; x < in_bitmap->width(); ++x) { 1207 for (int x = 0; x < in_bitmap->width(); ++x) {
1193 if (SkColorGetA(in_row[x]) > kMinAlpha) 1208 if (SkColorGetA(in_row[x]) > kMinAlpha)
1194 return true; 1209 return true;
1195 } 1210 }
1196 } 1211 }
1197 1212
1198 return false; 1213 return false;
1199 } 1214 }
1200 1215
1201 } // namespace views 1216 } // namespace views
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698