| 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 |