OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/html_viewer/html_frame_tree_manager.h" | 5 #include "components/html_viewer/html_frame_tree_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 12 matching lines...) Expand all Loading... |
23 #include "third_party/WebKit/public/web/WebTreeScopeType.h" | 23 #include "third_party/WebKit/public/web/WebTreeScopeType.h" |
24 #include "third_party/WebKit/public/web/WebView.h" | 24 #include "third_party/WebKit/public/web/WebView.h" |
25 #include "ui/gfx/geometry/dip_util.h" | 25 #include "ui/gfx/geometry/dip_util.h" |
26 #include "ui/gfx/geometry/size.h" | 26 #include "ui/gfx/geometry/size.h" |
27 | 27 |
28 namespace html_viewer { | 28 namespace html_viewer { |
29 namespace { | 29 namespace { |
30 | 30 |
31 // Returns the index of the FrameData with the id of |frame_id| in |index|. On | 31 // Returns the index of the FrameData with the id of |frame_id| in |index|. On |
32 // success returns true, otherwise false. | 32 // success returns true, otherwise false. |
33 bool FindFrameDataIndex(const mojo::Array<web_view::FrameDataPtr>& frame_data, | 33 bool FindFrameDataIndex( |
34 uint32_t frame_id, | 34 const mojo::Array<web_view::mojom::FrameDataPtr>& frame_data, |
35 size_t* index) { | 35 uint32_t frame_id, |
| 36 size_t* index) { |
36 for (size_t i = 0; i < frame_data.size(); ++i) { | 37 for (size_t i = 0; i < frame_data.size(); ++i) { |
37 if (frame_data[i]->frame_id == frame_id) { | 38 if (frame_data[i]->frame_id == frame_id) { |
38 *index = i; | 39 *index = i; |
39 return true; | 40 return true; |
40 } | 41 } |
41 } | 42 } |
42 return false; | 43 return false; |
43 } | 44 } |
44 | 45 |
45 } // namespace | 46 } // namespace |
(...skipping 21 matching lines...) Expand all Loading... |
67 | 68 |
68 // static | 69 // static |
69 HTMLFrame* HTMLFrameTreeManager::CreateFrameAndAttachToTree( | 70 HTMLFrame* HTMLFrameTreeManager::CreateFrameAndAttachToTree( |
70 GlobalState* global_state, | 71 GlobalState* global_state, |
71 mus::View* view, | 72 mus::View* view, |
72 scoped_ptr<DocumentResourceWaiter> resource_waiter, | 73 scoped_ptr<DocumentResourceWaiter> resource_waiter, |
73 HTMLFrameDelegate* delegate) { | 74 HTMLFrameDelegate* delegate) { |
74 if (!instances_) | 75 if (!instances_) |
75 instances_ = new TreeMap; | 76 instances_ = new TreeMap; |
76 | 77 |
77 mojo::InterfaceRequest<web_view::FrameTreeClient> frame_tree_client_request; | 78 mojo::InterfaceRequest<web_view::mojom::FrameClient> frame_client_request; |
78 web_view::FrameTreeServerPtr frame_tree_server; | 79 web_view::mojom::FramePtr server_frame; |
79 mojo::Array<web_view::FrameDataPtr> frame_data; | 80 mojo::Array<web_view::mojom::FrameDataPtr> frame_data; |
80 uint32_t change_id; | 81 uint32_t change_id; |
81 uint32_t view_id; | 82 uint32_t view_id; |
82 web_view::ViewConnectType view_connect_type; | 83 web_view::mojom::ViewConnectType view_connect_type; |
83 web_view::FrameTreeClient::OnConnectCallback on_connect_callback; | 84 web_view::mojom::FrameClient::OnConnectCallback on_connect_callback; |
84 resource_waiter->Release(&frame_tree_client_request, &frame_tree_server, | 85 resource_waiter->Release(&frame_client_request, &server_frame, &frame_data, |
85 &frame_data, &change_id, &view_id, | 86 &change_id, &view_id, &view_connect_type, |
86 &view_connect_type, &on_connect_callback); | 87 &on_connect_callback); |
87 resource_waiter.reset(); | 88 resource_waiter.reset(); |
88 | 89 |
89 on_connect_callback.Run(); | 90 on_connect_callback.Run(); |
90 | 91 |
91 HTMLFrameTreeManager* frame_tree = | 92 HTMLFrameTreeManager* frame_tree = |
92 FindFrameTreeWithRoot(frame_data[0]->frame_id); | 93 FindFrameTreeWithRoot(frame_data[0]->frame_id); |
93 | 94 |
94 DCHECK(!frame_tree || change_id <= frame_tree->change_id_); | 95 DCHECK(!frame_tree || change_id <= frame_tree->change_id_); |
95 | 96 |
96 if (view_connect_type == web_view::VIEW_CONNECT_TYPE_USE_EXISTING && | 97 if (view_connect_type == web_view::mojom::VIEW_CONNECT_TYPE_USE_EXISTING && |
97 !frame_tree) { | 98 !frame_tree) { |
98 DVLOG(1) << "was told to use existing view but do not have frame tree"; | 99 DVLOG(1) << "was told to use existing view but do not have frame tree"; |
99 return nullptr; | 100 return nullptr; |
100 } | 101 } |
101 | 102 |
102 if (!frame_tree) { | 103 if (!frame_tree) { |
103 frame_tree = new HTMLFrameTreeManager(global_state); | 104 frame_tree = new HTMLFrameTreeManager(global_state); |
104 frame_tree->Init(delegate, view, frame_data, change_id); | 105 frame_tree->Init(delegate, view, frame_data, change_id); |
105 if (frame_data[0]->frame_id == view->id()) | 106 if (frame_data[0]->frame_id == view->id()) |
106 (*instances_)[frame_data[0]->frame_id] = frame_tree; | 107 (*instances_)[frame_data[0]->frame_id] = frame_tree; |
107 } else if (view_connect_type == web_view::VIEW_CONNECT_TYPE_USE_EXISTING) { | 108 } else if (view_connect_type == |
| 109 web_view::mojom::VIEW_CONNECT_TYPE_USE_EXISTING) { |
108 HTMLFrame* existing_frame = frame_tree->root_->FindFrame(view_id); | 110 HTMLFrame* existing_frame = frame_tree->root_->FindFrame(view_id); |
109 if (!existing_frame) { | 111 if (!existing_frame) { |
110 DVLOG(1) << "was told to use existing view but could not find view"; | 112 DVLOG(1) << "was told to use existing view but could not find view"; |
111 return nullptr; | 113 return nullptr; |
112 } | 114 } |
113 if (!existing_frame->IsLocal()) { | 115 if (!existing_frame->IsLocal()) { |
114 DVLOG(1) << "was told to use existing view, but frame is remote"; | 116 DVLOG(1) << "was told to use existing view, but frame is remote"; |
115 return nullptr; | 117 return nullptr; |
116 } | 118 } |
117 existing_frame->SwapDelegate(delegate); | 119 existing_frame->SwapDelegate(delegate); |
118 } else { | 120 } else { |
119 // We're going to share a frame tree. We should know about the frame. | 121 // We're going to share a frame tree. We should know about the frame. |
120 CHECK(view->id() != frame_data[0]->frame_id); | 122 CHECK(view->id() != frame_data[0]->frame_id); |
121 HTMLFrame* existing_frame = frame_tree->root_->FindFrame(view->id()); | 123 HTMLFrame* existing_frame = frame_tree->root_->FindFrame(view->id()); |
122 if (existing_frame) { | 124 if (existing_frame) { |
123 CHECK(!existing_frame->IsLocal()); | 125 CHECK(!existing_frame->IsLocal()); |
124 size_t frame_data_index = 0u; | 126 size_t frame_data_index = 0u; |
125 CHECK(FindFrameDataIndex(frame_data, view->id(), &frame_data_index)); | 127 CHECK(FindFrameDataIndex(frame_data, view->id(), &frame_data_index)); |
126 const web_view::FrameDataPtr& data = frame_data[frame_data_index]; | 128 const web_view::mojom::FrameDataPtr& data = frame_data[frame_data_index]; |
127 existing_frame->SwapToLocal(delegate, view, data->client_properties); | 129 existing_frame->SwapToLocal(delegate, view, data->client_properties); |
128 } else { | 130 } else { |
129 // If we can't find the frame and the change_id of the incoming | 131 // If we can't find the frame and the change_id of the incoming |
130 // tree is before the change id we've processed, then we removed the | 132 // tree is before the change id we've processed, then we removed the |
131 // frame and need do nothing. | 133 // frame and need do nothing. |
132 if (change_id < frame_tree->change_id_) | 134 if (change_id < frame_tree->change_id_) |
133 return nullptr; | 135 return nullptr; |
134 | 136 |
135 // We removed the frame but it hasn't been acked yet. | 137 // We removed the frame but it hasn't been acked yet. |
136 if (frame_tree->pending_remove_ids_.count(view->id())) | 138 if (frame_tree->pending_remove_ids_.count(view->id())) |
137 return nullptr; | 139 return nullptr; |
138 | 140 |
139 // We don't know about the frame, but should. Something is wrong. | 141 // We don't know about the frame, but should. Something is wrong. |
140 DVLOG(1) << "unable to locate frame to attach to"; | 142 DVLOG(1) << "unable to locate frame to attach to"; |
141 return nullptr; | 143 return nullptr; |
142 } | 144 } |
143 } | 145 } |
144 | 146 |
145 HTMLFrame* frame = frame_tree->root_->FindFrame(view_id); | 147 HTMLFrame* frame = frame_tree->root_->FindFrame(view_id); |
146 DCHECK(frame); | 148 DCHECK(frame); |
147 frame->Bind(frame_tree_server.Pass(), frame_tree_client_request.Pass()); | 149 frame->Bind(server_frame.Pass(), frame_client_request.Pass()); |
148 return frame; | 150 return frame; |
149 } | 151 } |
150 | 152 |
151 // static | 153 // static |
152 HTMLFrameTreeManager* HTMLFrameTreeManager::FindFrameTreeWithRoot( | 154 HTMLFrameTreeManager* HTMLFrameTreeManager::FindFrameTreeWithRoot( |
153 uint32_t root_frame_id) { | 155 uint32_t root_frame_id) { |
154 return (!base::CommandLine::ForCurrentProcess()->HasSwitch( | 156 return (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
155 web_view::switches::kOOPIFAlwaysCreateNewFrameTree) && | 157 web_view::switches::kOOPIFAlwaysCreateNewFrameTree) && |
156 instances_ && instances_->count(root_frame_id)) | 158 instances_ && instances_->count(root_frame_id)) |
157 ? (*instances_)[root_frame_id] | 159 ? (*instances_)[root_frame_id] |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 DCHECK(!root_ || !local_root_); | 199 DCHECK(!root_ || !local_root_); |
198 RemoveFromInstances(); | 200 RemoveFromInstances(); |
199 | 201 |
200 FOR_EACH_OBSERVER(HTMLFrameTreeManagerObserver, observers_, | 202 FOR_EACH_OBSERVER(HTMLFrameTreeManagerObserver, observers_, |
201 OnHTMLFrameTreeManagerDestroyed()); | 203 OnHTMLFrameTreeManagerDestroyed()); |
202 } | 204 } |
203 | 205 |
204 void HTMLFrameTreeManager::Init( | 206 void HTMLFrameTreeManager::Init( |
205 HTMLFrameDelegate* delegate, | 207 HTMLFrameDelegate* delegate, |
206 mus::View* local_view, | 208 mus::View* local_view, |
207 const mojo::Array<web_view::FrameDataPtr>& frame_data, | 209 const mojo::Array<web_view::mojom::FrameDataPtr>& frame_data, |
208 uint32_t change_id) { | 210 uint32_t change_id) { |
209 change_id_ = change_id; | 211 change_id_ = change_id; |
210 root_ = BuildFrameTree(delegate, frame_data, local_view->id(), local_view); | 212 root_ = BuildFrameTree(delegate, frame_data, local_view->id(), local_view); |
211 local_root_ = root_->FindFrame(local_view->id()); | 213 local_root_ = root_->FindFrame(local_view->id()); |
212 CHECK(local_root_); | 214 CHECK(local_root_); |
213 local_root_->UpdateFocus(); | 215 local_root_->UpdateFocus(); |
214 } | 216 } |
215 | 217 |
216 HTMLFrame* HTMLFrameTreeManager::BuildFrameTree( | 218 HTMLFrame* HTMLFrameTreeManager::BuildFrameTree( |
217 HTMLFrameDelegate* delegate, | 219 HTMLFrameDelegate* delegate, |
218 const mojo::Array<web_view::FrameDataPtr>& frame_data, | 220 const mojo::Array<web_view::mojom::FrameDataPtr>& frame_data, |
219 uint32_t local_frame_id, | 221 uint32_t local_frame_id, |
220 mus::View* local_view) { | 222 mus::View* local_view) { |
221 std::vector<HTMLFrame*> parents; | 223 std::vector<HTMLFrame*> parents; |
222 HTMLFrame* root = nullptr; | 224 HTMLFrame* root = nullptr; |
223 HTMLFrame* last_frame = nullptr; | 225 HTMLFrame* last_frame = nullptr; |
224 for (size_t i = 0; i < frame_data.size(); ++i) { | 226 for (size_t i = 0; i < frame_data.size(); ++i) { |
225 if (last_frame && frame_data[i]->parent_id == last_frame->id()) { | 227 if (last_frame && frame_data[i]->parent_id == last_frame->id()) { |
226 parents.push_back(last_frame); | 228 parents.push_back(last_frame); |
227 } else if (!parents.empty()) { | 229 } else if (!parents.empty()) { |
228 while (parents.back()->id() != frame_data[i]->parent_id) | 230 while (parents.back()->id() != frame_data[i]->parent_id) |
(...skipping 21 matching lines...) Expand all Loading... |
250 if (pair.second == this) { | 252 if (pair.second == this) { |
251 instances_->erase(pair.first); | 253 instances_->erase(pair.first); |
252 return; | 254 return; |
253 } | 255 } |
254 } | 256 } |
255 } | 257 } |
256 | 258 |
257 bool HTMLFrameTreeManager::PrepareForStructureChange(HTMLFrame* source, | 259 bool HTMLFrameTreeManager::PrepareForStructureChange(HTMLFrame* source, |
258 uint32_t change_id) { | 260 uint32_t change_id) { |
259 // The change ids may differ if multiple HTMLDocuments are attached to the | 261 // The change ids may differ if multiple HTMLDocuments are attached to the |
260 // same tree (which means we have multiple FrameTreeClients for the same | 262 // same tree (which means we have multiple FrameClient for the same tree). |
261 // tree). | |
262 if (change_id != (change_id_ + 1)) | 263 if (change_id != (change_id_ + 1)) |
263 return false; | 264 return false; |
264 | 265 |
265 // We only process changes for the topmost local root. | 266 // We only process changes for the topmost local root. |
266 if (source != local_root_) | 267 if (source != local_root_) |
267 return false; | 268 return false; |
268 | 269 |
269 // Update the id as the change is going to be applied (or we can assume it | 270 // Update the id as the change is going to be applied (or we can assume it |
270 // will be applied if we get here). | 271 // will be applied if we get here). |
271 change_id_ = change_id; | 272 change_id_ = change_id; |
272 return true; | 273 return true; |
273 } | 274 } |
274 | 275 |
275 void HTMLFrameTreeManager::ProcessOnFrameAdded( | 276 void HTMLFrameTreeManager::ProcessOnFrameAdded( |
276 HTMLFrame* source, | 277 HTMLFrame* source, |
277 uint32_t change_id, | 278 uint32_t change_id, |
278 web_view::FrameDataPtr frame_data) { | 279 web_view::mojom::FrameDataPtr frame_data) { |
279 if (!PrepareForStructureChange(source, change_id)) | 280 if (!PrepareForStructureChange(source, change_id)) |
280 return; | 281 return; |
281 | 282 |
282 ChangeIdAdvancedNotifier notifier(&observers_); | 283 ChangeIdAdvancedNotifier notifier(&observers_); |
283 | 284 |
284 HTMLFrame* parent = root_->FindFrame(frame_data->parent_id); | 285 HTMLFrame* parent = root_->FindFrame(frame_data->parent_id); |
285 if (!parent) { | 286 if (!parent) { |
286 DVLOG(1) << "Received invalid parent in OnFrameAdded " | 287 DVLOG(1) << "Received invalid parent in OnFrameAdded " |
287 << frame_data->parent_id; | 288 << frame_data->parent_id; |
288 return; | 289 return; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 mojo::Array<uint8_t> new_data) { | 352 mojo::Array<uint8_t> new_data) { |
352 if (source != local_root_) | 353 if (source != local_root_) |
353 return; | 354 return; |
354 | 355 |
355 HTMLFrame* frame = root_->FindFrame(frame_id); | 356 HTMLFrame* frame = root_->FindFrame(frame_id); |
356 if (frame) | 357 if (frame) |
357 frame->SetValueFromClientProperty(name, new_data.Pass()); | 358 frame->SetValueFromClientProperty(name, new_data.Pass()); |
358 } | 359 } |
359 | 360 |
360 } // namespace mojo | 361 } // namespace mojo |
OLD | NEW |