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

Side by Side Diff: ash/common/wm/default_state.cc

Issue 2590123002: Prevent maximize/minimize/fullscreen-ize window in trusted pinned mode. (Closed)
Patch Set: Created 4 years 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/common/wm/default_state.h" 5 #include "ash/common/wm/default_state.h"
6 6
7 #include "ash/common/wm/dock/docked_window_layout_manager.h" 7 #include "ash/common/wm/dock/docked_window_layout_manager.h"
8 #include "ash/common/wm/window_animation_types.h" 8 #include "ash/common/wm/window_animation_types.h"
9 #include "ash/common/wm/window_parenting_utils.h" 9 #include "ash/common/wm/window_parenting_utils.h"
10 #include "ash/common/wm/window_positioning_utils.h" 10 #include "ash/common/wm/window_positioning_utils.h"
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 159
160 } // namespace 160 } // namespace
161 161
162 DefaultState::DefaultState(WindowStateType initial_state_type) 162 DefaultState::DefaultState(WindowStateType initial_state_type)
163 : state_type_(initial_state_type), stored_window_state_(nullptr) {} 163 : state_type_(initial_state_type), stored_window_state_(nullptr) {}
164 DefaultState::~DefaultState() {} 164 DefaultState::~DefaultState() {}
165 165
166 void DefaultState::OnWMEvent(WindowState* window_state, const WMEvent* event) { 166 void DefaultState::OnWMEvent(WindowState* window_state, const WMEvent* event) {
167 if (ProcessWorkspaceEvents(window_state, event)) 167 if (ProcessWorkspaceEvents(window_state, event))
168 return; 168 return;
169 169
oshima 2016/12/21 01:38:58 It's probably safer to reject all request in the f
hidehiko 2016/12/21 06:57:30 Done.
170 if (ProcessCompoundEvents(window_state, event)) 170 if (ProcessCompoundEvents(window_state, event))
171 return; 171 return;
172 172
173 WindowStateType current_state_type = window_state->GetStateType(); 173 WindowStateType current_state_type = window_state->GetStateType();
174 WindowStateType next_state_type = WINDOW_STATE_TYPE_NORMAL; 174 WindowStateType next_state_type = WINDOW_STATE_TYPE_NORMAL;
175 switch (event->type()) { 175 switch (event->type()) {
176 case WM_EVENT_NORMAL: 176 case WM_EVENT_NORMAL:
177 next_state_type = current_state_type == WINDOW_STATE_TYPE_DOCKED_MINIMIZED 177 next_state_type = current_state_type == WINDOW_STATE_TYPE_DOCKED_MINIMIZED
178 ? WINDOW_STATE_TYPE_DOCKED 178 ? WINDOW_STATE_TYPE_DOCKED
179 : WINDOW_STATE_TYPE_NORMAL; 179 : WINDOW_STATE_TYPE_NORMAL;
180 break; 180 break;
181 case WM_EVENT_MAXIMIZE: 181 case WM_EVENT_MAXIMIZE:
182 if (window_state->IsTrustedPinned())
183 return;
182 next_state_type = WINDOW_STATE_TYPE_MAXIMIZED; 184 next_state_type = WINDOW_STATE_TYPE_MAXIMIZED;
183 break; 185 break;
184 case WM_EVENT_MINIMIZE: 186 case WM_EVENT_MINIMIZE:
187 if (window_state->IsTrustedPinned())
188 return;
185 next_state_type = current_state_type == WINDOW_STATE_TYPE_DOCKED 189 next_state_type = current_state_type == WINDOW_STATE_TYPE_DOCKED
186 ? WINDOW_STATE_TYPE_DOCKED_MINIMIZED 190 ? WINDOW_STATE_TYPE_DOCKED_MINIMIZED
187 : WINDOW_STATE_TYPE_MINIMIZED; 191 : WINDOW_STATE_TYPE_MINIMIZED;
188 break; 192 break;
189 case WM_EVENT_FULLSCREEN: 193 case WM_EVENT_FULLSCREEN:
194 if (window_state->IsTrustedPinned())
195 return;
190 next_state_type = WINDOW_STATE_TYPE_FULLSCREEN; 196 next_state_type = WINDOW_STATE_TYPE_FULLSCREEN;
191 break; 197 break;
192 case WM_EVENT_SNAP_LEFT: 198 case WM_EVENT_SNAP_LEFT:
193 next_state_type = WINDOW_STATE_TYPE_LEFT_SNAPPED; 199 next_state_type = WINDOW_STATE_TYPE_LEFT_SNAPPED;
194 break; 200 break;
195 case WM_EVENT_SNAP_RIGHT: 201 case WM_EVENT_SNAP_RIGHT:
196 next_state_type = WINDOW_STATE_TYPE_RIGHT_SNAPPED; 202 next_state_type = WINDOW_STATE_TYPE_RIGHT_SNAPPED;
197 break; 203 break;
198 case WM_EVENT_DOCK: 204 case WM_EVENT_DOCK:
199 next_state_type = WINDOW_STATE_TYPE_DOCKED; 205 next_state_type = WINDOW_STATE_TYPE_DOCKED;
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 stored_display_state_ = window_state->window()->GetDisplayNearestWindow(); 292 stored_display_state_ = window_state->window()->GetDisplayNearestWindow();
287 } 293 }
288 294
289 // static 295 // static
290 bool DefaultState::ProcessCompoundEvents(WindowState* window_state, 296 bool DefaultState::ProcessCompoundEvents(WindowState* window_state,
291 const WMEvent* event) { 297 const WMEvent* event) {
292 WmWindow* window = window_state->window(); 298 WmWindow* window = window_state->window();
293 299
294 switch (event->type()) { 300 switch (event->type()) {
295 case WM_EVENT_TOGGLE_MAXIMIZE_CAPTION: 301 case WM_EVENT_TOGGLE_MAXIMIZE_CAPTION:
302 if (window_state->IsTrustedPinned())
303 return true;
296 if (window_state->IsFullscreen()) { 304 if (window_state->IsFullscreen()) {
297 const wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN); 305 const wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
298 window_state->OnWMEvent(&event); 306 window_state->OnWMEvent(&event);
299 } else if (window_state->IsMaximized()) { 307 } else if (window_state->IsMaximized()) {
300 window_state->Restore(); 308 window_state->Restore();
301 } else if (window_state->IsNormalOrSnapped()) { 309 } else if (window_state->IsNormalOrSnapped()) {
302 if (window_state->CanMaximize()) 310 if (window_state->CanMaximize())
303 window_state->Maximize(); 311 window_state->Maximize();
304 } 312 }
305 return true; 313 return true;
306 case WM_EVENT_TOGGLE_MAXIMIZE: 314 case WM_EVENT_TOGGLE_MAXIMIZE:
315 if (window_state->IsTrustedPinned())
316 return true;
307 if (window_state->IsFullscreen()) { 317 if (window_state->IsFullscreen()) {
308 const wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN); 318 const wm::WMEvent event(wm::WM_EVENT_TOGGLE_FULLSCREEN);
309 window_state->OnWMEvent(&event); 319 window_state->OnWMEvent(&event);
310 } else if (window_state->IsMaximized()) { 320 } else if (window_state->IsMaximized()) {
311 window_state->Restore(); 321 window_state->Restore();
312 } else if (window_state->CanMaximize()) { 322 } else if (window_state->CanMaximize()) {
313 window_state->Maximize(); 323 window_state->Maximize();
314 } 324 }
315 return true; 325 return true;
316 case WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE: { 326 case WM_EVENT_TOGGLE_VERTICAL_MAXIMIZE: {
327 if (window_state->IsTrustedPinned())
328 return true;
317 gfx::Rect work_area = GetDisplayWorkAreaBoundsInParent(window); 329 gfx::Rect work_area = GetDisplayWorkAreaBoundsInParent(window);
318 330
319 // Maximize vertically if: 331 // Maximize vertically if:
320 // - The window does not have a max height defined. 332 // - The window does not have a max height defined.
321 // - The window has the normal state type. Snapped windows are excluded 333 // - The window has the normal state type. Snapped windows are excluded
322 // because they are already maximized vertically and reverting to the 334 // because they are already maximized vertically and reverting to the
323 // restored bounds looks weird. 335 // restored bounds looks weird.
324 if (window->GetMaximumSize().height() != 0 || 336 if (window->GetMaximumSize().height() != 0 ||
325 !window_state->IsNormalStateType()) { 337 !window_state->IsNormalStateType()) {
326 return true; 338 return true;
327 } 339 }
328 if (window_state->HasRestoreBounds() && 340 if (window_state->HasRestoreBounds() &&
329 (window->GetBounds().height() == work_area.height() && 341 (window->GetBounds().height() == work_area.height() &&
330 window->GetBounds().y() == work_area.y())) { 342 window->GetBounds().y() == work_area.y())) {
331 window_state->SetAndClearRestoreBounds(); 343 window_state->SetAndClearRestoreBounds();
332 } else { 344 } else {
333 window_state->SaveCurrentBoundsForRestore(); 345 window_state->SaveCurrentBoundsForRestore();
334 window->SetBounds(gfx::Rect(window->GetBounds().x(), work_area.y(), 346 window->SetBounds(gfx::Rect(window->GetBounds().x(), work_area.y(),
335 window->GetBounds().width(), 347 window->GetBounds().width(),
336 work_area.height())); 348 work_area.height()));
337 } 349 }
338 return true; 350 return true;
339 } 351 }
340 case WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE: { 352 case WM_EVENT_TOGGLE_HORIZONTAL_MAXIMIZE: {
353 if (window_state->IsTrustedPinned())
354 return true;
355
341 // Maximize horizontally if: 356 // Maximize horizontally if:
342 // - The window does not have a max width defined. 357 // - The window does not have a max width defined.
343 // - The window is snapped or has the normal state type. 358 // - The window is snapped or has the normal state type.
344 if (window->GetMaximumSize().width() != 0) 359 if (window->GetMaximumSize().width() != 0)
345 return true; 360 return true;
346 if (!window_state->IsNormalOrSnapped()) 361 if (!window_state->IsNormalOrSnapped())
347 return true; 362 return true;
348 gfx::Rect work_area = GetDisplayWorkAreaBoundsInParent(window); 363 gfx::Rect work_area = GetDisplayWorkAreaBoundsInParent(window);
349 if (window_state->IsNormalStateType() && 364 if (window_state->IsNormalStateType() &&
350 window_state->HasRestoreBounds() && 365 window_state->HasRestoreBounds() &&
(...skipping 13 matching lines...) Expand all
364 // which match the workspace bounds exactly so it is necessary to set 379 // which match the workspace bounds exactly so it is necessary to set
365 // the bounds again below. 380 // the bounds again below.
366 } 381 }
367 382
368 window_state->SetRestoreBoundsInParent(restore_bounds); 383 window_state->SetRestoreBoundsInParent(restore_bounds);
369 window->SetBounds(new_bounds); 384 window->SetBounds(new_bounds);
370 } 385 }
371 return true; 386 return true;
372 } 387 }
373 case WM_EVENT_TOGGLE_FULLSCREEN: 388 case WM_EVENT_TOGGLE_FULLSCREEN:
389 if (window_state->IsTrustedPinned())
390 return true;
374 ToggleFullScreen(window_state, window_state->delegate()); 391 ToggleFullScreen(window_state, window_state->delegate());
375 return true; 392 return true;
376 case WM_EVENT_CYCLE_SNAP_DOCK_LEFT: 393 case WM_EVENT_CYCLE_SNAP_DOCK_LEFT:
377 case WM_EVENT_CYCLE_SNAP_DOCK_RIGHT: 394 case WM_EVENT_CYCLE_SNAP_DOCK_RIGHT:
378 CycleSnapDock(window_state, event->type()); 395 CycleSnapDock(window_state, event->type());
379 return true; 396 return true;
380 case WM_EVENT_CENTER: 397 case WM_EVENT_CENTER:
381 CenterWindow(window_state); 398 CenterWindow(window_state);
382 return true; 399 return true;
383 case WM_EVENT_NORMAL: 400 case WM_EVENT_NORMAL:
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
768 gfx::Rect center_in_parent = GetDisplayWorkAreaBoundsInParent(window); 785 gfx::Rect center_in_parent = GetDisplayWorkAreaBoundsInParent(window);
769 center_in_parent.ClampToCenteredSize(window->GetBounds().size()); 786 center_in_parent.ClampToCenteredSize(window->GetBounds().size());
770 window_state->SetBoundsDirectAnimated(center_in_parent); 787 window_state->SetBoundsDirectAnimated(center_in_parent);
771 } 788 }
772 // Centering window is treated as if a user moved and resized the window. 789 // Centering window is treated as if a user moved and resized the window.
773 window_state->set_bounds_changed_by_user(true); 790 window_state->set_bounds_changed_by_user(true);
774 } 791 }
775 792
776 } // namespace wm 793 } // namespace wm
777 } // namespace ash 794 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698