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 "headless/lib/browser/headless_web_contents_impl.h" | 5 #include "headless/lib/browser/headless_web_contents_impl.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 return; | 127 return; |
128 } | 128 } |
129 } | 129 } |
130 } | 130 } |
131 | 131 |
132 private: | 132 private: |
133 HeadlessBrowserContextImpl* browser_context_; // Not owned. | 133 HeadlessBrowserContextImpl* browser_context_; // Not owned. |
134 DISALLOW_COPY_AND_ASSIGN(Delegate); | 134 DISALLOW_COPY_AND_ASSIGN(Delegate); |
135 }; | 135 }; |
136 | 136 |
| 137 namespace { |
| 138 void ForwardToServiceFactory( |
| 139 const base::Callback<void(mojo::InterfaceRequest<TabSocket>)>& |
| 140 service_factory, |
| 141 mojo::ScopedMessagePipeHandle handle) { |
| 142 service_factory.Run(mojo::MakeRequest<TabSocket>(std::move(handle))); |
| 143 } |
| 144 } // namespace |
| 145 |
137 // static | 146 // static |
138 std::unique_ptr<HeadlessWebContentsImpl> HeadlessWebContentsImpl::Create( | 147 std::unique_ptr<HeadlessWebContentsImpl> HeadlessWebContentsImpl::Create( |
139 HeadlessWebContents::Builder* builder) { | 148 HeadlessWebContents::Builder* builder) { |
140 content::WebContents::CreateParams create_params(builder->browser_context_, | 149 content::WebContents::CreateParams create_params(builder->browser_context_, |
141 nullptr); | 150 nullptr); |
142 create_params.initial_size = builder->window_size_; | 151 create_params.initial_size = builder->window_size_; |
143 | 152 |
144 std::unique_ptr<HeadlessWebContentsImpl> headless_web_contents = | 153 std::unique_ptr<HeadlessWebContentsImpl> headless_web_contents = |
145 base::WrapUnique(new HeadlessWebContentsImpl( | 154 base::WrapUnique(new HeadlessWebContentsImpl( |
146 content::WebContents::Create(create_params), | 155 content::WebContents::Create(create_params), |
147 builder->browser_context_)); | 156 builder->browser_context_)); |
148 | 157 |
149 if (builder->create_tab_socket_) { | 158 if (builder->create_tab_socket_) { |
150 headless_web_contents->headless_tab_socket_ = | 159 headless_web_contents->headless_tab_socket_ = |
151 base::MakeUnique<HeadlessTabSocketImpl>(); | 160 base::MakeUnique<HeadlessTabSocketImpl>(); |
152 builder->AddMojoService(base::Bind( | 161 |
153 &HeadlessTabSocketImpl::CreateMojoService, | 162 builder->mojo_services_.emplace_back( |
154 base::Unretained(headless_web_contents->headless_tab_socket_.get()))); | 163 TabSocket::Name_, |
| 164 base::Bind( |
| 165 &ForwardToServiceFactory, |
| 166 base::Bind( |
| 167 &HeadlessTabSocketImpl::CreateMojoService, |
| 168 base::Unretained( |
| 169 headless_web_contents->headless_tab_socket_.get())))); |
155 } | 170 } |
156 | 171 |
157 headless_web_contents->mojo_services_ = std::move(builder->mojo_services_); | 172 headless_web_contents->mojo_services_ = std::move(builder->mojo_services_); |
158 headless_web_contents->InitializeScreen(builder->window_size_); | 173 headless_web_contents->InitializeScreen(builder->window_size_); |
159 if (!headless_web_contents->OpenURL(builder->initial_url_)) | 174 if (!headless_web_contents->OpenURL(builder->initial_url_)) |
160 return nullptr; | 175 return nullptr; |
161 return headless_web_contents; | 176 return headless_web_contents; |
162 } | 177 } |
163 | 178 |
164 // static | 179 // static |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 | 227 |
213 for (const MojoService& service : mojo_services_) { | 228 for (const MojoService& service : mojo_services_) { |
214 interface_registry->AddInterface(service.service_name, | 229 interface_registry->AddInterface(service.service_name, |
215 service.service_factory, | 230 service.service_factory, |
216 browser()->BrowserMainThread()); | 231 browser()->BrowserMainThread()); |
217 } | 232 } |
218 | 233 |
219 browser_context_->SetFrameTreeNodeId(render_frame_host->GetProcess()->GetID(), | 234 browser_context_->SetFrameTreeNodeId(render_frame_host->GetProcess()->GetID(), |
220 render_frame_host->GetRoutingID(), | 235 render_frame_host->GetRoutingID(), |
221 render_frame_host->GetFrameTreeNodeId()); | 236 render_frame_host->GetFrameTreeNodeId()); |
222 | |
223 std::string devtools_agent_host_id = | |
224 content::DevToolsAgentHost::GetOrCreateFor(render_frame_host)->GetId(); | |
225 render_frame_host_to_devtools_agent_host_id_[render_frame_host] = | |
226 devtools_agent_host_id; | |
227 devtools_agent_id_to_frame_tree_node_id_[devtools_agent_host_id] = | |
228 render_frame_host->GetFrameTreeNodeId(); | |
229 } | 237 } |
230 | 238 |
231 void HeadlessWebContentsImpl::RenderFrameDeleted( | 239 void HeadlessWebContentsImpl::RenderFrameDeleted( |
232 content::RenderFrameHost* render_frame_host) { | 240 content::RenderFrameHost* render_frame_host) { |
233 browser_context_->RemoveFrameTreeNode( | 241 browser_context_->RemoveFrameTreeNode( |
234 render_frame_host->GetProcess()->GetID(), | 242 render_frame_host->GetProcess()->GetID(), |
235 render_frame_host->GetRoutingID()); | 243 render_frame_host->GetRoutingID()); |
236 | |
237 auto find_it = | |
238 render_frame_host_to_devtools_agent_host_id_.find(render_frame_host); | |
239 if (find_it == render_frame_host_to_devtools_agent_host_id_.end()) | |
240 return; | |
241 | |
242 devtools_agent_id_to_frame_tree_node_id_.erase(find_it->second); | |
243 render_frame_host_to_devtools_agent_host_id_.erase(find_it); | |
244 } | |
245 | |
246 bool HeadlessWebContentsImpl::GetFrameTreeNodeIdForDevToolsAgentHostId( | |
247 const std::string& devtools_agent_host_id, | |
248 int* frame_tree_node_id) const { | |
249 const auto& find_it = | |
250 devtools_agent_id_to_frame_tree_node_id_.find(devtools_agent_host_id); | |
251 if (find_it == devtools_agent_id_to_frame_tree_node_id_.end()) | |
252 return false; | |
253 *frame_tree_node_id = find_it->second; | |
254 return true; | |
255 } | 244 } |
256 | 245 |
257 std::string | 246 std::string |
258 HeadlessWebContentsImpl::GetUntrustedDevToolsFrameIdForFrameTreeNodeId( | 247 HeadlessWebContentsImpl::GetUntrustedDevToolsFrameIdForFrameTreeNodeId( |
259 int process_id, | 248 int process_id, |
260 int frame_tree_node_id) const { | 249 int frame_tree_node_id) const { |
261 return content::DevToolsAgentHost:: | 250 return content::DevToolsAgentHost:: |
262 GetUntrustedDevToolsFrameIdForFrameTreeNodeId(process_id, | 251 GetUntrustedDevToolsFrameIdForFrameTreeNodeId(process_id, |
263 frame_tree_node_id); | 252 frame_tree_node_id); |
264 } | 253 } |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 initial_url_ = initial_url; | 374 initial_url_ = initial_url; |
386 return *this; | 375 return *this; |
387 } | 376 } |
388 | 377 |
389 HeadlessWebContents::Builder& HeadlessWebContents::Builder::SetWindowSize( | 378 HeadlessWebContents::Builder& HeadlessWebContents::Builder::SetWindowSize( |
390 const gfx::Size& size) { | 379 const gfx::Size& size) { |
391 window_size_ = size; | 380 window_size_ = size; |
392 return *this; | 381 return *this; |
393 } | 382 } |
394 | 383 |
395 HeadlessWebContents::Builder& HeadlessWebContents::Builder::AddMojoService( | |
396 const std::string& service_name, | |
397 const base::Callback<void(mojo::ScopedMessagePipeHandle)>& | |
398 service_factory) { | |
399 mojo_services_.emplace_back(service_name, service_factory); | |
400 return *this; | |
401 } | |
402 | |
403 HeadlessWebContents::Builder& HeadlessWebContents::Builder::CreateTabSocket( | 384 HeadlessWebContents::Builder& HeadlessWebContents::Builder::CreateTabSocket( |
404 bool create_tab_socket) { | 385 bool create_tab_socket) { |
405 create_tab_socket_ = create_tab_socket; | 386 create_tab_socket_ = create_tab_socket; |
406 return *this; | 387 return *this; |
407 } | 388 } |
408 | 389 |
409 HeadlessWebContents* HeadlessWebContents::Builder::Build() { | 390 HeadlessWebContents* HeadlessWebContents::Builder::Build() { |
410 return browser_context_->CreateWebContents(this); | 391 return browser_context_->CreateWebContents(this); |
411 } | 392 } |
412 | 393 |
413 HeadlessWebContents::Builder::MojoService::MojoService() {} | 394 HeadlessWebContents::Builder::MojoService::MojoService() {} |
414 | 395 |
415 HeadlessWebContents::Builder::MojoService::MojoService( | 396 HeadlessWebContents::Builder::MojoService::MojoService( |
416 const std::string& service_name, | 397 const std::string& service_name, |
417 const base::Callback<void(mojo::ScopedMessagePipeHandle)>& service_factory) | 398 const base::Callback<void(mojo::ScopedMessagePipeHandle)>& service_factory) |
418 : service_name(service_name), service_factory(service_factory) {} | 399 : service_name(service_name), service_factory(service_factory) {} |
419 | 400 |
420 HeadlessWebContents::Builder::MojoService::~MojoService() {} | 401 HeadlessWebContents::Builder::MojoService::~MojoService() {} |
421 | 402 |
422 } // namespace headless | 403 } // namespace headless |
OLD | NEW |