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/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" |
11 #include "components/html_viewer/blink_basic_type_converters.h" | 11 #include "components/html_viewer/blink_basic_type_converters.h" |
12 #include "components/html_viewer/blink_url_request_type_converters.h" | 12 #include "components/html_viewer/blink_url_request_type_converters.h" |
13 #include "components/html_viewer/frame.h" | |
14 #include "components/html_viewer/frame_tree_manager_delegate.h" | |
15 #include "components/html_viewer/global_state.h" | 13 #include "components/html_viewer/global_state.h" |
| 14 #include "components/html_viewer/html_frame.h" |
| 15 #include "components/html_viewer/html_frame_tree_manager_delegate.h" |
16 #include "components/view_manager/public/cpp/view_manager.h" | 16 #include "components/view_manager/public/cpp/view_manager.h" |
17 #include "mojo/application/public/cpp/application_connection.h" | 17 #include "mojo/application/public/cpp/application_connection.h" |
18 #include "mojo/application/public/cpp/application_impl.h" | 18 #include "mojo/application/public/cpp/application_impl.h" |
19 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 19 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
20 #include "third_party/WebKit/public/web/WebRemoteFrame.h" | 20 #include "third_party/WebKit/public/web/WebRemoteFrame.h" |
21 #include "third_party/WebKit/public/web/WebTreeScopeType.h" | 21 #include "third_party/WebKit/public/web/WebTreeScopeType.h" |
22 #include "third_party/WebKit/public/web/WebView.h" | 22 #include "third_party/WebKit/public/web/WebView.h" |
23 #include "ui/gfx/geometry/dip_util.h" | 23 #include "ui/gfx/geometry/dip_util.h" |
24 #include "ui/gfx/geometry/size.h" | 24 #include "ui/gfx/geometry/size.h" |
25 | 25 |
(...skipping 22 matching lines...) Expand all Loading... |
48 // can go ahead and navigate locally. | 48 // can go ahead and navigate locally. |
49 if (request.extraData()) | 49 if (request.extraData()) |
50 return true; | 50 return true; |
51 | 51 |
52 // Otherwise we don't know if we're the right app to handle this request. Ask | 52 // Otherwise we don't know if we're the right app to handle this request. Ask |
53 // host to do the navigation for us. | 53 // host to do the navigation for us. |
54 return false; | 54 return false; |
55 } | 55 } |
56 | 56 |
57 // Creates a Frame per FrameData element in |frame_data|. | 57 // Creates a Frame per FrameData element in |frame_data|. |
58 Frame* BuildFrameTree(FrameTreeManager* frame_tree_manager, | 58 HTMLFrame* BuildFrameTree( |
59 const mojo::Array<mandoline::FrameDataPtr>& frame_data, | 59 HTMLFrameTreeManager* frame_tree_manager, |
60 uint32_t local_frame_id, | 60 const mojo::Array<mandoline::FrameDataPtr>& frame_data, |
61 mojo::View* local_view) { | 61 uint32_t local_frame_id, |
62 std::vector<Frame*> parents; | 62 mojo::View* local_view) { |
63 Frame* root = nullptr; | 63 std::vector<HTMLFrame*> parents; |
64 Frame* last_frame = nullptr; | 64 HTMLFrame* root = nullptr; |
| 65 HTMLFrame* last_frame = nullptr; |
65 for (size_t i = 0; i < frame_data.size(); ++i) { | 66 for (size_t i = 0; i < frame_data.size(); ++i) { |
66 if (last_frame && frame_data[i]->parent_id == last_frame->id()) { | 67 if (last_frame && frame_data[i]->parent_id == last_frame->id()) { |
67 parents.push_back(last_frame); | 68 parents.push_back(last_frame); |
68 } else if (!parents.empty()) { | 69 } else if (!parents.empty()) { |
69 while (parents.back()->id() != frame_data[i]->parent_id) | 70 while (parents.back()->id() != frame_data[i]->parent_id) |
70 parents.pop_back(); | 71 parents.pop_back(); |
71 } | 72 } |
72 Frame::CreateParams params(frame_tree_manager, | 73 HTMLFrame::CreateParams params(frame_tree_manager, |
73 !parents.empty() ? parents.back() : nullptr, | 74 !parents.empty() ? parents.back() : nullptr, |
74 frame_data[i]->frame_id); | 75 frame_data[i]->frame_id); |
75 Frame* frame = new Frame(params); | 76 HTMLFrame* frame = new HTMLFrame(params); |
76 if (!last_frame) | 77 if (!last_frame) |
77 root = frame; | 78 root = frame; |
78 else | 79 else |
79 DCHECK(frame->parent()); | 80 DCHECK(frame->parent()); |
80 last_frame = frame; | 81 last_frame = frame; |
81 | 82 |
82 frame->Init(local_view, frame_data[i]->name.To<blink::WebString>(), | 83 frame->Init(local_view, frame_data[i]->name.To<blink::WebString>(), |
83 frame_data[i]->origin.To<blink::WebString>()); | 84 frame_data[i]->origin.To<blink::WebString>()); |
84 } | 85 } |
85 return root; | 86 return root; |
86 } | 87 } |
87 | 88 |
88 } // namespace | 89 } // namespace |
89 | 90 |
90 FrameTreeManager::FrameTreeManager(GlobalState* global_state, | 91 HTMLFrameTreeManager::HTMLFrameTreeManager( |
91 mojo::ApplicationImpl* app, | 92 GlobalState* global_state, |
92 mojo::ApplicationConnection* app_connection, | 93 mojo::ApplicationImpl* app, |
93 uint32_t local_frame_id, | 94 mojo::ApplicationConnection* app_connection, |
94 mandoline::FrameTreeServerPtr server) | 95 uint32_t local_frame_id, |
| 96 mandoline::FrameTreeServerPtr server) |
95 : global_state_(global_state), | 97 : global_state_(global_state), |
96 app_(app), | 98 app_(app), |
97 delegate_(nullptr), | 99 delegate_(nullptr), |
98 local_frame_id_(local_frame_id), | 100 local_frame_id_(local_frame_id), |
99 server_(server.Pass()), | 101 server_(server.Pass()), |
100 navigator_host_(app_connection->GetServiceProvider()), | 102 navigator_host_(app_connection->GetServiceProvider()), |
101 root_(nullptr) { | 103 root_(nullptr) {} |
102 } | |
103 | 104 |
104 FrameTreeManager::~FrameTreeManager() { | 105 HTMLFrameTreeManager::~HTMLFrameTreeManager() { |
105 if (root_) | 106 if (root_) |
106 root_->Close(); // This should call back to OnFrameDestroyed(). | 107 root_->Close(); // This should call back to OnFrameDestroyed(). |
107 DCHECK(!root_); | 108 DCHECK(!root_); |
108 } | 109 } |
109 | 110 |
110 void FrameTreeManager::Init(mojo::View* local_view, | 111 void HTMLFrameTreeManager::Init( |
111 mojo::Array<mandoline::FrameDataPtr> frame_data) { | 112 mojo::View* local_view, |
| 113 mojo::Array<mandoline::FrameDataPtr> frame_data) { |
112 root_ = BuildFrameTree(this, frame_data, local_frame_id_, local_view); | 114 root_ = BuildFrameTree(this, frame_data, local_frame_id_, local_view); |
113 Frame* local_frame = root_->FindFrame(local_frame_id_); | 115 HTMLFrame* local_frame = root_->FindFrame(local_frame_id_); |
114 CHECK(local_frame); | 116 CHECK(local_frame); |
115 local_frame->UpdateFocus(); | 117 local_frame->UpdateFocus(); |
116 } | 118 } |
117 | 119 |
118 Frame* FrameTreeManager::GetLocalFrame() { | 120 HTMLFrame* HTMLFrameTreeManager::GetLocalFrame() { |
119 return root_->FindFrame(local_frame_id_); | 121 return root_->FindFrame(local_frame_id_); |
120 } | 122 } |
121 | 123 |
122 blink::WebLocalFrame* FrameTreeManager::GetLocalWebFrame() { | 124 blink::WebLocalFrame* HTMLFrameTreeManager::GetLocalWebFrame() { |
123 return GetLocalFrame()->web_frame()->toWebLocalFrame(); | 125 return GetLocalFrame()->web_frame()->toWebLocalFrame(); |
124 } | 126 } |
125 | 127 |
126 blink::WebView* FrameTreeManager::GetWebView() { | 128 blink::WebView* HTMLFrameTreeManager::GetWebView() { |
127 return root_->web_view(); | 129 return root_->web_view(); |
128 } | 130 } |
129 | 131 |
130 blink::WebNavigationPolicy FrameTreeManager::DecidePolicyForNavigation( | 132 blink::WebNavigationPolicy HTMLFrameTreeManager::DecidePolicyForNavigation( |
131 Frame* frame, | 133 HTMLFrame* frame, |
132 const blink::WebFrameClient::NavigationPolicyInfo& info) { | 134 const blink::WebFrameClient::NavigationPolicyInfo& info) { |
133 if (info.frame == frame->web_frame() && frame == root_ && delegate_ && | 135 if (info.frame == frame->web_frame() && frame == root_ && delegate_ && |
134 delegate_->ShouldNavigateLocallyInMainFrame()) { | 136 delegate_->ShouldNavigateLocallyInMainFrame()) { |
135 return info.defaultPolicy; | 137 return info.defaultPolicy; |
136 } | 138 } |
137 | 139 |
138 if (CanNavigateLocally(info.frame, info.urlRequest)) | 140 if (CanNavigateLocally(info.frame, info.urlRequest)) |
139 return info.defaultPolicy; | 141 return info.defaultPolicy; |
140 | 142 |
141 // TODO(sky): this is wrong for subframes. In fact NavigatorHost should likely | 143 // TODO(sky): this is wrong for subframes. In fact NavigatorHost should likely |
142 // be merged with Frame. | 144 // be merged with Frame. |
143 if (navigator_host_.get()) { | 145 if (navigator_host_.get()) { |
144 mojo::URLRequestPtr url_request = mojo::URLRequest::From(info.urlRequest); | 146 mojo::URLRequestPtr url_request = mojo::URLRequest::From(info.urlRequest); |
145 navigator_host_->RequestNavigate( | 147 navigator_host_->RequestNavigate( |
146 WebNavigationPolicyToNavigationTarget(info.defaultPolicy), | 148 WebNavigationPolicyToNavigationTarget(info.defaultPolicy), |
147 url_request.Pass()); | 149 url_request.Pass()); |
148 } | 150 } |
149 | 151 |
150 return blink::WebNavigationPolicyIgnore; | 152 return blink::WebNavigationPolicyIgnore; |
151 } | 153 } |
152 | 154 |
153 void FrameTreeManager::OnFrameDidFinishLoad(Frame* frame) { | 155 void HTMLFrameTreeManager::OnFrameDidFinishLoad(HTMLFrame* frame) { |
154 if (delegate_) | 156 if (delegate_) |
155 delegate_->OnFrameDidFinishLoad(frame); | 157 delegate_->OnFrameDidFinishLoad(frame); |
156 } | 158 } |
157 | 159 |
158 void FrameTreeManager::OnFrameDidNavigateLocally(Frame* frame, | 160 void HTMLFrameTreeManager::OnFrameDidNavigateLocally(HTMLFrame* frame, |
159 const std::string& url) { | 161 const std::string& url) { |
160 if (navigator_host_.get() && frame == root_) | 162 if (navigator_host_.get() && frame == root_) |
161 navigator_host_->DidNavigateLocally(url); | 163 navigator_host_->DidNavigateLocally(url); |
162 } | 164 } |
163 | 165 |
164 void FrameTreeManager::OnFrameDestroyed(Frame* frame) { | 166 void HTMLFrameTreeManager::OnFrameDestroyed(HTMLFrame* frame) { |
165 if (frame == root_) { | 167 if (frame == root_) { |
166 root_ = nullptr; | 168 root_ = nullptr; |
167 // Shortly after this HTMLDocumentOOPIF should get ViewManagerDestroyed() | 169 // Shortly after this HTMLDocumentOOPIF should get ViewManagerDestroyed() |
168 // and delete us. | 170 // and delete us. |
169 } | 171 } |
170 } | 172 } |
171 | 173 |
172 void FrameTreeManager::OnFrameDidChangeName(Frame* frame, | 174 void HTMLFrameTreeManager::OnFrameDidChangeName(HTMLFrame* frame, |
173 const blink::WebString& name) { | 175 const blink::WebString& name) { |
174 if (frame != GetLocalFrame()) | 176 if (frame != GetLocalFrame()) |
175 return; | 177 return; |
176 | 178 |
177 mojo::String mojo_name; | 179 mojo::String mojo_name; |
178 if (!name.isNull()) | 180 if (!name.isNull()) |
179 mojo_name = name.utf8(); | 181 mojo_name = name.utf8(); |
180 server_->SetFrameName(mojo_name); | 182 server_->SetFrameName(mojo_name); |
181 } | 183 } |
182 | 184 |
183 void FrameTreeManager::OnConnect( | 185 void HTMLFrameTreeManager::OnConnect( |
184 mandoline::FrameTreeServerPtr server, | 186 mandoline::FrameTreeServerPtr server, |
185 mojo::Array<mandoline::FrameDataPtr> frame_data) { | 187 mojo::Array<mandoline::FrameDataPtr> frame_data) { |
186 // OnConnection() is only sent once, and has been received (by | 188 // OnConnection() is only sent once, and has been received (by |
187 // DocumentResourceWaiter) by the time we get here. | 189 // DocumentResourceWaiter) by the time we get here. |
188 NOTREACHED(); | 190 NOTREACHED(); |
189 } | 191 } |
190 | 192 |
191 void FrameTreeManager::LoadingStarted() { | 193 void HTMLFrameTreeManager::LoadingStarted() { |
192 server_->LoadingStarted(); | 194 server_->LoadingStarted(); |
193 } | 195 } |
194 | 196 |
195 void FrameTreeManager::LoadingStopped() { | 197 void HTMLFrameTreeManager::LoadingStopped() { |
196 server_->LoadingStopped(); | 198 server_->LoadingStopped(); |
197 } | 199 } |
198 | 200 |
199 void FrameTreeManager::ProgressChanged(double progress) { | 201 void HTMLFrameTreeManager::ProgressChanged(double progress) { |
200 server_->ProgressChanged(progress); | 202 server_->ProgressChanged(progress); |
201 } | 203 } |
202 | 204 |
203 void FrameTreeManager::OnFrameAdded(mandoline::FrameDataPtr frame_data) { | 205 void HTMLFrameTreeManager::OnFrameAdded(mandoline::FrameDataPtr frame_data) { |
204 NOTIMPLEMENTED(); | 206 NOTIMPLEMENTED(); |
205 } | 207 } |
206 | 208 |
207 void FrameTreeManager::OnFrameRemoved(uint32_t frame_id) { | 209 void HTMLFrameTreeManager::OnFrameRemoved(uint32_t frame_id) { |
208 NOTIMPLEMENTED(); | 210 NOTIMPLEMENTED(); |
209 } | 211 } |
210 | 212 |
211 void FrameTreeManager::OnFrameNameChanged(uint32_t frame_id, | 213 void HTMLFrameTreeManager::OnFrameNameChanged(uint32_t frame_id, |
212 const mojo::String& name) { | 214 const mojo::String& name) { |
213 Frame* frame = root_->FindFrame(frame_id); | 215 HTMLFrame* frame = root_->FindFrame(frame_id); |
214 if (frame) | 216 if (frame) |
215 frame->SetRemoteFrameName(name); | 217 frame->SetRemoteFrameName(name); |
216 } | 218 } |
217 | 219 |
218 } // namespace mojo | 220 } // namespace mojo |
OLD | NEW |