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 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 HeadlessWebContents::Observer* observer) | 47 HeadlessWebContents::Observer* observer) |
48 : content::WebContentsObserver(web_contents), observer_(observer) {} | 48 : content::WebContentsObserver(web_contents), observer_(observer) {} |
49 | 49 |
50 ~WebContentsObserverAdapter() override {} | 50 ~WebContentsObserverAdapter() override {} |
51 | 51 |
52 void RenderViewReady() override { | 52 void RenderViewReady() override { |
53 DCHECK(web_contents()->GetMainFrame()->IsRenderFrameLive()); | 53 DCHECK(web_contents()->GetMainFrame()->IsRenderFrameLive()); |
54 observer_->DevToolsTargetReady(); | 54 observer_->DevToolsTargetReady(); |
55 } | 55 } |
56 | 56 |
| 57 HeadlessWebContents::Observer* observer() { return observer_; } |
| 58 |
57 private: | 59 private: |
58 HeadlessWebContents::Observer* observer_; // Not owned. | 60 HeadlessWebContents::Observer* observer_; // Not owned. |
59 | 61 |
60 DISALLOW_COPY_AND_ASSIGN(WebContentsObserverAdapter); | 62 DISALLOW_COPY_AND_ASSIGN(WebContentsObserverAdapter); |
61 }; | 63 }; |
62 | 64 |
63 class HeadlessWebContentsImpl::Delegate : public content::WebContentsDelegate { | 65 class HeadlessWebContentsImpl::Delegate : public content::WebContentsDelegate { |
64 public: | 66 public: |
65 explicit Delegate(HeadlessBrowserContextImpl* browser_context) | 67 explicit Delegate(HeadlessBrowserContextImpl* browser_context) |
66 : browser_context_(browser_context) {} | 68 : browser_context_(browser_context) {} |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 } | 134 } |
133 | 135 |
134 HeadlessWebContentsImpl::HeadlessWebContentsImpl( | 136 HeadlessWebContentsImpl::HeadlessWebContentsImpl( |
135 content::WebContents* web_contents, | 137 content::WebContents* web_contents, |
136 HeadlessBrowserContextImpl* browser_context) | 138 HeadlessBrowserContextImpl* browser_context) |
137 : content::WebContentsObserver(web_contents), | 139 : content::WebContentsObserver(web_contents), |
138 web_contents_delegate_( | 140 web_contents_delegate_( |
139 new HeadlessWebContentsImpl::Delegate(browser_context)), | 141 new HeadlessWebContentsImpl::Delegate(browser_context)), |
140 web_contents_(web_contents), | 142 web_contents_(web_contents), |
141 agent_host_(content::DevToolsAgentHost::GetOrCreateFor(web_contents)), | 143 agent_host_(content::DevToolsAgentHost::GetOrCreateFor(web_contents)), |
142 browser_context_(browser_context) { | 144 browser_context_(browser_context), |
| 145 render_process_host_(web_contents->GetRenderProcessHost()) { |
143 web_contents_->SetDelegate(web_contents_delegate_.get()); | 146 web_contents_->SetDelegate(web_contents_delegate_.get()); |
| 147 render_process_host_->AddObserver(this); |
144 } | 148 } |
145 | 149 |
146 HeadlessWebContentsImpl::~HeadlessWebContentsImpl() { | 150 HeadlessWebContentsImpl::~HeadlessWebContentsImpl() { |
147 web_contents_->Close(); | 151 web_contents_->Close(); |
| 152 if (render_process_host_) |
| 153 render_process_host_->RemoveObserver(this); |
148 } | 154 } |
149 | 155 |
150 void HeadlessWebContentsImpl::RenderFrameCreated( | 156 void HeadlessWebContentsImpl::RenderFrameCreated( |
151 content::RenderFrameHost* render_frame_host) { | 157 content::RenderFrameHost* render_frame_host) { |
152 if (!mojo_services_.empty()) { | 158 if (!mojo_services_.empty()) { |
153 render_frame_host->GetRenderViewHost()->AllowBindings( | 159 render_frame_host->GetRenderViewHost()->AllowBindings( |
154 content::BINDINGS_POLICY_HEADLESS); | 160 content::BINDINGS_POLICY_HEADLESS); |
155 } | 161 } |
156 | 162 |
157 service_manager::InterfaceRegistry* interface_registry = | 163 service_manager::InterfaceRegistry* interface_registry = |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 observer_map_[observer] = base::MakeUnique<WebContentsObserverAdapter>( | 195 observer_map_[observer] = base::MakeUnique<WebContentsObserverAdapter>( |
190 web_contents_.get(), observer); | 196 web_contents_.get(), observer); |
191 } | 197 } |
192 | 198 |
193 void HeadlessWebContentsImpl::RemoveObserver(Observer* observer) { | 199 void HeadlessWebContentsImpl::RemoveObserver(Observer* observer) { |
194 ObserverMap::iterator it = observer_map_.find(observer); | 200 ObserverMap::iterator it = observer_map_.find(observer); |
195 DCHECK(it != observer_map_.end()); | 201 DCHECK(it != observer_map_.end()); |
196 observer_map_.erase(it); | 202 observer_map_.erase(it); |
197 } | 203 } |
198 | 204 |
| 205 void HeadlessWebContentsImpl::RenderProcessExited( |
| 206 content::RenderProcessHost* host, |
| 207 base::TerminationStatus status, |
| 208 int exit_code) { |
| 209 DCHECK_EQ(render_process_host_, host); |
| 210 for (const auto& pair : observer_map_) { |
| 211 pair.second->observer()->RenderProcessExited(status, exit_code); |
| 212 } |
| 213 } |
| 214 |
| 215 void HeadlessWebContentsImpl::RenderProcessHostDestroyed( |
| 216 content::RenderProcessHost* host) { |
| 217 DCHECK_EQ(render_process_host_, host); |
| 218 render_process_host_ = nullptr; |
| 219 } |
| 220 |
199 HeadlessDevToolsTarget* HeadlessWebContentsImpl::GetDevToolsTarget() { | 221 HeadlessDevToolsTarget* HeadlessWebContentsImpl::GetDevToolsTarget() { |
200 return web_contents()->GetMainFrame()->IsRenderFrameLive() ? this : nullptr; | 222 return web_contents()->GetMainFrame()->IsRenderFrameLive() ? this : nullptr; |
201 } | 223 } |
202 | 224 |
203 void HeadlessWebContentsImpl::AttachClient(HeadlessDevToolsClient* client) { | 225 void HeadlessWebContentsImpl::AttachClient(HeadlessDevToolsClient* client) { |
204 HeadlessDevToolsClientImpl::From(client)->AttachToHost(agent_host_.get()); | 226 HeadlessDevToolsClientImpl::From(client)->AttachToHost(agent_host_.get()); |
205 } | 227 } |
206 | 228 |
207 void HeadlessWebContentsImpl::DetachClient(HeadlessDevToolsClient* client) { | 229 void HeadlessWebContentsImpl::DetachClient(HeadlessDevToolsClient* client) { |
208 DCHECK(agent_host_); | 230 DCHECK(agent_host_); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 HeadlessWebContents::Builder::MojoService::MojoService() {} | 279 HeadlessWebContents::Builder::MojoService::MojoService() {} |
258 | 280 |
259 HeadlessWebContents::Builder::MojoService::MojoService( | 281 HeadlessWebContents::Builder::MojoService::MojoService( |
260 const std::string& service_name, | 282 const std::string& service_name, |
261 const base::Callback<void(mojo::ScopedMessagePipeHandle)>& service_factory) | 283 const base::Callback<void(mojo::ScopedMessagePipeHandle)>& service_factory) |
262 : service_name(service_name), service_factory(service_factory) {} | 284 : service_name(service_name), service_factory(service_factory) {} |
263 | 285 |
264 HeadlessWebContents::Builder::MojoService::~MojoService() {} | 286 HeadlessWebContents::Builder::MojoService::~MojoService() {} |
265 | 287 |
266 } // namespace headless | 288 } // namespace headless |
OLD | NEW |