| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SERVICES_WS_EMBEDDING_H_ |
| #define SERVICES_WS_EMBEDDING_H_ |
| |
| #include <memory> |
| |
| #include "base/callback_forward.h" |
| #include "base/component_export.h" |
| #include "base/macros.h" |
| #include "services/ws/public/mojom/window_tree.mojom.h" |
| |
| namespace aura { |
| class Window; |
| } |
| |
| namespace ws { |
| |
| class WindowService; |
| class WindowTree; |
| class WindowTreeBinding; |
| |
| // Embedding is created any time a client calls Embed() or EmbedUsingToken() |
| // (Embedding is not created for top-levels). Embedding has two distinct |
| // configurations: |
| // . The Embedding does not own the embedded WindowTree. This happens if |
| // ScheduleEmbedForExistingClient() was used. |
| // . In all other cases Embedding owns the embedded WindowTree. |
| // |
| // Embedding is owned by the Window associated with the embedding. |
| class COMPONENT_EXPORT(WINDOW_SERVICE) Embedding { |
| public: |
| Embedding(WindowTree* embedding_tree, |
| aura::Window* window, |
| bool embedding_tree_intercepts_events); |
| ~Embedding(); |
| |
| void Init(WindowService* window_service, |
| mojom::WindowTreeClientPtr window_tree_client_ptr, |
| mojom::WindowTreeClient* window_tree_client, |
| base::OnceClosure connection_lost_callback); |
| |
| // Initializes the Embedding as the result of |
| // ScheduleEmbedForExistingClient(). |
| void InitForEmbedInExistingTree(WindowTree* embedded_tree); |
| |
| WindowTree* embedding_tree() { return embedding_tree_; } |
| |
| bool embedding_tree_intercepts_events() const { |
| return embedding_tree_intercepts_events_; |
| } |
| |
| // Used during destruction to ensure the |embedded_tree_| is not notified. |
| void clear_embedded_tree() { embedded_tree_ = nullptr; } |
| WindowTree* embedded_tree() { return embedded_tree_; } |
| |
| aura::Window* window() { return window_; } |
| |
| WindowTreeBinding* binding() { return binding_.get(); } |
| |
| private: |
| // The client that initiated the embedding. This is null if the embedding |
| // was completed locally (by way of ScheduleEmbedForExistingClient()). |
| WindowTree* embedding_tree_; |
| |
| // The window the embedding is in. |
| aura::Window* window_; |
| |
| // If true, all events that would normally target the embedded tree are |
| // instead sent to the tree that created the embedding. For example, consider |
| // the Window hierarchy A1->B1->C2 where tree 1 created A1 and B1, tree 1 |
| // embedded tree 2 in window B1, and tree 2 created C2. If an event occurs |
| // that would normally target C2, then the event is instead sent to tree 1. |
| // Embedded trees can always observe pointer events, regardless of this value. |
| const bool embedding_tree_intercepts_events_; |
| |
| // |binding_| is created if the Embedding owns the embedded WindowTree. |
| std::unique_ptr<WindowTreeBinding> binding_; |
| |
| // The embedded WindowTree. If |binding_| is non-null, this comes from the |
| // WindowTreeBinding. If |binding_| is null, this is the value supplied to |
| // InitForEmbedInExistingTree(). |
| WindowTree* embedded_tree_ = nullptr; |
| |
| DISALLOW_COPY_AND_ASSIGN(Embedding); |
| }; |
| |
| } // namespace ws |
| |
| #endif // SERVICES_WS_EMBEDDING_H_ |