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

Side by Side Diff: components/exo/shell_surface.cc

Issue 2743053002: arc: Fix race condition in applying modal state. (Closed)
Patch Set: unit_test added + refactored apply logic Created 3 years, 9 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "components/exo/shell_surface.h" 5 #include "components/exo/shell_surface.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "ash/common/frame/custom_frame_view_ash.h" 9 #include "ash/common/frame/custom_frame_view_ash.h"
10 #include "ash/common/shelf/wm_shelf.h" 10 #include "ash/common/shelf/wm_shelf.h"
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 // managed system modal dialogs using a single ShellSurface instance. 489 // managed system modal dialogs using a single ShellSurface instance.
490 // Hit-test region will be non-empty when at least one dialog exists on 490 // Hit-test region will be non-empty when at least one dialog exists on
491 // the client side. Here we detect the transition between no client side 491 // the client side. Here we detect the transition between no client side
492 // dialog and at least one dialog so activatable state is properly 492 // dialog and at least one dialog so activatable state is properly
493 // updated. 493 // updated.
494 if (container_ != ash::kShellWindowId_SystemModalContainer) { 494 if (container_ != ash::kShellWindowId_SystemModalContainer) {
495 LOG(ERROR) 495 LOG(ERROR)
496 << "Only a window in SystemModalContainer can change the modality"; 496 << "Only a window in SystemModalContainer can change the modality";
497 return; 497 return;
498 } 498 }
499
500 if (system_modal == system_modal_)
501 return;
502
503 system_modal_ = system_modal;
504
505 if (!widget_) {
reveman 2017/03/11 00:45:08 nit: I don't think we should have this warning. Se
khmel 2017/03/11 01:33:32 Nice, done
506 DLOG(WARNING) << "Skip setting system modal state to " << system_modal_
507 << " because window is not ready yet.";
508 return;
509 }
510
511 UpdateSystemModal();
512 }
513
514 void ShellSurface::UpdateSystemModal() {
515 DCHECK(widget_);
516 DCHECK(!system_modal_ ||
517 container_ == ash::kShellWindowId_SystemModalContainer);
reveman 2017/03/11 00:45:09 nit: just DCHECK_EQ(container_, ash::kShellWindowI
khmel 2017/03/11 01:33:32 Done.
499 widget_->GetNativeWindow()->SetProperty( 518 widget_->GetNativeWindow()->SetProperty(
500 aura::client::kModalKey, 519 aura::client::kModalKey,
501 system_modal ? ui::MODAL_TYPE_SYSTEM : ui::MODAL_TYPE_NONE); 520 system_modal_ ? ui::MODAL_TYPE_SYSTEM : ui::MODAL_TYPE_NONE);
502 } 521 }
503 522
504 // static 523 // static
505 void ShellSurface::SetApplicationId(aura::Window* window, 524 void ShellSurface::SetApplicationId(aura::Window* window,
506 const std::string& id) { 525 const std::string& id) {
507 TRACE_EVENT1("exo", "ShellSurface::SetApplicationId", "application_id", id); 526 TRACE_EVENT1("exo", "ShellSurface::SetApplicationId", "application_id", id);
508 window->SetProperty(aura::client::kAppIdKey, new std::string(id)); 527 window->SetProperty(aura::client::kAppIdKey, new std::string(id));
509 } 528 }
510 529
511 // static 530 // static
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
759 surface_->window()->SetTransform(transform); 778 surface_->window()->SetTransform(transform);
760 scale_ = pending_scale_; 779 scale_ = pending_scale_;
761 } 780 }
762 781
763 // Show widget if needed. 782 // Show widget if needed.
764 if (pending_show_widget_) { 783 if (pending_show_widget_) {
765 DCHECK(!widget_->IsClosed()); 784 DCHECK(!widget_->IsClosed());
766 DCHECK(!widget_->IsVisible()); 785 DCHECK(!widget_->IsVisible());
767 pending_show_widget_ = false; 786 pending_show_widget_ = false;
768 widget_->Show(); 787 widget_->Show();
788 UpdateSystemModal();
769 } 789 }
770 } 790 }
771 } 791 }
772 792
773 bool ShellSurface::IsSurfaceSynchronized() const { 793 bool ShellSurface::IsSurfaceSynchronized() const {
774 // A shell surface is always desynchronized. 794 // A shell surface is always desynchronized.
775 return false; 795 return false;
776 } 796 }
777 797
778 //////////////////////////////////////////////////////////////////////////////// 798 ////////////////////////////////////////////////////////////////////////////////
(...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after
1570 // small style shadow for them. 1590 // small style shadow for them.
1571 if (!activatable_) 1591 if (!activatable_)
1572 shadow->SetElevation(wm::ShadowElevation::SMALL); 1592 shadow->SetElevation(wm::ShadowElevation::SMALL);
1573 // We don't have rounded corners unless frame is enabled. 1593 // We don't have rounded corners unless frame is enabled.
1574 if (!frame_enabled_) 1594 if (!frame_enabled_)
1575 shadow->SetRoundedCornerRadius(0); 1595 shadow->SetRoundedCornerRadius(0);
1576 } 1596 }
1577 } 1597 }
1578 1598
1579 } // namespace exo 1599 } // namespace exo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698