OLD | NEW |
| (Empty) |
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. | |
4 | |
5 #include <gtk/gtk.h> | |
6 | |
7 #include "base/memory/scoped_ptr.h" | |
8 #include "chrome/browser/ui/browser.h" | |
9 #include "chrome/browser/ui/browser_window.h" | |
10 #include "chrome/browser/ui/gtk/browser_window_gtk.h" | |
11 #include "chrome/browser/ui/gtk/bubble/bubble_gtk.h" | |
12 #include "chrome/browser/ui/gtk/gtk_theme_service.h" | |
13 #include "chrome/browser/ui/gtk/gtk_util.h" | |
14 #include "chrome/test/base/in_process_browser_test.h" | |
15 #include "ui/base/gtk/gtk_hig_constants.h" | |
16 | |
17 class BubbleGtkTest : public InProcessBrowserTest, | |
18 public BubbleDelegateGtk { | |
19 public: | |
20 BubbleGtkTest() : browser_window_(NULL) { | |
21 } | |
22 | |
23 virtual ~BubbleGtkTest() { | |
24 } | |
25 | |
26 // BubbleDelegateGtk implementation. | |
27 virtual void BubbleClosing(BubbleGtk* bubble, | |
28 bool closed_by_escape) OVERRIDE { | |
29 } | |
30 | |
31 Profile* GetProfile() { | |
32 return browser()->profile(); | |
33 } | |
34 | |
35 GtkWidget* GetNativeBrowserWindow() { | |
36 if (!browser_window_) | |
37 browser_window_ = GTK_WIDGET(browser()->window()->GetNativeWindow()); | |
38 return browser_window_; | |
39 } | |
40 | |
41 private: | |
42 GtkWidget* browser_window_; | |
43 }; | |
44 | |
45 // Tests that we can adjust a bubble arrow so we can show a bubble without being | |
46 // clipped. This test verifies the following four issues: | |
47 // 1. Shows a bubble to the top-left corner and see its frame style always | |
48 // becomes ANCHOR_TOP_LEFT. | |
49 // 2. Shows a bubble to the top-right corner and see its frame style always | |
50 // becomes ANCHOR_TOP_RIGHT. | |
51 // 3. Shows a bubble to the bottom-left corner and see its frame style always | |
52 // becomes ANCHOR_BOTTOM_LEFT. | |
53 // 4. Shows a bubble to the top-left corner and see its frame style always | |
54 // becomes ANCHOR_BOTTOM_RIGHT. | |
55 IN_PROC_BROWSER_TEST_F(BubbleGtkTest, ArrowLocation) { | |
56 int width = gdk_screen_get_width(gdk_screen_get_default()); | |
57 int height = gdk_screen_get_height(gdk_screen_get_default()); | |
58 struct { | |
59 int x, y; | |
60 BubbleGtk::FrameStyle expected; | |
61 } points[] = { | |
62 {0, 0, BubbleGtk::ANCHOR_TOP_LEFT}, | |
63 {width - 1, 0, BubbleGtk::ANCHOR_TOP_RIGHT}, | |
64 {0, height - 1, BubbleGtk::ANCHOR_BOTTOM_LEFT}, | |
65 {width - 1, height - 1, BubbleGtk::ANCHOR_BOTTOM_RIGHT}, | |
66 }; | |
67 static const BubbleGtk::FrameStyle kPreferredLocations[] = { | |
68 BubbleGtk::ANCHOR_TOP_LEFT, | |
69 BubbleGtk::ANCHOR_TOP_RIGHT, | |
70 BubbleGtk::ANCHOR_BOTTOM_LEFT, | |
71 BubbleGtk::ANCHOR_BOTTOM_RIGHT, | |
72 }; | |
73 | |
74 GtkWidget* anchor = GetNativeBrowserWindow(); | |
75 GtkThemeService* theme_service = GtkThemeService::GetFrom(GetProfile()); | |
76 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(points); ++i) { | |
77 for (size_t j = 0; j < arraysize(kPreferredLocations); ++j) { | |
78 static const char kText[] = | |
79 "Google's mission is to organize the world's information and make it" | |
80 " universally accessible and useful."; | |
81 GtkWidget* label = theme_service->BuildLabel(kText, ui::kGdkBlack); | |
82 gfx::Rect rect(points[i].x, points[i].y, 0, 0); | |
83 BubbleGtk* bubble = BubbleGtk::Show(anchor, | |
84 &rect, | |
85 label, | |
86 kPreferredLocations[j], | |
87 BubbleGtk::MATCH_SYSTEM_THEME | | |
88 BubbleGtk::POPUP_WINDOW | | |
89 BubbleGtk::GRAB_INPUT, | |
90 theme_service, | |
91 this); | |
92 EXPECT_EQ(points[i].expected, bubble->actual_frame_style_); | |
93 bubble->Close(); | |
94 } | |
95 } | |
96 } | |
97 | |
98 IN_PROC_BROWSER_TEST_F(BubbleGtkTest, NoArrow) { | |
99 int width = gdk_screen_get_width(gdk_screen_get_default()); | |
100 int height = gdk_screen_get_height(gdk_screen_get_default()); | |
101 struct { | |
102 int x, y; | |
103 BubbleGtk::FrameStyle expected; | |
104 } points[] = { | |
105 {0, 0, BubbleGtk::FLOAT_BELOW_RECT}, | |
106 {width - 1, 0, BubbleGtk::FLOAT_BELOW_RECT}, | |
107 {0, height - 1, BubbleGtk::CENTER_OVER_RECT}, | |
108 {width - 1, height - 1, BubbleGtk::CENTER_OVER_RECT}, | |
109 }; | |
110 static const BubbleGtk::FrameStyle kPreferredLocations[] = { | |
111 BubbleGtk::FLOAT_BELOW_RECT, | |
112 BubbleGtk::CENTER_OVER_RECT, | |
113 }; | |
114 | |
115 GtkWidget* anchor = GetNativeBrowserWindow(); | |
116 GtkThemeService* theme_service = GtkThemeService::GetFrom(GetProfile()); | |
117 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(points); ++i) { | |
118 for (size_t j = 0; j < arraysize(kPreferredLocations); ++j) { | |
119 static const char kText[] = | |
120 "Google's mission is to organize the world's information and make it" | |
121 " universally accessible and useful."; | |
122 GtkWidget* label = theme_service->BuildLabel(kText, ui::kGdkBlack); | |
123 gfx::Rect rect(points[i].x, points[i].y, 0, 0); | |
124 BubbleGtk* bubble = BubbleGtk::Show(anchor, | |
125 &rect, | |
126 label, | |
127 kPreferredLocations[j], | |
128 BubbleGtk::MATCH_SYSTEM_THEME | | |
129 BubbleGtk::POPUP_WINDOW | | |
130 BubbleGtk::GRAB_INPUT, | |
131 theme_service, | |
132 this); | |
133 EXPECT_EQ(points[i].expected, bubble->actual_frame_style_); | |
134 bubble->Close(); | |
135 } | |
136 } | |
137 } | |
OLD | NEW |