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 #include "components/view_manager/view_manager_service_impl.h" | 5 #include "components/view_manager/view_manager_service_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
9 #include "components/view_manager/connection_manager.h" | 9 #include "components/view_manager/connection_manager.h" |
10 #include "components/view_manager/default_access_policy.h" | 10 #include "components/view_manager/default_access_policy.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 | 28 |
29 namespace view_manager { | 29 namespace view_manager { |
30 | 30 |
31 // Contains information needed to complete an Embed(). See description of | 31 // Contains information needed to complete an Embed(). See description of |
32 // |pending_embeds_| for more details. | 32 // |pending_embeds_| for more details. |
33 struct ViewManagerServiceImpl::PendingEmbed | 33 struct ViewManagerServiceImpl::PendingEmbed |
34 : public base::RefCounted<PendingEmbed> { | 34 : public base::RefCounted<PendingEmbed> { |
35 PendingEmbed() : embed_root(nullptr) {} | 35 PendingEmbed() : embed_root(nullptr) {} |
36 | 36 |
37 ViewManagerServiceImpl* embed_root; | 37 ViewManagerServiceImpl* embed_root; |
38 mojo::URLRequestPtr url_request; | |
39 ViewId view_id; | 38 ViewId view_id; |
40 mojo::Callback<void(bool)> callback; | 39 mojo::Callback<void(bool)> callback; |
41 | 40 |
42 private: | 41 private: |
43 friend class base::RefCounted<PendingEmbed>; | 42 friend class base::RefCounted<PendingEmbed>; |
44 | 43 |
45 ~PendingEmbed() {} | 44 ~PendingEmbed() {} |
46 }; | 45 }; |
47 | 46 |
48 ViewManagerServiceImpl::ViewManagerServiceImpl( | 47 ViewManagerServiceImpl::ViewManagerServiceImpl( |
49 ConnectionManager* connection_manager, | 48 ConnectionManager* connection_manager, |
50 mojo::ConnectionSpecificId creator_id, | 49 mojo::ConnectionSpecificId creator_id, |
51 const std::string& creator_url, | |
52 const std::string& url, | |
53 const ViewId& root_id) | 50 const ViewId& root_id) |
54 : connection_manager_(connection_manager), | 51 : connection_manager_(connection_manager), |
55 id_(connection_manager_->GetAndAdvanceNextConnectionId()), | 52 id_(connection_manager_->GetAndAdvanceNextConnectionId()), |
56 url_(url), | |
57 creator_id_(creator_id), | 53 creator_id_(creator_id), |
58 creator_url_(creator_url), | |
59 client_(nullptr), | 54 client_(nullptr), |
60 is_embed_root_(false) { | 55 is_embed_root_(false) { |
61 CHECK(GetView(root_id)); | 56 CHECK(GetView(root_id)); |
62 root_.reset(new ViewId(root_id)); | 57 root_.reset(new ViewId(root_id)); |
63 if (root_id == RootViewId()) | 58 if (root_id == RootViewId()) |
64 access_policy_.reset(new WindowManagerAccessPolicy(id_, this)); | 59 access_policy_.reset(new WindowManagerAccessPolicy(id_, this)); |
65 else | 60 else |
66 access_policy_.reset(new DefaultAccessPolicy(id_, this)); | 61 access_policy_.reset(new DefaultAccessPolicy(id_, this)); |
67 } | 62 } |
68 | 63 |
69 ViewManagerServiceImpl::~ViewManagerServiceImpl() { | 64 ViewManagerServiceImpl::~ViewManagerServiceImpl() { |
70 DestroyViews(); | 65 DestroyViews(); |
71 } | 66 } |
72 | 67 |
73 void ViewManagerServiceImpl::Init(mojo::ViewManagerClient* client, | 68 void ViewManagerServiceImpl::Init(mojo::ViewManagerClient* client, |
74 mojo::ViewManagerServicePtr service_ptr, | 69 mojo::ViewManagerServicePtr service_ptr) { |
75 InterfaceRequest<ServiceProvider> services, | |
76 ServiceProviderPtr exposed_services) { | |
77 DCHECK(!client_); | 70 DCHECK(!client_); |
78 client_ = client; | 71 client_ = client; |
79 std::vector<const ServerView*> to_send; | 72 std::vector<const ServerView*> to_send; |
80 if (root_.get()) | 73 if (root_.get()) |
81 GetUnknownViewsFrom(GetView(*root_), &to_send); | 74 GetUnknownViewsFrom(GetView(*root_), &to_send); |
82 | 75 |
83 const ServerView* focused_view = connection_manager_->GetFocusedView(); | 76 const ServerView* focused_view = connection_manager_->GetFocusedView(); |
84 if (focused_view) | 77 if (focused_view) |
85 focused_view = access_policy_->GetViewForFocusChange(focused_view); | 78 focused_view = access_policy_->GetViewForFocusChange(focused_view); |
86 const mojo::Id focused_view_transport_id( | 79 const mojo::Id focused_view_transport_id( |
87 ViewIdToTransportId(focused_view ? focused_view->id() : ViewId())); | 80 ViewIdToTransportId(focused_view ? focused_view->id() : ViewId())); |
88 | 81 |
89 client->OnEmbed(id_, creator_url_, ViewToViewData(to_send.front()), | 82 client->OnEmbed(id_, ViewToViewData(to_send.front()), service_ptr.Pass(), |
90 service_ptr.Pass(), services.Pass(), exposed_services.Pass(), | |
91 focused_view_transport_id); | 83 focused_view_transport_id); |
92 } | 84 } |
93 | 85 |
94 const ServerView* ViewManagerServiceImpl::GetView(const ViewId& id) const { | 86 const ServerView* ViewManagerServiceImpl::GetView(const ViewId& id) const { |
95 if (id_ == id.connection_id) { | 87 if (id_ == id.connection_id) { |
96 ViewMap::const_iterator i = view_map_.find(id.view_id); | 88 ViewMap::const_iterator i = view_map_.find(id.view_id); |
97 return i == view_map_.end() ? NULL : i->second; | 89 return i == view_map_.end() ? NULL : i->second; |
98 } | 90 } |
99 return connection_manager_->GetView(id); | 91 return connection_manager_->GetView(id); |
100 } | 92 } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 ServerView* view = GetView(view_id); | 146 ServerView* view = GetView(view_id); |
155 if (!view || view->visible() == visible || | 147 if (!view || view->visible() == visible || |
156 !access_policy_->CanChangeViewVisibility(view)) { | 148 !access_policy_->CanChangeViewVisibility(view)) { |
157 return false; | 149 return false; |
158 } | 150 } |
159 ConnectionManager::ScopedChange change(this, connection_manager_, false); | 151 ConnectionManager::ScopedChange change(this, connection_manager_, false); |
160 view->SetVisible(visible); | 152 view->SetVisible(visible); |
161 return true; | 153 return true; |
162 } | 154 } |
163 | 155 |
164 void ViewManagerServiceImpl::SetEmbedRoot() { | 156 void ViewManagerServiceImpl::EmbedAllowingReembed( |
165 is_embed_root_ = true; | 157 const ViewId& view_id, |
166 } | 158 mojo::URLRequestPtr request, |
167 | 159 const mojo::Callback<void(bool)>& callback) { |
168 void ViewManagerServiceImpl::Embed(mojo::URLRequestPtr request, | |
169 const ViewId& view_id, | |
170 EmbedType type, | |
171 InterfaceRequest<ServiceProvider> services, | |
172 ServiceProviderPtr exposed_services, | |
173 const mojo::Callback<void(bool)>& callback) { | |
174 if (!CanEmbed(view_id)) { | 160 if (!CanEmbed(view_id)) { |
175 callback.Run(false); | 161 callback.Run(false); |
176 return; | 162 return; |
177 } | 163 } |
178 | 164 |
179 ViewManagerServiceImpl* embed_root = nullptr; | 165 ViewManagerServiceImpl* embed_root = nullptr; |
180 | 166 |
181 // Only the creator is allowed to reset reembed. | |
182 ServerView* view = GetView(view_id); | 167 ServerView* view = GetView(view_id); |
183 DCHECK(view); // CanEmbed() returns true only if |view_id| is valid. | 168 DCHECK(view); // CanEmbed() returns true only if |view_id| is valid. |
184 if (view->id().connection_id == id_) { | 169 if (view->id().connection_id == id_) { |
185 view->set_allows_reembed(type == EmbedType::ALLOW_REEMBED); | 170 view->set_allows_reembed(true); |
186 | 171 |
187 // Only consult the embed root if the creator is doing the embed. If someone | 172 // Only consult the embed root if the creator is doing the embed. If someone |
188 // other than the creator is doing the embed they were granted embed access. | 173 // other than the creator is doing the embed they were granted embed access. |
189 embed_root = connection_manager_->GetEmbedRoot(this); | 174 embed_root = connection_manager_->GetEmbedRoot(this); |
190 } | 175 } |
191 | 176 |
192 if (!embed_root) { | 177 if (!embed_root) { |
193 PrepareForEmbed(view_id); | 178 PrepareForEmbed(view_id); |
194 connection_manager_->EmbedAtView(id_, request.Pass(), view_id, | 179 connection_manager_->EmbedAtView(id_, view_id, request.Pass()); |
195 services.Pass(), exposed_services.Pass()); | |
196 callback.Run(true); | 180 callback.Run(true); |
197 return; | 181 return; |
198 } | 182 } |
199 | 183 |
200 // There is an embed root. We have to query it before completing the embed. | 184 // There is an embed root. We have to query it before completing the embed. |
201 scoped_refptr<PendingEmbed> pending_embed(new PendingEmbed); | 185 scoped_refptr<PendingEmbed> pending_embed(new PendingEmbed); |
202 pending_embeds_.insert(pending_embed); | 186 pending_embeds_.insert(pending_embed); |
203 pending_embed->embed_root = embed_root; | 187 pending_embed->embed_root = embed_root; |
204 pending_embed->view_id = view_id; | 188 pending_embed->view_id = view_id; |
205 pending_embed->url_request = request.Pass(); | |
206 pending_embed->callback = callback; | 189 pending_embed->callback = callback; |
207 pending_embeds_.insert(pending_embed); | 190 pending_embeds_.insert(pending_embed); |
208 embed_root->client()->OnWillEmbed( | 191 embed_root->client()->OnEmbedForDescendant( |
209 ViewIdToTransportId(view_id), services.Pass(), exposed_services.Pass(), | 192 ViewIdToTransportId(view_id), request.Pass(), |
210 base::Bind(&ViewManagerServiceImpl::OnWillEmbedDone, | 193 base::Bind(&ViewManagerServiceImpl::OnEmbedForDescendantDone, |
211 base::Unretained(this), pending_embed)); | 194 base::Unretained(this), pending_embed)); |
212 } | 195 } |
213 | 196 |
214 bool ViewManagerServiceImpl::Embed(const ViewId& view_id, | 197 bool ViewManagerServiceImpl::Embed(const ViewId& view_id, |
215 mojo::ViewManagerClientPtr client) { | 198 mojo::ViewManagerClientPtr client) { |
216 // TODO(sky): wire up embed root. | |
217 if (!client.get() || !CanEmbed(view_id)) | 199 if (!client.get() || !CanEmbed(view_id)) |
218 return false; | 200 return false; |
219 PrepareForEmbed(view_id); | 201 PrepareForEmbed(view_id); |
220 connection_manager_->EmbedAtView(id_, view_id, client.Pass()); | 202 connection_manager_->EmbedAtView(id_, view_id, client.Pass()); |
221 return true; | 203 return true; |
222 } | 204 } |
223 | 205 |
224 void ViewManagerServiceImpl::ProcessViewBoundsChanged( | 206 void ViewManagerServiceImpl::ProcessViewBoundsChanged( |
225 const ServerView* view, | 207 const ServerView* view, |
226 const gfx::Rect& old_bounds, | 208 const gfx::Rect& old_bounds, |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
560 void ViewManagerServiceImpl::RemoveChildrenAsPartOfEmbed( | 542 void ViewManagerServiceImpl::RemoveChildrenAsPartOfEmbed( |
561 const ViewId& view_id) { | 543 const ViewId& view_id) { |
562 ServerView* view = GetView(view_id); | 544 ServerView* view = GetView(view_id); |
563 CHECK(view); | 545 CHECK(view); |
564 CHECK(view->id().connection_id == view_id.connection_id); | 546 CHECK(view->id().connection_id == view_id.connection_id); |
565 std::vector<ServerView*> children = view->GetChildren(); | 547 std::vector<ServerView*> children = view->GetChildren(); |
566 for (size_t i = 0; i < children.size(); ++i) | 548 for (size_t i = 0; i < children.size(); ++i) |
567 view->Remove(children[i]); | 549 view->Remove(children[i]); |
568 } | 550 } |
569 | 551 |
570 void ViewManagerServiceImpl::OnWillEmbedDone( | 552 void ViewManagerServiceImpl::OnEmbedForDescendantDone( |
571 scoped_refptr<PendingEmbed> pending_embed, | 553 scoped_refptr<PendingEmbed> pending_embed, |
572 bool allow_embed, | 554 mojo::ViewManagerClientPtr client) { |
573 mojo::InterfaceRequest<mojo::ServiceProvider> services, | |
574 mojo::ServiceProviderPtr exposed_services) { | |
575 if (!pending_embeds_.count(pending_embed.get())) | 555 if (!pending_embeds_.count(pending_embed.get())) |
576 return; | 556 return; |
577 | 557 |
578 allow_embed = allow_embed && CanEmbed(pending_embed->view_id); | 558 const bool allow_embed = client.get() && CanEmbed(pending_embed->view_id); |
579 if (allow_embed) { | 559 if (allow_embed) { |
580 PrepareForEmbed(pending_embed->view_id); | 560 PrepareForEmbed(pending_embed->view_id); |
581 connection_manager_->EmbedAtView(id_, pending_embed->url_request.Pass(), | 561 connection_manager_->EmbedAtView(id_, pending_embed->view_id, |
582 pending_embed->view_id, services.Pass(), | 562 client.Pass()); |
583 exposed_services.Pass()); | |
584 } | 563 } |
585 RemovePendingEmbedAndNotifyCallback(pending_embed.get(), allow_embed); | 564 RemovePendingEmbedAndNotifyCallback(pending_embed.get(), allow_embed); |
586 } | 565 } |
587 | 566 |
588 void ViewManagerServiceImpl::InvalidatePendingEmbedForConnection( | 567 void ViewManagerServiceImpl::InvalidatePendingEmbedForConnection( |
589 ViewManagerServiceImpl* connection) { | 568 ViewManagerServiceImpl* connection) { |
590 if (pending_embeds_.empty()) | 569 if (pending_embeds_.empty()) |
591 return; | 570 return; |
592 std::set<scoped_refptr<PendingEmbed>> copy(pending_embeds_); | 571 std::set<scoped_refptr<PendingEmbed>> copy(pending_embeds_); |
593 for (auto& embed : copy) { | 572 for (auto& embed : copy) { |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
726 if (value.is_null()) { | 705 if (value.is_null()) { |
727 view->SetProperty(name, nullptr); | 706 view->SetProperty(name, nullptr); |
728 } else { | 707 } else { |
729 std::vector<uint8_t> data = value.To<std::vector<uint8_t>>(); | 708 std::vector<uint8_t> data = value.To<std::vector<uint8_t>>(); |
730 view->SetProperty(name, &data); | 709 view->SetProperty(name, &data); |
731 } | 710 } |
732 } | 711 } |
733 callback.Run(success); | 712 callback.Run(success); |
734 } | 713 } |
735 | 714 |
736 void ViewManagerServiceImpl::EmbedRequest( | 715 void ViewManagerServiceImpl::SetEmbedRoot() { |
737 mojo::URLRequestPtr request, | 716 is_embed_root_ = true; |
738 Id transport_view_id, | |
739 InterfaceRequest<ServiceProvider> services, | |
740 ServiceProviderPtr exposed_services, | |
741 const Callback<void(bool)>& callback) { | |
742 Embed(request.Pass(), ViewIdFromTransportId(transport_view_id), | |
743 EmbedType::NO_REEMBED, services.Pass(), exposed_services.Pass(), | |
744 callback); | |
745 } | |
746 | |
747 void ViewManagerServiceImpl::EmbedAllowingReembed( | |
748 mojo::URLRequestPtr request, | |
749 mojo::Id transport_view_id, | |
750 const mojo::Callback<void(bool)>& callback) { | |
751 Embed(request.Pass(), ViewIdFromTransportId(transport_view_id), | |
752 EmbedType::ALLOW_REEMBED, nullptr, nullptr, callback); | |
753 } | 717 } |
754 | 718 |
755 void ViewManagerServiceImpl::Embed(mojo::Id transport_view_id, | 719 void ViewManagerServiceImpl::Embed(mojo::Id transport_view_id, |
756 mojo::ViewManagerClientPtr client, | 720 mojo::ViewManagerClientPtr client, |
757 const mojo::Callback<void(bool)>& callback) { | 721 const mojo::Callback<void(bool)>& callback) { |
758 callback.Run(Embed(ViewIdFromTransportId(transport_view_id), client.Pass())); | 722 callback.Run(Embed(ViewIdFromTransportId(transport_view_id), client.Pass())); |
759 } | 723 } |
760 | 724 |
| 725 void ViewManagerServiceImpl::EmbedAllowingReembed( |
| 726 mojo::Id transport_view_id, |
| 727 mojo::URLRequestPtr request, |
| 728 const mojo::Callback<void(bool)>& callback) { |
| 729 EmbedAllowingReembed(ViewIdFromTransportId(transport_view_id), request.Pass(), |
| 730 callback); |
| 731 } |
| 732 |
761 void ViewManagerServiceImpl::SetFocus(uint32_t view_id, | 733 void ViewManagerServiceImpl::SetFocus(uint32_t view_id, |
762 const SetFocusCallback& callback) { | 734 const SetFocusCallback& callback) { |
763 ServerView* view = GetView(ViewIdFromTransportId(view_id)); | 735 ServerView* view = GetView(ViewIdFromTransportId(view_id)); |
764 bool success = view && view->IsDrawn(connection_manager_->root()) && | 736 bool success = view && view->IsDrawn(connection_manager_->root()) && |
765 access_policy_->CanSetFocus(view); | 737 access_policy_->CanSetFocus(view); |
766 if (success) { | 738 if (success) { |
767 ConnectionManager::ScopedChange change(this, connection_manager_, false); | 739 ConnectionManager::ScopedChange change(this, connection_manager_, false); |
768 connection_manager_->SetFocusedView(view); | 740 connection_manager_->SetFocusedView(view); |
769 } | 741 } |
770 callback.Run(success); | 742 callback.Run(success); |
(...skipping 13 matching lines...) Expand all Loading... |
784 ViewManagerServiceImpl* connection = | 756 ViewManagerServiceImpl* connection = |
785 connection_manager_->GetConnectionWithRoot(view->id()); | 757 connection_manager_->GetConnectionWithRoot(view->id()); |
786 return connection && connection != this; | 758 return connection && connection != this; |
787 } | 759 } |
788 | 760 |
789 bool ViewManagerServiceImpl::IsEmbedRootForAccessPolicy() { | 761 bool ViewManagerServiceImpl::IsEmbedRootForAccessPolicy() { |
790 return is_embed_root_; | 762 return is_embed_root_; |
791 } | 763 } |
792 | 764 |
793 } // namespace view_manager | 765 } // namespace view_manager |
OLD | NEW |