OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "components/html_viewer/document_resource_waiter.h" | |
6 | |
7 #include <utility> | |
8 | |
9 #include "components/html_viewer/global_state.h" | |
10 #include "components/html_viewer/html_document.h" | |
11 #include "components/html_viewer/html_frame_tree_manager.h" | |
12 #include "components/mus/public/cpp/window.h" | |
13 | |
14 using web_view::mojom::WindowConnectType; | |
15 | |
16 namespace html_viewer { | |
17 | |
18 DocumentResourceWaiter::DocumentResourceWaiter(GlobalState* global_state, | |
19 mojo::URLResponsePtr response, | |
20 HTMLDocument* document) | |
21 : global_state_(global_state), | |
22 document_(document), | |
23 response_(std::move(response)), | |
24 root_(nullptr), | |
25 change_id_(0u), | |
26 window_id_(0u), | |
27 window_connect_type_(web_view::mojom::WindowConnectType::USE_NEW), | |
28 frame_client_binding_(this), | |
29 is_ready_(false), | |
30 waiting_for_change_id_(false), | |
31 target_frame_tree_(nullptr) {} | |
32 | |
33 DocumentResourceWaiter::~DocumentResourceWaiter() { | |
34 if (root_) | |
35 root_->RemoveObserver(this); | |
36 if (target_frame_tree_) | |
37 target_frame_tree_->RemoveObserver(this); | |
38 } | |
39 | |
40 void DocumentResourceWaiter::Release( | |
41 mojo::InterfaceRequest<web_view::mojom::FrameClient>* frame_client_request, | |
42 web_view::mojom::FramePtr* frame, | |
43 mojo::Array<web_view::mojom::FrameDataPtr>* frame_data, | |
44 uint32_t* change_id, | |
45 uint32_t* window_id, | |
46 WindowConnectType* window_connect_type, | |
47 OnConnectCallback* on_connect_callback) { | |
48 DCHECK(is_ready_); | |
49 *frame_client_request = std::move(frame_client_request_); | |
50 *frame = std::move(frame_); | |
51 *frame_data = std::move(frame_data_); | |
52 *change_id = change_id_; | |
53 *window_id = window_id_; | |
54 *window_connect_type = window_connect_type_; | |
55 *on_connect_callback = on_connect_callback_; | |
56 } | |
57 | |
58 mojo::URLResponsePtr DocumentResourceWaiter::ReleaseURLResponse() { | |
59 return std::move(response_); | |
60 } | |
61 | |
62 void DocumentResourceWaiter::SetRoot(mus::Window* root) { | |
63 DCHECK(!root_); | |
64 root_ = root; | |
65 root_->AddObserver(this); | |
66 UpdateIsReady(); | |
67 } | |
68 | |
69 void DocumentResourceWaiter::Bind( | |
70 mojo::InterfaceRequest<web_view::mojom::FrameClient> request) { | |
71 if (frame_client_binding_.is_bound() || !frame_data_.is_null()) { | |
72 DVLOG(1) << "Request for FrameClient after already supplied one"; | |
73 return; | |
74 } | |
75 frame_client_binding_.Bind(std::move(request)); | |
76 } | |
77 | |
78 void DocumentResourceWaiter::UpdateIsReady() { | |
79 if (is_ready_) | |
80 return; | |
81 | |
82 // See description of |waiting_for_change_id_| for details. | |
83 if (waiting_for_change_id_) { | |
84 if (target_frame_tree_->change_id() == change_id_) { | |
85 is_ready_ = true; | |
86 waiting_for_change_id_ = false; | |
87 document_->Load(); | |
88 } | |
89 return; | |
90 } | |
91 | |
92 // The first portion of ready is when we have received OnConnect() | |
93 // (|frame_data_| is valid) and we have a window with valid metrics. The | |
94 // window is not necessary is WindowConnectType is USE_EXISTING, which means | |
95 // the | |
96 // application is not asked for a ViewTreeClient. The metrics are necessary | |
97 // to initialize ResourceBundle. If USE_EXISTING is true, it means a Window | |
98 // has already been provided to another HTMLDocument and there is no need to | |
99 // wait for metrics. | |
100 bool is_ready = | |
101 (!frame_data_.is_null() && | |
102 ((window_connect_type_ == | |
103 web_view::mojom::WindowConnectType::USE_EXISTING) || | |
104 (root_ && root_->viewport_metrics().device_pixel_ratio != 0.0f))); | |
105 if (is_ready) { | |
106 HTMLFrameTreeManager* frame_tree = | |
107 HTMLFrameTreeManager::FindFrameTreeWithRoot(frame_data_[0]->frame_id); | |
108 // Once we've received OnConnect() and the window (if necessary), we | |
109 // determine which HTMLFrameTreeManager the new frame ends up in. If there | |
110 // is an existing HTMLFrameTreeManager then we must wait for the change_id | |
111 // supplied to OnConnect() to be <= that of the HTMLFrameTreeManager's | |
112 // change_id. If we did not wait for the change id to be <= then the | |
113 // structure of the tree is not in the expected state and it's possible the | |
114 // frame communicated in OnConnect() does not exist yet. | |
115 if (frame_tree && change_id_ > frame_tree->change_id()) { | |
116 waiting_for_change_id_ = true; | |
117 target_frame_tree_ = frame_tree; | |
118 target_frame_tree_->AddObserver(this); | |
119 } else { | |
120 is_ready_ = true; | |
121 document_->Load(); | |
122 } | |
123 } | |
124 } | |
125 | |
126 void DocumentResourceWaiter::OnConnect( | |
127 web_view::mojom::FramePtr frame, | |
128 uint32_t change_id, | |
129 uint32_t window_id, | |
130 WindowConnectType window_connect_type, | |
131 mojo::Array<web_view::mojom::FrameDataPtr> frame_data, | |
132 int64_t navigation_start_time_ticks, | |
133 const OnConnectCallback& callback) { | |
134 DCHECK(frame_data_.is_null()); | |
135 change_id_ = change_id; | |
136 window_id_ = window_id; | |
137 window_connect_type_ = window_connect_type; | |
138 frame_ = std::move(frame); | |
139 frame_data_ = std::move(frame_data); | |
140 navigation_start_time_ = | |
141 base::TimeTicks::FromInternalValue(navigation_start_time_ticks); | |
142 on_connect_callback_ = callback; | |
143 CHECK(frame_data_.size() > 0u); | |
144 frame_client_request_ = frame_client_binding_.Unbind(); | |
145 UpdateIsReady(); | |
146 } | |
147 | |
148 void DocumentResourceWaiter::OnFrameAdded( | |
149 uint32_t change_id, | |
150 web_view::mojom::FrameDataPtr frame_data) { | |
151 // It is assumed we receive OnConnect() (which unbinds) before anything else. | |
152 NOTREACHED(); | |
153 } | |
154 | |
155 void DocumentResourceWaiter::OnFrameRemoved(uint32_t change_id, | |
156 uint32_t frame_id) { | |
157 // It is assumed we receive OnConnect() (which unbinds) before anything else. | |
158 NOTREACHED(); | |
159 } | |
160 | |
161 void DocumentResourceWaiter::OnFrameClientPropertyChanged( | |
162 uint32_t frame_id, | |
163 const mojo::String& name, | |
164 mojo::Array<uint8_t> new_value) { | |
165 // It is assumed we receive OnConnect() (which unbinds) before anything else. | |
166 NOTREACHED(); | |
167 } | |
168 | |
169 void DocumentResourceWaiter::OnPostMessageEvent( | |
170 uint32_t source_frame_id, | |
171 uint32_t target_frame_id, | |
172 web_view::mojom::HTMLMessageEventPtr event) { | |
173 // It is assumed we receive OnConnect() (which unbinds) before anything else. | |
174 NOTREACHED(); | |
175 } | |
176 | |
177 void DocumentResourceWaiter::OnWillNavigate( | |
178 const mojo::String& origin, | |
179 const OnWillNavigateCallback& callback) { | |
180 // It is assumed we receive OnConnect() (which unbinds) before anything else. | |
181 NOTREACHED(); | |
182 } | |
183 | |
184 void DocumentResourceWaiter::OnFrameLoadingStateChanged(uint32_t frame_id, | |
185 bool loading) { | |
186 // It is assumed we receive OnConnect() (which unbinds) before anything else. | |
187 NOTREACHED(); | |
188 } | |
189 | |
190 void DocumentResourceWaiter::OnDispatchFrameLoadEvent(uint32_t frame_id) { | |
191 // It is assumed we receive OnConnect() (which unbinds) before anything else. | |
192 NOTREACHED(); | |
193 } | |
194 | |
195 void DocumentResourceWaiter::Find(int32_t request_id, | |
196 const mojo::String& search_text, | |
197 web_view::mojom::FindOptionsPtr options, | |
198 bool wrap_within_frame, | |
199 const FindCallback& callback) { | |
200 // It is assumed we receive OnConnect() (which unbinds) before anything else. | |
201 NOTREACHED(); | |
202 } | |
203 | |
204 void DocumentResourceWaiter::StopFinding(bool clear_selection) { | |
205 // It is assumed we receive OnConnect() (which unbinds) before anything else. | |
206 NOTREACHED(); | |
207 } | |
208 | |
209 void DocumentResourceWaiter::HighlightFindResults( | |
210 int32_t request_id, | |
211 const mojo::String& search_test, | |
212 web_view::mojom::FindOptionsPtr options, | |
213 bool reset) { | |
214 // It is assumed we receive OnConnect() (which unbinds) before anything else. | |
215 NOTREACHED(); | |
216 } | |
217 | |
218 void DocumentResourceWaiter::StopHighlightingFindResults() { | |
219 // It is assumed we receive OnConnect() (which unbinds) before anything else. | |
220 NOTREACHED(); | |
221 } | |
222 | |
223 void DocumentResourceWaiter::OnWindowViewportMetricsChanged( | |
224 mus::Window* window, | |
225 const mus::mojom::ViewportMetrics& old_metrics, | |
226 const mus::mojom::ViewportMetrics& new_metrics) { | |
227 UpdateIsReady(); | |
228 } | |
229 | |
230 void DocumentResourceWaiter::OnWindowDestroyed(mus::Window* window) { | |
231 root_->RemoveObserver(this); | |
232 root_ = nullptr; | |
233 } | |
234 | |
235 void DocumentResourceWaiter::OnHTMLFrameTreeManagerChangeIdAdvanced() { | |
236 UpdateIsReady(); | |
237 } | |
238 | |
239 void DocumentResourceWaiter::OnHTMLFrameTreeManagerDestroyed() { | |
240 document_->Destroy(); // This destroys us. | |
241 } | |
242 | |
243 } // namespace html_viewer | |
OLD | NEW |