diff options
author | sadrul <sadrul@chromium.org> | 2015-11-30 15:30:48 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-30 23:31:31 +0000 |
commit | eaa1be24985cd400134914461b05ab4e52e8ef01 (patch) | |
tree | 7d2bd104953d60618745ecceba4ba4ded306cfe8 /mash | |
parent | e28f8182df3ebb9eae725ffa1490fc51342a38e0 (diff) | |
download | chromium_src-eaa1be24985cd400134914461b05ab4e52e8ef01.zip chromium_src-eaa1be24985cd400134914461b05ab4e52e8ef01.tar.gz chromium_src-eaa1be24985cd400134914461b05ab4e52e8ef01.tar.bz2 |
mash: Close a window if the app crashes.
BUG=none
Review URL: https://codereview.chromium.org/1487453002
Cr-Commit-Position: refs/heads/master@{#362268}
Diffstat (limited to 'mash')
-rw-r--r-- | mash/wm/window_manager_application.cc | 3 | ||||
-rw-r--r-- | mash/wm/window_manager_impl.cc | 43 | ||||
-rw-r--r-- | mash/wm/window_manager_impl.h | 10 |
3 files changed, 44 insertions, 12 deletions
diff --git a/mash/wm/window_manager_application.cc b/mash/wm/window_manager_application.cc index bc85268..1e934c6 100644 --- a/mash/wm/window_manager_application.cc +++ b/mash/wm/window_manager_application.cc @@ -54,7 +54,7 @@ void WindowManagerApplication::AddAccelerators() { void WindowManagerApplication::Initialize(mojo::ApplicationImpl* app) { app_ = app; tracing_.Initialize(app); - window_manager_.reset(new WindowManagerImpl(this)); + window_manager_.reset(new WindowManagerImpl()); // Don't bind to the WindowManager immediately. Wait for OnEmbed() first. mus::mojom::WindowManagerPtr window_manager; requests_.push_back(new mojo::InterfaceRequest<mus::mojom::WindowManager>( @@ -101,6 +101,7 @@ void WindowManagerApplication::OnEmbed(mus::Window* root) { ui_init_.reset(new ui::mojo::UIInit(views::GetDisplaysFromWindow(root))); aura_init_.reset(new views::AuraInit(app_, "mash_wm_resources.pak")); + window_manager_->Initialize(this); for (auto request : requests_) window_manager_binding_.AddBinding(window_manager_.get(), request->Pass()); diff --git a/mash/wm/window_manager_impl.cc b/mash/wm/window_manager_impl.cc index 761099f..1b15fc8 100644 --- a/mash/wm/window_manager_impl.cc +++ b/mash/wm/window_manager_impl.cc @@ -31,10 +31,12 @@ struct TypeConverter<const std::vector<uint8_t>, Array<uint8_t>> { namespace mash { namespace wm { -WindowManagerImpl::WindowManagerImpl(WindowManagerApplication* state) - : state_(state) {} +WindowManagerImpl::WindowManagerImpl() + : state_(nullptr) {} WindowManagerImpl::~WindowManagerImpl() { + if (!state_) + return; mus::Window* parent = state_->GetWindowForContainer(mojom::CONTAINER_USER_WINDOWS); if (!parent) @@ -44,7 +46,16 @@ WindowManagerImpl::~WindowManagerImpl() { child->RemoveObserver(this); } +void WindowManagerImpl::Initialize(WindowManagerApplication* state) { + DCHECK(state); + DCHECK(!state_); + state_ = state; + state_->GetWindowForContainer(mojom::CONTAINER_USER_WINDOWS) + ->AddObserver(this); +} + gfx::Rect WindowManagerImpl::CalculateDefaultBounds(mus::Window* window) const { + DCHECK(state_); int width, height; const gfx::Size pref = GetWindowPreferredSize(window); const mus::Window* root = state_->root(); @@ -62,12 +73,30 @@ gfx::Rect WindowManagerImpl::CalculateDefaultBounds(mus::Window* window) const { } gfx::Rect WindowManagerImpl::GetMaximizedWindowBounds() const { + DCHECK(state_); return gfx::Rect(state_->root()->bounds().size()); } +void WindowManagerImpl::OnTreeChanging(const TreeChangeParams& params) { + DCHECK(state_); + mus::Window* user_window_container = + state_->GetWindowForContainer(mojom::CONTAINER_USER_WINDOWS); + if (params.receiver != user_window_container) + return; + if (params.old_parent == user_window_container) + params.target->RemoveObserver(this); + else if (params.new_parent == user_window_container) + params.target->AddObserver(this); +} + +void WindowManagerImpl::OnWindowEmbeddedAppDisconnected(mus::Window* window) { + window->Destroy(); +} + void WindowManagerImpl::OpenWindow( mus::mojom::WindowTreeClientPtr client, mojo::Map<mojo::String, mojo::Array<uint8_t>> transport_properties) { + DCHECK(state_); mus::Window* root = state_->root(); DCHECK(root); @@ -76,7 +105,9 @@ void WindowManagerImpl::OpenWindow( // TODO(sky): constrain to valid properties here. mus::Window* child_window = root->connection()->NewWindow(&properties); child_window->SetBounds(CalculateDefaultBounds(child_window)); - GetContainerForChild(child_window)->AddChild(child_window); + + mojom::Container container = GetRequestedContainer(child_window); + state_->GetWindowForContainer(container)->AddChild(child_window); child_window->Embed(client.Pass()); // NonClientFrameController deletes itself when |child_window| is destroyed. @@ -87,6 +118,7 @@ void WindowManagerImpl::OpenWindow( } void WindowManagerImpl::GetConfig(const GetConfigCallback& callback) { + DCHECK(state_); mus::mojom::WindowManagerConfigPtr config( mus::mojom::WindowManagerConfig::New()); config->displays = mojo::Array<mus::mojom::DisplayPtr>::New(1); @@ -128,10 +160,5 @@ bool WindowManagerImpl::OnWmSetProperty( name == mus::mojom::WindowManager::kResizeBehavior_Property; } -mus::Window* WindowManagerImpl::GetContainerForChild(mus::Window* child) { - mojom::Container container = GetRequestedContainer(child); - return state_->GetWindowForContainer(container); -} - } // namespace wm } // namespace mash diff --git a/mash/wm/window_manager_impl.h b/mash/wm/window_manager_impl.h index e83fc09..f1e3207 100644 --- a/mash/wm/window_manager_impl.h +++ b/mash/wm/window_manager_impl.h @@ -23,13 +23,19 @@ class WindowManagerImpl : public mus::mojom::WindowManager, public mus::WindowObserver, public mus::WindowManagerDelegate { public: - explicit WindowManagerImpl(WindowManagerApplication* state); + WindowManagerImpl(); ~WindowManagerImpl() override; + void Initialize(WindowManagerApplication* state); + private: gfx::Rect CalculateDefaultBounds(mus::Window* window) const; gfx::Rect GetMaximizedWindowBounds() const; + // mus::WindowObserver: + void OnTreeChanging(const TreeChangeParams& params) override; + void OnWindowEmbeddedAppDisconnected(mus::Window* window) override; + // mus::mojom::WindowManager: void OpenWindow(mus::mojom::WindowTreeClientPtr client, mojo::Map<mojo::String, mojo::Array<uint8_t>> @@ -42,8 +48,6 @@ class WindowManagerImpl : public mus::mojom::WindowManager, const std::string& name, scoped_ptr<std::vector<uint8_t>>* new_data) override; - mus::Window* GetContainerForChild(mus::Window* child); - WindowManagerApplication* state_; DISALLOW_COPY_AND_ASSIGN(WindowManagerImpl); |