summaryrefslogtreecommitdiffstats
path: root/mash
diff options
context:
space:
mode:
authorsadrul <sadrul@chromium.org>2015-11-30 15:30:48 -0800
committerCommit bot <commit-bot@chromium.org>2015-11-30 23:31:31 +0000
commiteaa1be24985cd400134914461b05ab4e52e8ef01 (patch)
tree7d2bd104953d60618745ecceba4ba4ded306cfe8 /mash
parente28f8182df3ebb9eae725ffa1490fc51342a38e0 (diff)
downloadchromium_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.cc3
-rw-r--r--mash/wm/window_manager_impl.cc43
-rw-r--r--mash/wm/window_manager_impl.h10
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);