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

Side by Side Diff: mash/wm/root_window_controller.cc

Issue 2024313002: Moves mash/wm/public -> ash/public (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: extra Created 4 years, 6 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "mash/wm/root_window_controller.h" 5 #include "mash/wm/root_window_controller.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <map> 9 #include <map>
10 #include <sstream> 10 #include <sstream>
(...skipping 26 matching lines...) Expand all
37 #include "mash/wm/screenlock_layout.h" 37 #include "mash/wm/screenlock_layout.h"
38 #include "mash/wm/shadow_controller.h" 38 #include "mash/wm/shadow_controller.h"
39 #include "mash/wm/shelf_layout_manager.h" 39 #include "mash/wm/shelf_layout_manager.h"
40 #include "mash/wm/status_layout_manager.h" 40 #include "mash/wm/status_layout_manager.h"
41 #include "mash/wm/window_manager.h" 41 #include "mash/wm/window_manager.h"
42 #include "mash/wm/window_manager_application.h" 42 #include "mash/wm/window_manager_application.h"
43 #include "mojo/public/cpp/bindings/type_converter.h" 43 #include "mojo/public/cpp/bindings/type_converter.h"
44 #include "services/shell/public/cpp/connector.h" 44 #include "services/shell/public/cpp/connector.h"
45 #include "ui/display/mojo/display_type_converters.h" 45 #include "ui/display/mojo/display_type_converters.h"
46 46
47 using ash::mojom::Container;
msw 2016/06/01 01:51:42 nit: remove using or use it in more cases below?
sky 2016/06/01 03:30:26 Made it used everywhere.
48
47 namespace mash { 49 namespace mash {
48 namespace wm { 50 namespace wm {
49 namespace { 51 namespace {
50 52
51 const uint32_t kWindowSwitchAccelerator = 1; 53 const uint32_t kWindowSwitchAccelerator = 1;
52 54
53 void AssertTrue(bool success) { 55 void AssertTrue(bool success) {
54 DCHECK(success); 56 DCHECK(success);
55 } 57 }
56 58
57 int ContainerToLocalId(mojom::Container container) { 59 int ContainerToLocalId(ash::mojom::Container container) {
58 return static_cast<int>(container); 60 return static_cast<int>(container);
59 } 61 }
60 62
61 class WorkspaceLayoutManagerDelegateImpl 63 class WorkspaceLayoutManagerDelegateImpl
62 : public ash::wm::WorkspaceLayoutManagerDelegate { 64 : public ash::wm::WorkspaceLayoutManagerDelegate {
63 public: 65 public:
64 explicit WorkspaceLayoutManagerDelegateImpl( 66 explicit WorkspaceLayoutManagerDelegateImpl(
65 WmRootWindowControllerMus* root_window_controller) 67 WmRootWindowControllerMus* root_window_controller)
66 : root_window_controller_(root_window_controller) {} 68 : root_window_controller_(root_window_controller) {}
67 ~WorkspaceLayoutManagerDelegateImpl() override = default; 69 ~WorkspaceLayoutManagerDelegateImpl() override = default;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 // This case only happens if we're destroyed before OnEmbed(). 105 // This case only happens if we're destroyed before OnEmbed().
104 delete this; 106 delete this;
105 } 107 }
106 } 108 }
107 109
108 shell::Connector* RootWindowController::GetConnector() { 110 shell::Connector* RootWindowController::GetConnector() {
109 return app_->connector(); 111 return app_->connector();
110 } 112 }
111 113
112 mus::Window* RootWindowController::GetWindowForContainer( 114 mus::Window* RootWindowController::GetWindowForContainer(
113 mojom::Container container) { 115 ash::mojom::Container container) {
114 return root_->GetChildByLocalId(ContainerToLocalId(container)); 116 return root_->GetChildByLocalId(ContainerToLocalId(container));
115 } 117 }
116 118
117 bool RootWindowController::WindowIsContainer(const mus::Window* window) const { 119 bool RootWindowController::WindowIsContainer(const mus::Window* window) const {
118 return window && 120 return window &&
119 window->local_id() > ContainerToLocalId(mojom::Container::ROOT) && 121 window->local_id() > ContainerToLocalId(ash::mojom::Container::ROOT) &&
120 window->local_id() < ContainerToLocalId(mojom::Container::COUNT); 122 window->local_id() < ContainerToLocalId(ash::mojom::Container::COUNT);
121 } 123 }
122 124
123 mus::WindowManagerClient* RootWindowController::window_manager_client() { 125 mus::WindowManagerClient* RootWindowController::window_manager_client() {
124 return window_manager_->window_manager_client(); 126 return window_manager_->window_manager_client();
125 } 127 }
126 128
127 void RootWindowController::OnAccelerator(uint32_t id, const ui::Event& event) { 129 void RootWindowController::OnAccelerator(uint32_t id, const ui::Event& event) {
128 switch (id) { 130 switch (id) {
129 case kWindowSwitchAccelerator: 131 case kWindowSwitchAccelerator:
130 window_manager_client()->ActivateNextWindow(); 132 window_manager_client()->ActivateNextWindow();
131 break; 133 break;
132 default: 134 default:
133 app_->OnAccelerator(id, event); 135 app_->OnAccelerator(id, event);
134 break; 136 break;
135 } 137 }
136 } 138 }
137 139
138 ShelfLayoutManager* RootWindowController::GetShelfLayoutManager() { 140 ShelfLayoutManager* RootWindowController::GetShelfLayoutManager() {
139 return static_cast<ShelfLayoutManager*>( 141 return static_cast<ShelfLayoutManager*>(
140 layout_managers_[GetWindowForContainer( 142 layout_managers_[GetWindowForContainer(
141 mojom::Container::USER_PRIVATE_SHELF)] 143 ash::mojom::Container::USER_PRIVATE_SHELF)]
142 .get()); 144 .get());
143 } 145 }
144 146
145 StatusLayoutManager* RootWindowController::GetStatusLayoutManager() { 147 StatusLayoutManager* RootWindowController::GetStatusLayoutManager() {
146 return static_cast<StatusLayoutManager*>( 148 return static_cast<StatusLayoutManager*>(
147 layout_managers_[GetWindowForContainer(mojom::Container::STATUS)].get()); 149 layout_managers_[GetWindowForContainer(ash::mojom::Container::STATUS)]
150 .get());
148 } 151 }
149 152
150 RootWindowController::RootWindowController(WindowManagerApplication* app) 153 RootWindowController::RootWindowController(WindowManagerApplication* app)
151 : app_(app), root_(nullptr), window_count_(0) { 154 : app_(app), root_(nullptr), window_count_(0) {
152 window_manager_.reset(new WindowManager); 155 window_manager_.reset(new WindowManager);
153 } 156 }
154 157
155 RootWindowController::~RootWindowController() {} 158 RootWindowController::~RootWindowController() {}
156 159
157 void RootWindowController::AddAccelerators() { 160 void RootWindowController::AddAccelerators() {
158 window_manager_client()->AddAccelerator( 161 window_manager_client()->AddAccelerator(
159 kWindowSwitchAccelerator, 162 kWindowSwitchAccelerator,
160 mus::CreateKeyMatcher(mus::mojom::KeyboardCode::TAB, 163 mus::CreateKeyMatcher(mus::mojom::KeyboardCode::TAB,
161 mus::mojom::kEventFlagControlDown), 164 mus::mojom::kEventFlagControlDown),
162 base::Bind(&AssertTrue)); 165 base::Bind(&AssertTrue));
163 } 166 }
164 167
165 void RootWindowController::OnEmbed(mus::Window* root) { 168 void RootWindowController::OnEmbed(mus::Window* root) {
166 root_ = root; 169 root_ = root;
167 root_->set_local_id(ContainerToLocalId(mojom::Container::ROOT)); 170 root_->set_local_id(ContainerToLocalId(ash::mojom::Container::ROOT));
168 root_->AddObserver(this); 171 root_->AddObserver(this);
169 layout_managers_[root_].reset(new FillLayout(root_)); 172 layout_managers_[root_].reset(new FillLayout(root_));
170 173
171 app_->OnRootWindowControllerGotRoot(this); 174 app_->OnRootWindowControllerGotRoot(this);
172 175
173 wm_root_window_controller_.reset( 176 wm_root_window_controller_.reset(
174 new WmRootWindowControllerMus(app_->globals(), this)); 177 new WmRootWindowControllerMus(app_->globals(), this));
175 178
176 CreateContainers(); 179 CreateContainers();
177 180
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 ash::PanelLayoutManager::Get(WmWindowMus::Get(root_)) 226 ash::PanelLayoutManager::Get(WmWindowMus::Get(root_))
224 ->SetShelf(wm_shelf_.get()); 227 ->SetShelf(wm_shelf_.get());
225 228
226 // TODO: http://crbug.com/614182 Ash's ShelfLayoutManager implements 229 // TODO: http://crbug.com/614182 Ash's ShelfLayoutManager implements
227 // DockedWindowLayoutManagerObserver so that it can inset by the docked 230 // DockedWindowLayoutManagerObserver so that it can inset by the docked
228 // windows. 231 // windows.
229 // docked_layout_manager_->AddObserver(shelf_->shelf_layout_manager()); 232 // docked_layout_manager_->AddObserver(shelf_->shelf_layout_manager());
230 } 233 }
231 234
232 void RootWindowController::CreateContainer( 235 void RootWindowController::CreateContainer(
233 mash::wm::mojom::Container container, 236 ash::mojom::Container container,
234 mash::wm::mojom::Container parent_container) { 237 ash::mojom::Container parent_container) {
235 // Set the window's name to the container name (e.g. "Container::LOGIN"), 238 // Set the window's name to the container name (e.g. "Container::LOGIN"),
236 // which makes the window hierarchy easier to read. 239 // which makes the window hierarchy easier to read.
237 std::map<std::string, std::vector<uint8_t>> properties; 240 std::map<std::string, std::vector<uint8_t>> properties;
238 std::ostringstream container_name; 241 std::ostringstream container_name;
239 container_name << container; 242 container_name << container;
240 properties[mus::mojom::WindowManager::kName_Property] = 243 properties[mus::mojom::WindowManager::kName_Property] =
241 mojo::ConvertTo<std::vector<uint8_t>>(container_name.str()); 244 mojo::ConvertTo<std::vector<uint8_t>>(container_name.str());
242 245
243 mus::Window* window = root_->window_tree()->NewWindow(&properties); 246 mus::Window* window = root_->window_tree()->NewWindow(&properties);
244 window->set_local_id(ContainerToLocalId(container)); 247 window->set_local_id(ContainerToLocalId(container));
245 layout_managers_[window].reset(new FillLayout(window)); 248 layout_managers_[window].reset(new FillLayout(window));
246 WmWindowMus::Get(window)->SetShellWindowId( 249 WmWindowMus::Get(window)->SetShellWindowId(
247 MashContainerToAshContainer(container)); 250 MashContainerToAshContainer(container));
248 251
249 // User private windows are hidden by default until the window manager learns 252 // User private windows are hidden by default until the window manager learns
250 // the lock state, so their contents are never accidentally revealed. Tests, 253 // the lock state, so their contents are never accidentally revealed. Tests,
251 // however, usually assume the screen is unlocked. 254 // however, usually assume the screen is unlocked.
252 const bool is_test = base::CommandLine::ForCurrentProcess()->HasSwitch( 255 const bool is_test = base::CommandLine::ForCurrentProcess()->HasSwitch(
253 mus::switches::kUseTestConfig); 256 mus::switches::kUseTestConfig);
254 window->SetVisible(container != mojom::Container::USER_PRIVATE || is_test); 257 window->SetVisible(container != ash::mojom::Container::USER_PRIVATE ||
258 is_test);
255 259
256 mus::Window* parent = 260 mus::Window* parent =
257 root_->GetChildByLocalId(ContainerToLocalId(parent_container)); 261 root_->GetChildByLocalId(ContainerToLocalId(parent_container));
258 parent->AddChild(window); 262 parent->AddChild(window);
259 } 263 }
260 264
261 void RootWindowController::CreateContainers() { 265 void RootWindowController::CreateContainers() {
262 CreateContainer(mojom::Container::ALL_USER_BACKGROUND, 266 CreateContainer(Container::ALL_USER_BACKGROUND, Container::ROOT);
263 mojom::Container::ROOT); 267 CreateContainer(Container::USER, Container::ROOT);
264 CreateContainer(mojom::Container::USER, mojom::Container::ROOT); 268 CreateContainer(Container::USER_BACKGROUND, Container::USER);
265 CreateContainer(mojom::Container::USER_BACKGROUND, mojom::Container::USER); 269 CreateContainer(Container::USER_PRIVATE, Container::USER);
266 CreateContainer(mojom::Container::USER_PRIVATE, mojom::Container::USER); 270 CreateContainer(Container::USER_PRIVATE_WINDOWS, Container::USER_PRIVATE);
267 CreateContainer(mojom::Container::USER_PRIVATE_WINDOWS, 271 CreateContainer(Container::USER_PRIVATE_ALWAYS_ON_TOP_WINDOWS,
268 mojom::Container::USER_PRIVATE); 272 Container::USER_PRIVATE);
269 CreateContainer(mojom::Container::USER_PRIVATE_ALWAYS_ON_TOP_WINDOWS, 273 CreateContainer(Container::USER_PRIVATE_DOCKED_WINDOWS,
270 mojom::Container::USER_PRIVATE); 274 Container::USER_PRIVATE);
271 CreateContainer(mojom::Container::USER_PRIVATE_DOCKED_WINDOWS, 275 CreateContainer(Container::USER_PRIVATE_PRESENTATION_WINDOWS,
272 mojom::Container::USER_PRIVATE); 276 Container::USER_PRIVATE);
273 CreateContainer(mojom::Container::USER_PRIVATE_PRESENTATION_WINDOWS, 277 CreateContainer(Container::USER_PRIVATE_SHELF, Container::USER_PRIVATE);
274 mojom::Container::USER_PRIVATE); 278 CreateContainer(Container::USER_PRIVATE_PANELS, Container::USER_PRIVATE);
275 CreateContainer(mojom::Container::USER_PRIVATE_SHELF, 279 CreateContainer(Container::USER_PRIVATE_APP_LIST, Container::USER_PRIVATE);
276 mojom::Container::USER_PRIVATE); 280 CreateContainer(Container::USER_PRIVATE_SYSTEM_MODAL,
277 CreateContainer(mojom::Container::USER_PRIVATE_PANELS, 281 Container::USER_PRIVATE);
278 mojom::Container::USER_PRIVATE); 282 CreateContainer(Container::LOGIN, Container::ROOT);
279 CreateContainer(mojom::Container::USER_PRIVATE_APP_LIST, 283 CreateContainer(Container::LOGIN_WINDOWS, Container::LOGIN);
280 mojom::Container::USER_PRIVATE); 284 CreateContainer(Container::LOGIN_APP, Container::LOGIN);
281 CreateContainer(mojom::Container::USER_PRIVATE_SYSTEM_MODAL, 285 CreateContainer(Container::LOGIN_SHELF, Container::LOGIN);
282 mojom::Container::USER_PRIVATE); 286 CreateContainer(Container::STATUS, Container::ROOT);
283 CreateContainer(mojom::Container::LOGIN, mojom::Container::ROOT); 287 CreateContainer(Container::BUBBLES, Container::ROOT);
284 CreateContainer(mojom::Container::LOGIN_WINDOWS, mojom::Container::LOGIN); 288 CreateContainer(Container::SYSTEM_MODAL_WINDOWS, Container::ROOT);
285 CreateContainer(mojom::Container::LOGIN_APP, mojom::Container::LOGIN); 289 CreateContainer(Container::KEYBOARD, Container::ROOT);
286 CreateContainer(mojom::Container::LOGIN_SHELF, mojom::Container::LOGIN); 290 CreateContainer(Container::MENUS, Container::ROOT);
287 CreateContainer(mojom::Container::STATUS, mojom::Container::ROOT); 291 CreateContainer(Container::DRAG_AND_TOOLTIPS, Container::ROOT);
288 CreateContainer(mojom::Container::BUBBLES, mojom::Container::ROOT);
289 CreateContainer(mojom::Container::SYSTEM_MODAL_WINDOWS,
290 mojom::Container::ROOT);
291 CreateContainer(mojom::Container::KEYBOARD, mojom::Container::ROOT);
292 CreateContainer(mojom::Container::MENUS, mojom::Container::ROOT);
293 CreateContainer(mojom::Container::DRAG_AND_TOOLTIPS, mojom::Container::ROOT);
294 292
295 // Override the default layout managers for certain containers. 293 // Override the default layout managers for certain containers.
296 mus::Window* user_background = 294 mus::Window* user_background =
297 GetWindowForContainer(mojom::Container::USER_BACKGROUND); 295 GetWindowForContainer(Container::USER_BACKGROUND);
298 layout_managers_[user_background].reset( 296 layout_managers_[user_background].reset(
299 new BackgroundLayout(user_background)); 297 new BackgroundLayout(user_background));
300 298
301 mus::Window* login_app = GetWindowForContainer(mojom::Container::LOGIN_APP); 299 mus::Window* login_app = GetWindowForContainer(Container::LOGIN_APP);
302 layout_managers_[login_app].reset(new ScreenlockLayout(login_app)); 300 layout_managers_[login_app].reset(new ScreenlockLayout(login_app));
303 301
304 mus::Window* user_shelf = 302 mus::Window* user_shelf =
305 GetWindowForContainer(mojom::Container::USER_PRIVATE_SHELF); 303 GetWindowForContainer(Container::USER_PRIVATE_SHELF);
306 ShelfLayoutManager* shelf_layout_manager = 304 ShelfLayoutManager* shelf_layout_manager =
307 new ShelfLayoutManager(user_shelf, this); 305 new ShelfLayoutManager(user_shelf, this);
308 layout_managers_[user_shelf].reset(shelf_layout_manager); 306 layout_managers_[user_shelf].reset(shelf_layout_manager);
309 307
310 wm_shelf_.reset(new WmShelfMus(shelf_layout_manager)); 308 wm_shelf_.reset(new WmShelfMus(shelf_layout_manager));
311 309
312 mus::Window* status = GetWindowForContainer(mojom::Container::STATUS); 310 mus::Window* status = GetWindowForContainer(Container::STATUS);
313 layout_managers_[status].reset(new StatusLayoutManager(status)); 311 layout_managers_[status].reset(new StatusLayoutManager(status));
314 312
315 mus::Window* user_private_windows = 313 mus::Window* user_private_windows =
316 GetWindowForContainer(mojom::Container::USER_PRIVATE_WINDOWS); 314 GetWindowForContainer(Container::USER_PRIVATE_WINDOWS);
317 // WorkspaceLayoutManager is not a mash::wm::LayoutManager (it's an 315 // WorkspaceLayoutManager is not a mash::wm::LayoutManager (it's an
318 // ash::wm::LayoutManager), so it can't be in |layout_managers_|. 316 // ash::wm::LayoutManager), so it can't be in |layout_managers_|.
319 layout_managers_.erase(user_private_windows); 317 layout_managers_.erase(user_private_windows);
320 std::unique_ptr<WorkspaceLayoutManagerDelegateImpl> 318 std::unique_ptr<WorkspaceLayoutManagerDelegateImpl>
321 workspace_layout_manager_delegate(new WorkspaceLayoutManagerDelegateImpl( 319 workspace_layout_manager_delegate(new WorkspaceLayoutManagerDelegateImpl(
322 wm_root_window_controller_.get())); 320 wm_root_window_controller_.get()));
323 WmWindowMus* user_private_windows_wm = WmWindowMus::Get(user_private_windows); 321 WmWindowMus* user_private_windows_wm = WmWindowMus::Get(user_private_windows);
324 user_private_windows_wm->SetSnapsChildrenToPhysicalPixelBoundary(); 322 user_private_windows_wm->SetSnapsChildrenToPhysicalPixelBoundary();
325 user_private_windows_wm->SetChildrenUseExtendedHitRegion(); 323 user_private_windows_wm->SetChildrenUseExtendedHitRegion();
326 user_private_windows_wm->SetLayoutManager( 324 user_private_windows_wm->SetLayoutManager(
327 base::WrapUnique(new ash::WorkspaceLayoutManager( 325 base::WrapUnique(new ash::WorkspaceLayoutManager(
328 user_private_windows_wm, 326 user_private_windows_wm,
329 std::move(workspace_layout_manager_delegate)))); 327 std::move(workspace_layout_manager_delegate))));
330 328
331 mus::Window* user_private_docked_windows = 329 mus::Window* user_private_docked_windows =
332 GetWindowForContainer(mojom::Container::USER_PRIVATE_DOCKED_WINDOWS); 330 GetWindowForContainer(Container::USER_PRIVATE_DOCKED_WINDOWS);
333 WmWindowMus* user_private_docked_windows_wm = 331 WmWindowMus* user_private_docked_windows_wm =
334 WmWindowMus::Get(user_private_docked_windows); 332 WmWindowMus::Get(user_private_docked_windows);
335 user_private_docked_windows_wm->SetSnapsChildrenToPhysicalPixelBoundary(); 333 user_private_docked_windows_wm->SetSnapsChildrenToPhysicalPixelBoundary();
336 layout_managers_.erase(user_private_docked_windows); 334 layout_managers_.erase(user_private_docked_windows);
337 user_private_docked_windows_wm->SetChildrenUseExtendedHitRegion(); 335 user_private_docked_windows_wm->SetChildrenUseExtendedHitRegion();
338 user_private_docked_windows_wm->SetLayoutManager(base::WrapUnique( 336 user_private_docked_windows_wm->SetLayoutManager(base::WrapUnique(
339 new ash::DockedWindowLayoutManager(user_private_docked_windows_wm))); 337 new ash::DockedWindowLayoutManager(user_private_docked_windows_wm)));
340 338
341 mus::Window* user_private_panels = 339 mus::Window* user_private_panels =
342 GetWindowForContainer(mojom::Container::USER_PRIVATE_PANELS); 340 GetWindowForContainer(Container::USER_PRIVATE_PANELS);
343 WmWindowMus* user_private_panels_wm = WmWindowMus::Get(user_private_panels); 341 WmWindowMus* user_private_panels_wm = WmWindowMus::Get(user_private_panels);
344 user_private_panels_wm->SetSnapsChildrenToPhysicalPixelBoundary(); 342 user_private_panels_wm->SetSnapsChildrenToPhysicalPixelBoundary();
345 layout_managers_.erase(user_private_panels); 343 layout_managers_.erase(user_private_panels);
346 user_private_panels_wm->SetChildrenUseExtendedHitRegion(); 344 user_private_panels_wm->SetChildrenUseExtendedHitRegion();
347 user_private_panels_wm->SetLayoutManager( 345 user_private_panels_wm->SetLayoutManager(
348 base::WrapUnique(new ash::PanelLayoutManager(user_private_panels_wm))); 346 base::WrapUnique(new ash::PanelLayoutManager(user_private_panels_wm)));
349 347
350 mus::Window* user_private_always_on_top = GetWindowForContainer( 348 mus::Window* user_private_always_on_top =
351 mojom::Container::USER_PRIVATE_ALWAYS_ON_TOP_WINDOWS); 349 GetWindowForContainer(Container::USER_PRIVATE_ALWAYS_ON_TOP_WINDOWS);
352 WmWindowMus* user_private_always_on_top_wm = 350 WmWindowMus* user_private_always_on_top_wm =
353 WmWindowMus::Get(user_private_always_on_top); 351 WmWindowMus::Get(user_private_always_on_top);
354 user_private_always_on_top_wm->SetChildrenUseExtendedHitRegion(); 352 user_private_always_on_top_wm->SetChildrenUseExtendedHitRegion();
355 user_private_always_on_top_wm->SetSnapsChildrenToPhysicalPixelBoundary(); 353 user_private_always_on_top_wm->SetSnapsChildrenToPhysicalPixelBoundary();
356 } 354 }
357 355
358 } // namespace wm 356 } // namespace wm
359 } // namespace mash 357 } // namespace mash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698