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

Side by Side Diff: chrome/browser/ui/views/tabs/tab_drag_controller.cc

Issue 2640433004: ChromeOS MD: Fix cannot drag tab onto immersive fullscreen window (Closed)
Patch Set: modify test coverage, but it is a disabled test Created 3 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 "chrome/browser/ui/views/tabs/tab_drag_controller.h" 5 #include "chrome/browser/ui/views/tabs/tab_drag_controller.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 #include <set> 8 #include <set>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 805 matching lines...) Expand 10 before | Expand all | Expand 10 after
816 gfx::NativeWindow local_window; 816 gfx::NativeWindow local_window;
817 const Liveness state = GetLocalProcessWindow( 817 const Liveness state = GetLocalProcessWindow(
818 point_in_screen, is_dragging_window_, &local_window); 818 point_in_screen, is_dragging_window_, &local_window);
819 if (state == Liveness::DELETED) 819 if (state == Liveness::DELETED)
820 return Liveness::DELETED; 820 return Liveness::DELETED;
821 821
822 // Do not allow dragging into a window with a modal dialog, it causes a weird 822 // Do not allow dragging into a window with a modal dialog, it causes a weird
823 // behavior. See crbug.com/336691 823 // behavior. See crbug.com/336691
824 if (!GetModalTransient(local_window)) { 824 if (!GetModalTransient(local_window)) {
825 TabStrip* result = GetTabStripForWindow(local_window); 825 TabStrip* result = GetTabStripForWindow(local_window);
826 if (result && DoesTabStripContain(result, point_in_screen)) { 826 if (result && DoesTabStripContain(result, point_in_screen, local_window)) {
827 *tab_strip = result; 827 *tab_strip = result;
828 return Liveness::ALIVE; 828 return Liveness::ALIVE;
829 } 829 }
830 } 830 }
831 831
832 *tab_strip = is_dragging_window_ ? attached_tabstrip_ : nullptr; 832 *tab_strip = is_dragging_window_ ? attached_tabstrip_ : nullptr;
833 return Liveness::ALIVE; 833 return Liveness::ALIVE;
834 } 834 }
835 835
836 TabStrip* TabDragController::GetTabStripForWindow(gfx::NativeWindow window) { 836 TabStrip* TabDragController::GetTabStripForWindow(gfx::NativeWindow window) {
837 if (!window) 837 if (!window)
838 return NULL; 838 return NULL;
839 BrowserView* browser_view = 839 BrowserView* browser_view =
840 BrowserView::GetBrowserViewForNativeWindow(window); 840 BrowserView::GetBrowserViewForNativeWindow(window);
841 // We don't allow drops on windows that don't have tabstrips. 841 // We don't allow drops on windows that don't have tabstrips.
842 if (!browser_view || 842 if (!browser_view ||
843 !browser_view->browser()->SupportsWindowFeature( 843 !browser_view->browser()->SupportsWindowFeature(
844 Browser::FEATURE_TABSTRIP)) 844 Browser::FEATURE_TABSTRIP))
845 return NULL; 845 return NULL;
846 846
847 TabStrip* other_tabstrip = browser_view->tabstrip(); 847 TabStrip* other_tabstrip = browser_view->tabstrip();
848 TabStrip* tab_strip = 848 TabStrip* tab_strip =
849 attached_tabstrip_ ? attached_tabstrip_ : source_tabstrip_; 849 attached_tabstrip_ ? attached_tabstrip_ : source_tabstrip_;
850 DCHECK(tab_strip); 850 DCHECK(tab_strip);
851 851
852 return other_tabstrip->controller()->IsCompatibleWith(tab_strip) ? 852 return other_tabstrip->controller()->IsCompatibleWith(tab_strip) ?
853 other_tabstrip : NULL; 853 other_tabstrip : NULL;
854 } 854 }
855 855
856 bool TabDragController::DoesTabStripContain( 856 bool TabDragController::DoesTabStripContain(TabStrip* tabstrip,
857 TabStrip* tabstrip, 857 const gfx::Point& point_in_screen,
858 const gfx::Point& point_in_screen) const { 858 gfx::NativeWindow window) const {
859 // Make sure the specified screen point is actually within the bounds of the 859 // Make sure the specified screen point is actually within the bounds of the
860 // specified tabstrip... 860 // specified tabstrip.
861 gfx::Rect tabstrip_bounds = GetViewScreenBounds(tabstrip); 861 gfx::Rect tabstrip_bounds = GetViewScreenBounds(tabstrip);
862 return point_in_screen.x() < tabstrip_bounds.right() && 862 #if defined(OS_CHROMEOS)
sky 2017/01/17 18:07:01 Why does this need to be chromeos specific? Immers
Qiang(Joe) Xu 2017/01/18 01:13:52 done
863 DCHECK(window);
864 BrowserView* browser_view =
865 BrowserView::GetBrowserViewForNativeWindow(window);
866 DCHECK(browser_view);
867 bool hidden_top_views =
868 browser_view->immersive_mode_controller()->ShouldHideTopViews();
869 // When |window| is immersive non-revealed mode, get |tabstrip_bounds| from
870 // non-client view coordinates where tabstrip should be laid when revealed.
871 if (hidden_top_views) {
872 tabstrip_bounds = browser_view->frame()->GetBoundsForTabStrip(tabstrip);
873 aura::Window::ConvertRectToTarget(window, window->GetRootWindow(),
874 &tabstrip_bounds);
875 }
876 #endif
877
878 bool res =
879 point_in_screen.x() < tabstrip_bounds.right() &&
863 point_in_screen.x() >= tabstrip_bounds.x() && 880 point_in_screen.x() >= tabstrip_bounds.x() &&
864 DoesRectContainVerticalPointExpanded(tabstrip_bounds, 881 DoesRectContainVerticalPointExpanded(
865 kVerticalDetachMagnetism, 882 tabstrip_bounds, kVerticalDetachMagnetism, point_in_screen.y());
866 point_in_screen.y()); 883 #if defined(OS_CHROMEOS)
884 if (res && hidden_top_views) {
885 tabstrip->SetVisible(true);
sky 2017/01/17 18:07:01 This function is meant to check whether the tabstr
Qiang(Joe) Xu 2017/01/18 01:13:52 done by moving to DragBrowserToNewTabStrip
886 tabstrip->SetBoundsRect(tabstrip_bounds);
887 }
888 #endif
889 return res;
867 } 890 }
868 891
869 void TabDragController::Attach(TabStrip* attached_tabstrip, 892 void TabDragController::Attach(TabStrip* attached_tabstrip,
870 const gfx::Point& point_in_screen) { 893 const gfx::Point& point_in_screen) {
871 TRACE_EVENT1("views", "TabDragController::Attach", 894 TRACE_EVENT1("views", "TabDragController::Attach",
872 "point_in_screen", point_in_screen.ToString()); 895 "point_in_screen", point_in_screen.ToString());
873 896
874 DCHECK(!attached_tabstrip_); // We should already have detached by the time 897 DCHECK(!attached_tabstrip_); // We should already have detached by the time
875 // we get here. 898 // we get here.
876 899
(...skipping 918 matching lines...) Expand 10 before | Expand all | Expand 10 after
1795 // TODO(pkotwicz): Fix this properly (crbug.com/358482) 1818 // TODO(pkotwicz): Fix this properly (crbug.com/358482)
1796 for (auto* browser : *BrowserList::GetInstance()) { 1819 for (auto* browser : *BrowserList::GetInstance()) {
1797 if (browser->tab_strip_model()->empty()) 1820 if (browser->tab_strip_model()->empty())
1798 exclude.insert(browser->window()->GetNativeWindow()); 1821 exclude.insert(browser->window()->GetNativeWindow());
1799 } 1822 }
1800 #endif 1823 #endif
1801 base::WeakPtr<TabDragController> ref(weak_factory_.GetWeakPtr()); 1824 base::WeakPtr<TabDragController> ref(weak_factory_.GetWeakPtr());
1802 *window = window_finder_->GetLocalProcessWindowAtPoint(screen_point, exclude); 1825 *window = window_finder_->GetLocalProcessWindowAtPoint(screen_point, exclude);
1803 return ref ? Liveness::ALIVE : Liveness::DELETED; 1826 return ref ? Liveness::ALIVE : Liveness::DELETED;
1804 } 1827 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698