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/document_resource_waiter.h" | 5 #include "components/html_viewer/document_resource_waiter.h" |
6 | 6 |
7 #include "components/html_viewer/global_state.h" | 7 #include "components/html_viewer/global_state.h" |
8 #include "components/html_viewer/html_document.h" | 8 #include "components/html_viewer/html_document.h" |
9 #include "components/html_viewer/html_frame_tree_manager.h" | 9 #include "components/html_viewer/html_frame_tree_manager.h" |
10 #include "components/mus/public/cpp/window.h" | 10 #include "components/mus/public/cpp/window.h" |
11 | 11 |
12 using web_view::mojom::ViewConnectType; | 12 using web_view::mojom::WindowConnectType; |
13 | 13 |
14 namespace html_viewer { | 14 namespace html_viewer { |
15 | 15 |
16 DocumentResourceWaiter::DocumentResourceWaiter(GlobalState* global_state, | 16 DocumentResourceWaiter::DocumentResourceWaiter(GlobalState* global_state, |
17 mojo::URLResponsePtr response, | 17 mojo::URLResponsePtr response, |
18 HTMLDocument* document) | 18 HTMLDocument* document) |
19 : global_state_(global_state), | 19 : global_state_(global_state), |
20 document_(document), | 20 document_(document), |
21 response_(response.Pass()), | 21 response_(response.Pass()), |
22 root_(nullptr), | 22 root_(nullptr), |
23 change_id_(0u), | 23 change_id_(0u), |
24 window_id_(0u), | 24 window_id_(0u), |
25 view_connect_type_(web_view::mojom::VIEW_CONNECT_TYPE_USE_NEW), | 25 window_connect_type_(web_view::mojom::WINDOW_CONNECT_TYPE_USE_NEW), |
26 frame_client_binding_(this), | 26 frame_client_binding_(this), |
27 is_ready_(false), | 27 is_ready_(false), |
28 waiting_for_change_id_(false), | 28 waiting_for_change_id_(false), |
29 target_frame_tree_(nullptr) {} | 29 target_frame_tree_(nullptr) {} |
30 | 30 |
31 DocumentResourceWaiter::~DocumentResourceWaiter() { | 31 DocumentResourceWaiter::~DocumentResourceWaiter() { |
32 if (root_) | 32 if (root_) |
33 root_->RemoveObserver(this); | 33 root_->RemoveObserver(this); |
34 if (target_frame_tree_) | 34 if (target_frame_tree_) |
35 target_frame_tree_->RemoveObserver(this); | 35 target_frame_tree_->RemoveObserver(this); |
36 } | 36 } |
37 | 37 |
38 void DocumentResourceWaiter::Release( | 38 void DocumentResourceWaiter::Release( |
39 mojo::InterfaceRequest<web_view::mojom::FrameClient>* frame_client_request, | 39 mojo::InterfaceRequest<web_view::mojom::FrameClient>* frame_client_request, |
40 web_view::mojom::FramePtr* frame, | 40 web_view::mojom::FramePtr* frame, |
41 mojo::Array<web_view::mojom::FrameDataPtr>* frame_data, | 41 mojo::Array<web_view::mojom::FrameDataPtr>* frame_data, |
42 uint32_t* change_id, | 42 uint32_t* change_id, |
43 uint32_t* window_id, | 43 uint32_t* window_id, |
44 ViewConnectType* view_connect_type, | 44 WindowConnectType* window_connect_type, |
45 OnConnectCallback* on_connect_callback) { | 45 OnConnectCallback* on_connect_callback) { |
46 DCHECK(is_ready_); | 46 DCHECK(is_ready_); |
47 *frame_client_request = frame_client_request_.Pass(); | 47 *frame_client_request = frame_client_request_.Pass(); |
48 *frame = frame_.Pass(); | 48 *frame = frame_.Pass(); |
49 *frame_data = frame_data_.Pass(); | 49 *frame_data = frame_data_.Pass(); |
50 *change_id = change_id_; | 50 *change_id = change_id_; |
51 *window_id = window_id_; | 51 *window_id = window_id_; |
52 *view_connect_type = view_connect_type_; | 52 *window_connect_type = window_connect_type_; |
53 *on_connect_callback = on_connect_callback_; | 53 *on_connect_callback = on_connect_callback_; |
54 } | 54 } |
55 | 55 |
56 mojo::URLResponsePtr DocumentResourceWaiter::ReleaseURLResponse() { | 56 mojo::URLResponsePtr DocumentResourceWaiter::ReleaseURLResponse() { |
57 return response_.Pass(); | 57 return response_.Pass(); |
58 } | 58 } |
59 | 59 |
60 void DocumentResourceWaiter::SetRoot(mus::Window* root) { | 60 void DocumentResourceWaiter::SetRoot(mus::Window* root) { |
61 DCHECK(!root_); | 61 DCHECK(!root_); |
62 root_ = root; | 62 root_ = root; |
(...skipping 19 matching lines...) Expand all Loading... |
82 if (target_frame_tree_->change_id() == change_id_) { | 82 if (target_frame_tree_->change_id() == change_id_) { |
83 is_ready_ = true; | 83 is_ready_ = true; |
84 waiting_for_change_id_ = false; | 84 waiting_for_change_id_ = false; |
85 document_->Load(); | 85 document_->Load(); |
86 } | 86 } |
87 return; | 87 return; |
88 } | 88 } |
89 | 89 |
90 // The first portion of ready is when we have received OnConnect() | 90 // The first portion of ready is when we have received OnConnect() |
91 // (|frame_data_| is valid) and we have a window with valid metrics. The | 91 // (|frame_data_| is valid) and we have a window with valid metrics. The |
92 // window is not necessary is ViewConnectType is USE_EXISTING, which means the | 92 // window is not necessary is WindowConnectType is USE_EXISTING, which means |
| 93 // the |
93 // application is not asked for a ViewTreeClient. The metrics are necessary | 94 // application is not asked for a ViewTreeClient. The metrics are necessary |
94 // to initialize ResourceBundle. If USE_EXISTING is true, it means a Window | 95 // to initialize ResourceBundle. If USE_EXISTING is true, it means a Window |
95 // has already been provided to another HTMLDocument and there is no need to | 96 // has already been provided to another HTMLDocument and there is no need to |
96 // wait for metrics. | 97 // wait for metrics. |
97 bool is_ready = | 98 bool is_ready = |
98 (!frame_data_.is_null() && | 99 (!frame_data_.is_null() && |
99 ((view_connect_type_ == | 100 ((window_connect_type_ == |
100 web_view::mojom::VIEW_CONNECT_TYPE_USE_EXISTING) || | 101 web_view::mojom::WINDOW_CONNECT_TYPE_USE_EXISTING) || |
101 (root_ && root_->viewport_metrics().device_pixel_ratio != 0.0f))); | 102 (root_ && root_->viewport_metrics().device_pixel_ratio != 0.0f))); |
102 if (is_ready) { | 103 if (is_ready) { |
103 HTMLFrameTreeManager* frame_tree = | 104 HTMLFrameTreeManager* frame_tree = |
104 HTMLFrameTreeManager::FindFrameTreeWithRoot(frame_data_[0]->frame_id); | 105 HTMLFrameTreeManager::FindFrameTreeWithRoot(frame_data_[0]->frame_id); |
105 // Once we've received OnConnect() and the window (if necessary), we | 106 // Once we've received OnConnect() and the window (if necessary), we |
106 // determine which HTMLFrameTreeManager the new frame ends up in. If there | 107 // determine which HTMLFrameTreeManager the new frame ends up in. If there |
107 // is an existing HTMLFrameTreeManager then we must wait for the change_id | 108 // is an existing HTMLFrameTreeManager then we must wait for the change_id |
108 // supplied to OnConnect() to be <= that of the HTMLFrameTreeManager's | 109 // supplied to OnConnect() to be <= that of the HTMLFrameTreeManager's |
109 // change_id. If we did not wait for the change id to be <= then the | 110 // change_id. If we did not wait for the change id to be <= then the |
110 // structure of the tree is not in the expected state and it's possible the | 111 // structure of the tree is not in the expected state and it's possible the |
111 // frame communicated in OnConnect() does not exist yet. | 112 // frame communicated in OnConnect() does not exist yet. |
112 if (frame_tree && change_id_ > frame_tree->change_id()) { | 113 if (frame_tree && change_id_ > frame_tree->change_id()) { |
113 waiting_for_change_id_ = true; | 114 waiting_for_change_id_ = true; |
114 target_frame_tree_ = frame_tree; | 115 target_frame_tree_ = frame_tree; |
115 target_frame_tree_->AddObserver(this); | 116 target_frame_tree_->AddObserver(this); |
116 } else { | 117 } else { |
117 is_ready_ = true; | 118 is_ready_ = true; |
118 document_->Load(); | 119 document_->Load(); |
119 } | 120 } |
120 } | 121 } |
121 } | 122 } |
122 | 123 |
123 void DocumentResourceWaiter::OnConnect( | 124 void DocumentResourceWaiter::OnConnect( |
124 web_view::mojom::FramePtr frame, | 125 web_view::mojom::FramePtr frame, |
125 uint32_t change_id, | 126 uint32_t change_id, |
126 uint32_t window_id, | 127 uint32_t window_id, |
127 ViewConnectType view_connect_type, | 128 WindowConnectType window_connect_type, |
128 mojo::Array<web_view::mojom::FrameDataPtr> frame_data, | 129 mojo::Array<web_view::mojom::FrameDataPtr> frame_data, |
129 int64_t navigation_start_time_ticks, | 130 int64_t navigation_start_time_ticks, |
130 const OnConnectCallback& callback) { | 131 const OnConnectCallback& callback) { |
131 DCHECK(frame_data_.is_null()); | 132 DCHECK(frame_data_.is_null()); |
132 change_id_ = change_id; | 133 change_id_ = change_id; |
133 window_id_ = window_id; | 134 window_id_ = window_id; |
134 view_connect_type_ = view_connect_type; | 135 window_connect_type_ = window_connect_type; |
135 frame_ = frame.Pass(); | 136 frame_ = frame.Pass(); |
136 frame_data_ = frame_data.Pass(); | 137 frame_data_ = frame_data.Pass(); |
137 navigation_start_time_ = | 138 navigation_start_time_ = |
138 base::TimeTicks::FromInternalValue(navigation_start_time_ticks); | 139 base::TimeTicks::FromInternalValue(navigation_start_time_ticks); |
139 on_connect_callback_ = callback; | 140 on_connect_callback_ = callback; |
140 CHECK(frame_data_.size() > 0u); | 141 CHECK(frame_data_.size() > 0u); |
141 frame_client_request_ = frame_client_binding_.Unbind(); | 142 frame_client_request_ = frame_client_binding_.Unbind(); |
142 UpdateIsReady(); | 143 UpdateIsReady(); |
143 } | 144 } |
144 | 145 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 | 232 |
232 void DocumentResourceWaiter::OnHTMLFrameTreeManagerChangeIdAdvanced() { | 233 void DocumentResourceWaiter::OnHTMLFrameTreeManagerChangeIdAdvanced() { |
233 UpdateIsReady(); | 234 UpdateIsReady(); |
234 } | 235 } |
235 | 236 |
236 void DocumentResourceWaiter::OnHTMLFrameTreeManagerDestroyed() { | 237 void DocumentResourceWaiter::OnHTMLFrameTreeManagerDestroyed() { |
237 document_->Destroy(); // This destroys us. | 238 document_->Destroy(); // This destroys us. |
238 } | 239 } |
239 | 240 |
240 } // namespace html_viewer | 241 } // namespace html_viewer |
OLD | NEW |