Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(163)

Side by Side Diff: components/html_viewer/document_resource_waiter.cc

Issue 1677293002: Bye bye Mandoline (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: moar Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
OLDNEW
« no previous file with comments | « components/html_viewer/document_resource_waiter.h ('k') | components/html_viewer/generate_blink_resource_map.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698