OLD | NEW |
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 #ifndef COMPONENTS_VIEW_MANAGER_VIEW_MANAGER_SERVICE_IMPL_H_ | 5 #ifndef COMPONENTS_VIEW_MANAGER_VIEW_MANAGER_SERVICE_IMPL_H_ |
6 #define COMPONENTS_VIEW_MANAGER_VIEW_MANAGER_SERVICE_IMPL_H_ | 6 #define COMPONENTS_VIEW_MANAGER_VIEW_MANAGER_SERVICE_IMPL_H_ |
7 | 7 |
8 #include <set> | 8 #include <set> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 17 matching lines...) Expand all Loading... |
28 class ConnectionManager; | 28 class ConnectionManager; |
29 class ServerView; | 29 class ServerView; |
30 | 30 |
31 // An instance of ViewManagerServiceImpl is created for every ViewManagerService | 31 // An instance of ViewManagerServiceImpl is created for every ViewManagerService |
32 // request. ViewManagerServiceImpl tracks all the state and views created by a | 32 // request. ViewManagerServiceImpl tracks all the state and views created by a |
33 // client. ViewManagerServiceImpl coordinates with ConnectionManager to update | 33 // client. ViewManagerServiceImpl coordinates with ConnectionManager to update |
34 // the client (and internal state) as necessary. | 34 // the client (and internal state) as necessary. |
35 class ViewManagerServiceImpl : public mojo::ViewManagerService, | 35 class ViewManagerServiceImpl : public mojo::ViewManagerService, |
36 public AccessPolicyDelegate { | 36 public AccessPolicyDelegate { |
37 public: | 37 public: |
38 enum class EmbedType { | |
39 ALLOW_REEMBED, | |
40 NO_REEMBED, | |
41 }; | |
42 | |
43 ViewManagerServiceImpl(ConnectionManager* connection_manager, | 38 ViewManagerServiceImpl(ConnectionManager* connection_manager, |
44 mojo::ConnectionSpecificId creator_id, | 39 mojo::ConnectionSpecificId creator_id, |
45 const std::string& creator_url, | |
46 const std::string& url, | |
47 const ViewId& root_id); | 40 const ViewId& root_id); |
48 ~ViewManagerServiceImpl() override; | 41 ~ViewManagerServiceImpl() override; |
49 | 42 |
50 // |services| and |exposed_services| are the ServiceProviders to pass to the | 43 // |services| and |exposed_services| are the ServiceProviders to pass to the |
51 // client via OnEmbed(). | 44 // client via OnEmbed(). |
52 void Init(mojo::ViewManagerClient* client, | 45 void Init(mojo::ViewManagerClient* client, |
53 mojo::ViewManagerServicePtr service_ptr, | 46 mojo::ViewManagerServicePtr service_ptr); |
54 mojo::InterfaceRequest<mojo::ServiceProvider> services, | |
55 mojo::ServiceProviderPtr exposed_services); | |
56 | 47 |
57 mojo::ConnectionSpecificId id() const { return id_; } | 48 mojo::ConnectionSpecificId id() const { return id_; } |
58 mojo::ConnectionSpecificId creator_id() const { return creator_id_; } | 49 mojo::ConnectionSpecificId creator_id() const { return creator_id_; } |
59 const std::string& url() const { return url_; } | |
60 | 50 |
61 mojo::ViewManagerClient* client() { return client_; } | 51 mojo::ViewManagerClient* client() { return client_; } |
62 | 52 |
63 // Returns the View with the specified id. | 53 // Returns the View with the specified id. |
64 ServerView* GetView(const ViewId& id) { | 54 ServerView* GetView(const ViewId& id) { |
65 return const_cast<ServerView*>( | 55 return const_cast<ServerView*>( |
66 const_cast<const ViewManagerServiceImpl*>(this)->GetView(id)); | 56 const_cast<const ViewManagerServiceImpl*>(this)->GetView(id)); |
67 } | 57 } |
68 const ServerView* GetView(const ViewId& id) const; | 58 const ServerView* GetView(const ViewId& id) const; |
69 | 59 |
70 // Returns true if this connection's root is |id|. | 60 // Returns true if this connection's root is |id|. |
71 bool IsRoot(const ViewId& id) const; | 61 bool IsRoot(const ViewId& id) const; |
72 | 62 |
73 // Returns the id of the root node. This is null if the root has been | 63 // Returns the id of the root node. This is null if the root has been |
74 // destroyed but the connection is still valid. | 64 // destroyed but the connection is still valid. |
75 const ViewId* root() const { return root_.get(); } | 65 const ViewId* root() const { return root_.get(); } |
76 | 66 |
77 bool is_embed_root() const { return is_embed_root_; } | 67 bool is_embed_root() const { return is_embed_root_; } |
78 | 68 |
79 // Invoked when a connection is about to be destroyed. | 69 // Invoked when a connection is about to be destroyed. |
80 void OnWillDestroyViewManagerServiceImpl(ViewManagerServiceImpl* connection); | 70 void OnWillDestroyViewManagerServiceImpl(ViewManagerServiceImpl* connection); |
81 | 71 |
82 // These functions are synchronous variants of those defined in the mojom. The | 72 // These functions are synchronous variants of those defined in the mojom. The |
83 // ViewManagerService implementations all call into these. See the mojom for | 73 // ViewManagerService implementations all call into these. See the mojom for |
84 // details. | 74 // details. |
85 mojo::ErrorCode CreateView(const ViewId& view_id); | 75 mojo::ErrorCode CreateView(const ViewId& view_id); |
86 bool AddView(const ViewId& parent_id, const ViewId& child_id); | 76 bool AddView(const ViewId& parent_id, const ViewId& child_id); |
87 std::vector<const ServerView*> GetViewTree(const ViewId& view_id) const; | 77 std::vector<const ServerView*> GetViewTree(const ViewId& view_id) const; |
88 bool SetViewVisibility(const ViewId& view_id, bool visible); | 78 bool SetViewVisibility(const ViewId& view_id, bool visible); |
89 void Embed(mojo::URLRequestPtr request, | 79 void EmbedAllowingReembed(const ViewId& view_id, |
90 const ViewId& view_id, | 80 mojo::URLRequestPtr request, |
91 EmbedType type, | 81 const mojo::Callback<void(bool)>& callback); |
92 mojo::InterfaceRequest<mojo::ServiceProvider> services, | |
93 mojo::ServiceProviderPtr exposed_services, | |
94 const mojo::Callback<void(bool)>& callback); | |
95 bool Embed(const ViewId& view_id, mojo::ViewManagerClientPtr client); | 82 bool Embed(const ViewId& view_id, mojo::ViewManagerClientPtr client); |
96 | 83 |
97 // The following methods are invoked after the corresponding change has been | 84 // The following methods are invoked after the corresponding change has been |
98 // processed. They do the appropriate bookkeeping and update the client as | 85 // processed. They do the appropriate bookkeeping and update the client as |
99 // necessary. | 86 // necessary. |
100 void ProcessViewBoundsChanged(const ServerView* view, | 87 void ProcessViewBoundsChanged(const ServerView* view, |
101 const gfx::Rect& old_bounds, | 88 const gfx::Rect& old_bounds, |
102 const gfx::Rect& new_bounds, | 89 const gfx::Rect& new_bounds, |
103 bool originated_change); | 90 bool originated_change); |
104 void ProcessViewportMetricsChanged(const mojo::ViewportMetrics& old_metrics, | 91 void ProcessViewportMetricsChanged(const mojo::ViewportMetrics& old_metrics, |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 // Notify the client if the drawn state of any of the roots changes. | 160 // Notify the client if the drawn state of any of the roots changes. |
174 // |view| is the view that is changing to the drawn state |new_drawn_value|. | 161 // |view| is the view that is changing to the drawn state |new_drawn_value|. |
175 void NotifyDrawnStateChanged(const ServerView* view, bool new_drawn_value); | 162 void NotifyDrawnStateChanged(const ServerView* view, bool new_drawn_value); |
176 | 163 |
177 // Deletes all Views we own. | 164 // Deletes all Views we own. |
178 void DestroyViews(); | 165 void DestroyViews(); |
179 | 166 |
180 bool CanEmbed(const ViewId& view_id) const; | 167 bool CanEmbed(const ViewId& view_id) const; |
181 void PrepareForEmbed(const ViewId& view_id); | 168 void PrepareForEmbed(const ViewId& view_id); |
182 void RemoveChildrenAsPartOfEmbed(const ViewId& view_id); | 169 void RemoveChildrenAsPartOfEmbed(const ViewId& view_id); |
183 void OnWillEmbedDone(scoped_refptr<PendingEmbed> pending_embed, | 170 void OnEmbedForDescendantDone(scoped_refptr<PendingEmbed> pending_embed, |
184 bool allow_embed, | 171 mojo::ViewManagerClientPtr client); |
185 mojo::InterfaceRequest<mojo::ServiceProvider> services, | |
186 mojo::ServiceProviderPtr exposed_services); | |
187 | 172 |
188 // Invalidates any PendingEmbeds with |connection| as the embed root. | 173 // Invalidates any PendingEmbeds with |connection| as the embed root. |
189 void InvalidatePendingEmbedForConnection(ViewManagerServiceImpl* connection); | 174 void InvalidatePendingEmbedForConnection(ViewManagerServiceImpl* connection); |
190 | 175 |
191 // Invalidates any PendingEmbemds targetting |view_id|. | 176 // Invalidates any PendingEmbemds targetting |view_id|. |
192 void InvalidatePendingEmbedForView(const ViewId& view_id); | 177 void InvalidatePendingEmbedForView(const ViewId& view_id); |
193 | 178 |
194 // Runs the callback for |embed| and releases it. | 179 // Runs the callback for |embed| and releases it. |
195 void RemovePendingEmbedAndNotifyCallback(scoped_refptr<PendingEmbed> embed, | 180 void RemovePendingEmbedAndNotifyCallback(scoped_refptr<PendingEmbed> embed, |
196 bool success); | 181 bool success); |
(...skipping 24 matching lines...) Expand all Loading... |
221 mojo::RectPtr bounds, | 206 mojo::RectPtr bounds, |
222 const mojo::Callback<void(bool)>& callback) override; | 207 const mojo::Callback<void(bool)>& callback) override; |
223 void SetViewVisibility(mojo::Id view_id, | 208 void SetViewVisibility(mojo::Id view_id, |
224 bool visible, | 209 bool visible, |
225 const mojo::Callback<void(bool)>& callback) override; | 210 const mojo::Callback<void(bool)>& callback) override; |
226 void SetViewProperty(mojo::Id view_id, | 211 void SetViewProperty(mojo::Id view_id, |
227 const mojo::String& name, | 212 const mojo::String& name, |
228 mojo::Array<uint8_t> value, | 213 mojo::Array<uint8_t> value, |
229 const mojo::Callback<void(bool)>& callback) override; | 214 const mojo::Callback<void(bool)>& callback) override; |
230 void SetEmbedRoot() override; | 215 void SetEmbedRoot() override; |
231 void EmbedRequest(mojo::URLRequestPtr request, | |
232 mojo::Id transport_view_id, | |
233 mojo::InterfaceRequest<mojo::ServiceProvider> services, | |
234 mojo::ServiceProviderPtr exposed_services, | |
235 const mojo::Callback<void(bool)>& callback) override; | |
236 void Embed(mojo::Id transport_view_id, | 216 void Embed(mojo::Id transport_view_id, |
237 mojo::ViewManagerClientPtr client, | 217 mojo::ViewManagerClientPtr client, |
238 const mojo::Callback<void(bool)>& callback) override; | 218 const mojo::Callback<void(bool)>& callback) override; |
239 void EmbedAllowingReembed( | 219 void EmbedAllowingReembed( |
| 220 mojo::Id transport_view_id, |
240 mojo::URLRequestPtr request, | 221 mojo::URLRequestPtr request, |
241 mojo::Id transport_view_id, | |
242 const mojo::Callback<void(bool)>& callback) override; | 222 const mojo::Callback<void(bool)>& callback) override; |
243 void SetFocus(uint32_t view_id, const SetFocusCallback& callback) override; | 223 void SetFocus(uint32_t view_id, const SetFocusCallback& callback) override; |
244 | 224 |
245 // AccessPolicyDelegate: | 225 // AccessPolicyDelegate: |
246 bool IsRootForAccessPolicy(const ViewId& id) const override; | 226 bool IsRootForAccessPolicy(const ViewId& id) const override; |
247 bool IsViewKnownForAccessPolicy(const ServerView* view) const override; | 227 bool IsViewKnownForAccessPolicy(const ServerView* view) const override; |
248 bool IsViewRootOfAnotherConnectionForAccessPolicy( | 228 bool IsViewRootOfAnotherConnectionForAccessPolicy( |
249 const ServerView* view) const override; | 229 const ServerView* view) const override; |
250 bool IsEmbedRootForAccessPolicy() override; | 230 bool IsEmbedRootForAccessPolicy() override; |
251 | 231 |
252 ConnectionManager* connection_manager_; | 232 ConnectionManager* connection_manager_; |
253 | 233 |
254 // Id of this connection as assigned by ConnectionManager. | 234 // Id of this connection as assigned by ConnectionManager. |
255 const mojo::ConnectionSpecificId id_; | 235 const mojo::ConnectionSpecificId id_; |
256 | 236 |
257 // URL this connection was created for. | |
258 const std::string url_; | |
259 | |
260 // ID of the connection that created us. If 0 it indicates either we were | 237 // ID of the connection that created us. If 0 it indicates either we were |
261 // created by the root, or the connection that created us has been destroyed. | 238 // created by the root, or the connection that created us has been destroyed. |
262 mojo::ConnectionSpecificId creator_id_; | 239 mojo::ConnectionSpecificId creator_id_; |
263 | 240 |
264 // The URL of the app that embedded the app this connection was created for. | |
265 // NOTE: this is empty if the connection was created by way of directly | |
266 // supplying the ViewManagerClient. | |
267 const std::string creator_url_; | |
268 | |
269 mojo::ViewManagerClient* client_; | 241 mojo::ViewManagerClient* client_; |
270 | 242 |
271 scoped_ptr<AccessPolicy> access_policy_; | 243 scoped_ptr<AccessPolicy> access_policy_; |
272 | 244 |
273 // The views created by this connection. This connection owns these objects. | 245 // The views created by this connection. This connection owns these objects. |
274 ViewMap view_map_; | 246 ViewMap view_map_; |
275 | 247 |
276 // The set of views that has been communicated to the client. | 248 // The set of views that has been communicated to the client. |
277 ViewIdSet known_views_; | 249 ViewIdSet known_views_; |
278 | 250 |
279 // The root of this connection. This is a scoped_ptr to reinforce the | 251 // The root of this connection. This is a scoped_ptr to reinforce the |
280 // connection may have no root. A connection has no root if either the root | 252 // connection may have no root. A connection has no root if either the root |
281 // is destroyed or Embed() is invoked on the root. | 253 // is destroyed or Embed() is invoked on the root. |
282 scoped_ptr<ViewId> root_; | 254 scoped_ptr<ViewId> root_; |
283 | 255 |
284 bool is_embed_root_; | 256 bool is_embed_root_; |
285 | 257 |
286 // If we have an ancestor marked as an embed root then we have to query it | 258 // If we have an ancestor marked as an embed root then we have to query it |
287 // before completing the embed. |pending_embeds_| contains such requests. | 259 // before completing the embed. |pending_embeds_| contains such requests. |
288 // The requests are removed if the embed becomes invalid, for example, the | 260 // The requests are removed if the embed becomes invalid, for example, the |
289 // view embed was called for is removed. | 261 // view embed was called for is removed. |
290 std::set<scoped_refptr<PendingEmbed>> pending_embeds_; | 262 std::set<scoped_refptr<PendingEmbed>> pending_embeds_; |
291 | 263 |
292 DISALLOW_COPY_AND_ASSIGN(ViewManagerServiceImpl); | 264 DISALLOW_COPY_AND_ASSIGN(ViewManagerServiceImpl); |
293 }; | 265 }; |
294 | 266 |
295 } // namespace view_manager | 267 } // namespace view_manager |
296 | 268 |
297 #endif // COMPONENTS_VIEW_MANAGER_VIEW_MANAGER_SERVICE_IMPL_H_ | 269 #endif // COMPONENTS_VIEW_MANAGER_VIEW_MANAGER_SERVICE_IMPL_H_ |
OLD | NEW |