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

Side by Side Diff: ash/wm/workspace/workspace_layout_manager_unittest.cc

Issue 9226040: Renames and moves some workspace related classes to the workspace (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 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 | Annotate | Revision Log
« no previous file with comments | « ash/wm/workspace/workspace_layout_manager.cc ('k') | ash/wm/workspace_controller.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 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 "ash/wm/default_container_layout_manager.h" 5 #include "ash/wm/workspace/workspace_layout_manager.h"
6 6
7 #include "ash/wm/workspace/workspace.h" 7 #include "ash/wm/workspace/workspace.h"
8 #include "ash/wm/workspace/workspace_manager.h" 8 #include "ash/wm/workspace/workspace_manager.h"
9 #include "ash/wm/workspace_controller.h" 9 #include "ash/wm/workspace_controller.h"
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
11 #include "base/compiler_specific.h" 11 #include "base/compiler_specific.h"
12 #include "base/memory/scoped_vector.h" 12 #include "base/memory/scoped_vector.h"
13 #include "ui/aura/client/aura_constants.h" 13 #include "ui/aura/client/aura_constants.h"
14 #include "ui/aura/root_window.h" 14 #include "ui/aura/root_window.h"
15 #include "ui/aura/screen_aura.h" 15 #include "ui/aura/screen_aura.h"
16 #include "ui/aura/test/aura_test_base.h" 16 #include "ui/aura/test/aura_test_base.h"
17 #include "ui/aura/window.h" 17 #include "ui/aura/window.h"
18 #include "ui/base/ui_base_types.h" 18 #include "ui/base/ui_base_types.h"
19 #include "ui/views/widget/native_widget_aura.h" 19 #include "ui/views/widget/native_widget_aura.h"
20 20
21 namespace ash { 21 namespace ash {
22 namespace test { 22 namespace test {
23 23
24 namespace { 24 namespace {
25 25
26 using views::Widget; 26 using views::Widget;
27 using ash::internal::DefaultContainerLayoutManager; 27 using ash::internal::WorkspaceLayoutManager;
28 28
29 class DefaultContainerLayoutManagerTest : public aura::test::AuraTestBase { 29 class WorkspaceLayoutManagerTest : public aura::test::AuraTestBase {
30 public: 30 public:
31 DefaultContainerLayoutManagerTest() : layout_manager_(NULL) {} 31 WorkspaceLayoutManagerTest() : layout_manager_(NULL) {}
32 virtual ~DefaultContainerLayoutManagerTest() {} 32 virtual ~WorkspaceLayoutManagerTest() {}
33 33
34 virtual void SetUp() OVERRIDE { 34 virtual void SetUp() OVERRIDE {
35 aura::test::AuraTestBase::SetUp(); 35 aura::test::AuraTestBase::SetUp();
36 aura::RootWindow* root_window = aura::RootWindow::GetInstance(); 36 aura::RootWindow* root_window = aura::RootWindow::GetInstance();
37 container_.reset( 37 container_.reset(
38 CreateTestWindow(gfx::Rect(0, 0, 500, 400), root_window)); 38 CreateTestWindow(gfx::Rect(0, 0, 500, 400), root_window));
39 workspace_controller_.reset( 39 workspace_controller_.reset(
40 new ash::internal::WorkspaceController(container_.get())); 40 new ash::internal::WorkspaceController(container_.get()));
41 layout_manager_ = new DefaultContainerLayoutManager( 41 layout_manager_ = new WorkspaceLayoutManager(
42 workspace_controller_->workspace_manager()); 42 workspace_controller_->workspace_manager());
43 container_->SetLayoutManager(layout_manager_); 43 container_->SetLayoutManager(layout_manager_);
44 44
45 root_window->SetHostSize(gfx::Size(500, 400)); 45 root_window->SetHostSize(gfx::Size(500, 400));
46 } 46 }
47 47
48 aura::Window* CreateTestWindowWithType(const gfx::Rect& bounds, 48 aura::Window* CreateTestWindowWithType(const gfx::Rect& bounds,
49 aura::Window* parent, 49 aura::Window* parent,
50 aura::client::WindowType type) { 50 aura::client::WindowType type) {
51 aura::Window* window = new aura::Window(NULL); 51 aura::Window* window = new aura::Window(NULL);
52 window->SetType(type); 52 window->SetType(type);
53 window->Init(ui::Layer::LAYER_HAS_NO_TEXTURE); 53 window->Init(ui::Layer::LAYER_HAS_NO_TEXTURE);
54 window->SetBounds(bounds); 54 window->SetBounds(bounds);
55 window->Show(); 55 window->Show();
56 window->SetParent(parent); 56 window->SetParent(parent);
57 return window; 57 return window;
58 } 58 }
59 59
60 aura::Window* CreateTestWindow(const gfx::Rect& bounds, 60 aura::Window* CreateTestWindow(const gfx::Rect& bounds,
61 aura::Window* parent) { 61 aura::Window* parent) {
62 return CreateTestWindowWithType(bounds, 62 return CreateTestWindowWithType(bounds,
63 parent, 63 parent,
64 aura::client::WINDOW_TYPE_NORMAL); 64 aura::client::WINDOW_TYPE_NORMAL);
65 } 65 }
66 66
67 aura::Window* container() { return container_.get(); } 67 aura::Window* container() { return container_.get(); }
68 68
69 DefaultContainerLayoutManager* default_container_layout_manager() { 69 WorkspaceLayoutManager* default_container_layout_manager() {
70 return layout_manager_; 70 return layout_manager_;
71 } 71 }
72 72
73 protected: 73 protected:
74 ash::internal::WorkspaceManager* workspace_manager() { 74 ash::internal::WorkspaceManager* workspace_manager() {
75 return workspace_controller_->workspace_manager(); 75 return workspace_controller_->workspace_manager();
76 } 76 }
77 77
78 private: 78 private:
79 scoped_ptr<aura::Window> container_; 79 scoped_ptr<aura::Window> container_;
80 scoped_ptr<ash::internal::WorkspaceController> workspace_controller_; 80 scoped_ptr<ash::internal::WorkspaceController> workspace_controller_;
81 // LayoutManager is owned by |container|. 81 // LayoutManager is owned by |container|.
82 ash::internal::DefaultContainerLayoutManager* layout_manager_; 82 ash::internal::WorkspaceLayoutManager* layout_manager_;
83 83
84 private: 84 private:
85 DISALLOW_COPY_AND_ASSIGN(DefaultContainerLayoutManagerTest); 85 DISALLOW_COPY_AND_ASSIGN(WorkspaceLayoutManagerTest);
86 }; 86 };
87 87
88 // Utility functions to set and get show state on |window|. 88 // Utility functions to set and get show state on |window|.
89 void Maximize(aura::Window* window) { 89 void Maximize(aura::Window* window) {
90 window->SetIntProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); 90 window->SetIntProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED);
91 } 91 }
92 92
93 void Fullscreen(aura::Window* window) { 93 void Fullscreen(aura::Window* window) {
94 window->SetIntProperty(aura::client::kShowStateKey, 94 window->SetIntProperty(aura::client::kShowStateKey,
95 ui::SHOW_STATE_FULLSCREEN); 95 ui::SHOW_STATE_FULLSCREEN);
96 } 96 }
97 97
98 void Restore(aura::Window* window) { 98 void Restore(aura::Window* window) {
99 window->SetIntProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); 99 window->SetIntProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
100 } 100 }
101 101
102 ui::WindowShowState GetShowState(aura::Window* window) { 102 ui::WindowShowState GetShowState(aura::Window* window) {
103 return static_cast<ui::WindowShowState>( 103 return static_cast<ui::WindowShowState>(
104 window->GetIntProperty(aura::client::kShowStateKey)); 104 window->GetIntProperty(aura::client::kShowStateKey));
105 } 105 }
106 106
107 } // namespace 107 } // namespace
108 108
109 TEST_F(DefaultContainerLayoutManagerTest, SetBounds) { 109 TEST_F(WorkspaceLayoutManagerTest, SetBounds) {
110 // Layout Manager moves the window to (0,0) to fit to draggable area. 110 // Layout Manager moves the window to (0,0) to fit to draggable area.
111 scoped_ptr<aura::Window> child( 111 scoped_ptr<aura::Window> child(
112 CreateTestWindow(gfx::Rect(0, -1000, 100, 100), container())); 112 CreateTestWindow(gfx::Rect(0, -1000, 100, 100), container()));
113 // Window is centered in workspace. 113 // Window is centered in workspace.
114 EXPECT_EQ("200,0 100x100", child->bounds().ToString()); 114 EXPECT_EQ("200,0 100x100", child->bounds().ToString());
115 115
116 // DCLM enforces the window height can't be taller than its owner's height. 116 // DCLM enforces the window height can't be taller than its owner's height.
117 child->SetBounds(gfx::Rect(0, 0, 100, 500)); 117 child->SetBounds(gfx::Rect(0, 0, 100, 500));
118 EXPECT_EQ("200,0 100x400", child->bounds().ToString()); 118 EXPECT_EQ("200,0 100x400", child->bounds().ToString());
119 119
120 // DCLM enforces the window width can't be wider than its owner's width. 120 // DCLM enforces the window width can't be wider than its owner's width.
121 child->SetBounds(gfx::Rect(0, 0, 900, 500)); 121 child->SetBounds(gfx::Rect(0, 0, 900, 500));
122 EXPECT_EQ("0,0 500x400", child->bounds().ToString()); 122 EXPECT_EQ("0,0 500x400", child->bounds().ToString());
123 123
124 // Y origin must always be the top of drag area. 124 // Y origin must always be the top of drag area.
125 child->SetBounds(gfx::Rect(0, 500, 900, 500)); 125 child->SetBounds(gfx::Rect(0, 500, 900, 500));
126 EXPECT_EQ("0,0 500x400", child->bounds().ToString()); 126 EXPECT_EQ("0,0 500x400", child->bounds().ToString());
127 child->SetBounds(gfx::Rect(0, -500, 900, 500)); 127 child->SetBounds(gfx::Rect(0, -500, 900, 500));
128 EXPECT_EQ("0,0 500x400", child->bounds().ToString()); 128 EXPECT_EQ("0,0 500x400", child->bounds().ToString());
129 } 129 }
130 130
131 TEST_F(DefaultContainerLayoutManagerTest, DragWindow) { 131 TEST_F(WorkspaceLayoutManagerTest, DragWindow) {
132 scoped_ptr<aura::Window> child( 132 scoped_ptr<aura::Window> child(
133 CreateTestWindow(gfx::Rect(0, -1000, 50, 50), container())); 133 CreateTestWindow(gfx::Rect(0, -1000, 50, 50), container()));
134 gfx::Rect original_bounds = child->bounds(); 134 gfx::Rect original_bounds = child->bounds();
135 135
136 default_container_layout_manager()->PrepareForMoveOrResize( 136 default_container_layout_manager()->PrepareForMoveOrResize(
137 child.get(), NULL); 137 child.get(), NULL);
138 // X origin must fit within viewport. 138 // X origin must fit within viewport.
139 child->SetBounds(gfx::Rect(-100, 500, 50, 50)); 139 child->SetBounds(gfx::Rect(-100, 500, 50, 50));
140 EXPECT_EQ("0,0 50x50", child->GetTargetBounds().ToString()); 140 EXPECT_EQ("0,0 50x50", child->GetTargetBounds().ToString());
141 child->SetBounds(gfx::Rect(1000, 500, 50, 50)); 141 child->SetBounds(gfx::Rect(1000, 500, 50, 50));
142 EXPECT_EQ("450,0 50x50", child->GetTargetBounds().ToString()); 142 EXPECT_EQ("450,0 50x50", child->GetTargetBounds().ToString());
143 default_container_layout_manager()->EndMove(child.get(), NULL); 143 default_container_layout_manager()->EndMove(child.get(), NULL);
144 EXPECT_EQ(original_bounds.ToString(), child->GetTargetBounds().ToString()); 144 EXPECT_EQ(original_bounds.ToString(), child->GetTargetBounds().ToString());
145 } 145 }
146 146
147 TEST_F(DefaultContainerLayoutManagerTest, Popup) { 147 TEST_F(WorkspaceLayoutManagerTest, Popup) {
148 scoped_ptr<aura::Window> popup( 148 scoped_ptr<aura::Window> popup(
149 CreateTestWindowWithType(gfx::Rect(0, -1000, 100, 100), 149 CreateTestWindowWithType(gfx::Rect(0, -1000, 100, 100),
150 container(), 150 container(),
151 aura::client::WINDOW_TYPE_POPUP)); 151 aura::client::WINDOW_TYPE_POPUP));
152 // A popup window can be placed outside of draggable area. 152 // A popup window can be placed outside of draggable area.
153 EXPECT_EQ("0,-1000 100x100", popup->bounds().ToString()); 153 EXPECT_EQ("0,-1000 100x100", popup->bounds().ToString());
154 154
155 // A popup window can be moved to outside of draggable area. 155 // A popup window can be moved to outside of draggable area.
156 popup->SetBounds(gfx::Rect(-100, 0, 100, 100)); 156 popup->SetBounds(gfx::Rect(-100, 0, 100, 100));
157 EXPECT_EQ("-100,0 100x100", popup->bounds().ToString()); 157 EXPECT_EQ("-100,0 100x100", popup->bounds().ToString());
158 158
159 // A popup window can be resized to the size bigger than draggable area. 159 // A popup window can be resized to the size bigger than draggable area.
160 popup->SetBounds(gfx::Rect(0, 0, 1000, 1000)); 160 popup->SetBounds(gfx::Rect(0, 0, 1000, 1000));
161 EXPECT_EQ("0,0 1000x1000", popup->bounds().ToString()); 161 EXPECT_EQ("0,0 1000x1000", popup->bounds().ToString());
162 } 162 }
163 163
164 // Make sure a window with a transient parent isn't resized by the layout 164 // Make sure a window with a transient parent isn't resized by the layout
165 // manager. 165 // manager.
166 TEST_F(DefaultContainerLayoutManagerTest, IgnoreTransient) { 166 TEST_F(WorkspaceLayoutManagerTest, IgnoreTransient) {
167 scoped_ptr<aura::Window> window(new aura::Window(NULL)); 167 scoped_ptr<aura::Window> window(new aura::Window(NULL));
168 window->SetType(aura::client::WINDOW_TYPE_NORMAL); 168 window->SetType(aura::client::WINDOW_TYPE_NORMAL);
169 window->Init(ui::Layer::LAYER_HAS_NO_TEXTURE); 169 window->Init(ui::Layer::LAYER_HAS_NO_TEXTURE);
170 aura::RootWindow::GetInstance()->AddTransientChild(window.get()); 170 aura::RootWindow::GetInstance()->AddTransientChild(window.get());
171 window->SetBounds(gfx::Rect(0, 0, 200, 200)); 171 window->SetBounds(gfx::Rect(0, 0, 200, 200));
172 window->Show(); 172 window->Show();
173 window->SetParent(container()); 173 window->SetParent(container());
174 174
175 EXPECT_EQ("0,0 200x200", window->bounds().ToString()); 175 EXPECT_EQ("0,0 200x200", window->bounds().ToString());
176 } 176 }
177 177
178 TEST_F(DefaultContainerLayoutManagerTest, Fullscreen) { 178 TEST_F(WorkspaceLayoutManagerTest, Fullscreen) {
179 scoped_ptr<aura::Window> w( 179 scoped_ptr<aura::Window> w(
180 CreateTestWindow(gfx::Rect(0, 0, 100, 100), container())); 180 CreateTestWindow(gfx::Rect(0, 0, 100, 100), container()));
181 gfx::Rect fullscreen_bounds = 181 gfx::Rect fullscreen_bounds =
182 workspace_manager()->FindBy(w.get())->bounds(); 182 workspace_manager()->FindBy(w.get())->bounds();
183 gfx::Rect original_bounds = w->GetTargetBounds(); 183 gfx::Rect original_bounds = w->GetTargetBounds();
184 184
185 // Restoreing the restored window. 185 // Restoreing the restored window.
186 Restore(w.get()); 186 Restore(w.get());
187 EXPECT_EQ(ui::SHOW_STATE_NORMAL, GetShowState(w.get())); 187 EXPECT_EQ(ui::SHOW_STATE_NORMAL, GetShowState(w.get()));
188 EXPECT_EQ(original_bounds.ToString(), w->bounds().ToString()); 188 EXPECT_EQ(original_bounds.ToString(), w->bounds().ToString());
(...skipping 19 matching lines...) Expand all
208 gfx::Rect new_bounds(50, 50, 50, 50); 208 gfx::Rect new_bounds(50, 50, 50, 50);
209 Fullscreen(w.get()); 209 Fullscreen(w.get());
210 w->SetBounds(new_bounds); 210 w->SetBounds(new_bounds);
211 EXPECT_EQ(fullscreen_bounds.ToString(), w->bounds().ToString()); 211 EXPECT_EQ(fullscreen_bounds.ToString(), w->bounds().ToString());
212 EXPECT_EQ(ui::SHOW_STATE_FULLSCREEN, GetShowState(w.get())); 212 EXPECT_EQ(ui::SHOW_STATE_FULLSCREEN, GetShowState(w.get()));
213 Restore(w.get()); 213 Restore(w.get());
214 EXPECT_EQ(ui::SHOW_STATE_NORMAL, GetShowState(w.get())); 214 EXPECT_EQ(ui::SHOW_STATE_NORMAL, GetShowState(w.get()));
215 EXPECT_EQ(50, w->bounds().height()); 215 EXPECT_EQ(50, w->bounds().height());
216 } 216 }
217 217
218 TEST_F(DefaultContainerLayoutManagerTest, Maximized) { 218 TEST_F(WorkspaceLayoutManagerTest, Maximized) {
219 scoped_ptr<aura::Window> w( 219 scoped_ptr<aura::Window> w(
220 CreateTestWindow(gfx::Rect(0, 0, 100, 100), container())); 220 CreateTestWindow(gfx::Rect(0, 0, 100, 100), container()));
221 gfx::Rect original_bounds = w->GetTargetBounds(); 221 gfx::Rect original_bounds = w->GetTargetBounds();
222 gfx::Rect fullscreen_bounds = 222 gfx::Rect fullscreen_bounds =
223 workspace_manager()->FindBy(w.get())->bounds(); 223 workspace_manager()->FindBy(w.get())->bounds();
224 gfx::Rect work_area_bounds = 224 gfx::Rect work_area_bounds =
225 workspace_manager()->FindBy(w.get())->GetWorkAreaBounds(); 225 workspace_manager()->FindBy(w.get())->GetWorkAreaBounds();
226 226
227 // Maximized 227 // Maximized
228 Maximize(w.get()); 228 Maximize(w.get());
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 gfx::Rect new_bounds(50, 50, 50, 50); 260 gfx::Rect new_bounds(50, 50, 50, 50);
261 Maximize(w.get()); 261 Maximize(w.get());
262 w->SetBounds(new_bounds); 262 w->SetBounds(new_bounds);
263 EXPECT_EQ(work_area_bounds.ToString(), w->bounds().ToString()); 263 EXPECT_EQ(work_area_bounds.ToString(), w->bounds().ToString());
264 Restore(w.get()); 264 Restore(w.get());
265 EXPECT_EQ(ui::SHOW_STATE_NORMAL, GetShowState(w.get())); 265 EXPECT_EQ(ui::SHOW_STATE_NORMAL, GetShowState(w.get()));
266 EXPECT_EQ(50, w->bounds().height()); 266 EXPECT_EQ(50, w->bounds().height());
267 } 267 }
268 268
269 // Tests that fullscreen windows get resized after root window is resized. 269 // Tests that fullscreen windows get resized after root window is resized.
270 TEST_F(DefaultContainerLayoutManagerTest, FullscreenAfterRootWindowResize) { 270 TEST_F(WorkspaceLayoutManagerTest, FullscreenAfterRootWindowResize) {
271 scoped_ptr<aura::Window> w1(CreateTestWindow(gfx::Rect(300, 400), 271 scoped_ptr<aura::Window> w1(CreateTestWindow(gfx::Rect(300, 400),
272 container())); 272 container()));
273 gfx::Rect window_bounds = w1->GetTargetBounds(); 273 gfx::Rect window_bounds = w1->GetTargetBounds();
274 gfx::Rect fullscreen_bounds = 274 gfx::Rect fullscreen_bounds =
275 workspace_manager()->FindBy(w1.get())->bounds(); 275 workspace_manager()->FindBy(w1.get())->bounds();
276 276
277 w1->Show(); 277 w1->Show();
278 EXPECT_EQ(window_bounds.ToString(), w1->bounds().ToString()); 278 EXPECT_EQ(window_bounds.ToString(), w1->bounds().ToString());
279 279
280 Fullscreen(w1.get()); 280 Fullscreen(w1.get());
(...skipping 15 matching lines...) Expand all
296 296
297 Restore(w1.get()); 297 Restore(w1.get());
298 298
299 // The following test does not pass due to crbug.com/102413. 299 // The following test does not pass due to crbug.com/102413.
300 // TODO(oshima): Re-enable this once the bug is fixed. 300 // TODO(oshima): Re-enable this once the bug is fixed.
301 // EXPECT_EQ(window_bounds.size().ToString(), 301 // EXPECT_EQ(window_bounds.size().ToString(),
302 // w1->GetTargetBounds().size().ToString()); 302 // w1->GetTargetBounds().size().ToString());
303 } 303 }
304 304
305 // Tests that maximized windows get resized after root_window is resized. 305 // Tests that maximized windows get resized after root_window is resized.
306 TEST_F(DefaultContainerLayoutManagerTest, MaximizeAfterRootWindowResize) { 306 TEST_F(WorkspaceLayoutManagerTest, MaximizeAfterRootWindowResize) {
307 scoped_ptr<aura::Window> w1(CreateTestWindow(gfx::Rect(300, 400), 307 scoped_ptr<aura::Window> w1(CreateTestWindow(gfx::Rect(300, 400),
308 container())); 308 container()));
309 gfx::Rect window_bounds = w1->GetTargetBounds(); 309 gfx::Rect window_bounds = w1->GetTargetBounds();
310 gfx::Rect work_area_bounds = 310 gfx::Rect work_area_bounds =
311 workspace_manager()->FindBy(w1.get())->GetWorkAreaBounds(); 311 workspace_manager()->FindBy(w1.get())->GetWorkAreaBounds();
312 312
313 w1->Show(); 313 w1->Show();
314 EXPECT_EQ(window_bounds.ToString(), w1->bounds().ToString()); 314 EXPECT_EQ(window_bounds.ToString(), w1->bounds().ToString());
315 315
316 Maximize(w1.get()); 316 Maximize(w1.get());
(...skipping 15 matching lines...) Expand all
332 332
333 Restore(w1.get()); 333 Restore(w1.get());
334 // The following test does not pass due to crbug.com/102413. 334 // The following test does not pass due to crbug.com/102413.
335 // TODO(oshima): Re-enable this once the bug is fixed. 335 // TODO(oshima): Re-enable this once the bug is fixed.
336 // EXPECT_EQ(window_bounds.size().ToString(), 336 // EXPECT_EQ(window_bounds.size().ToString(),
337 // w1->GetTargetBounds().size().ToString()); 337 // w1->GetTargetBounds().size().ToString());
338 } 338 }
339 339
340 } // namespace test 340 } // namespace test
341 } // namespace ash 341 } // namespace ash
OLDNEW
« no previous file with comments | « ash/wm/workspace/workspace_layout_manager.cc ('k') | ash/wm/workspace_controller.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698