Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: extensions/browser/guest_view/guest_view_base.cc

Issue 618823002: GuestView: Move lifetime management out of content (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added comment Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "extensions/browser/guest_view/guest_view_base.h" 5 #include "extensions/browser/guest_view/guest_view_base.h"
6 6
7 #include "base/lazy_instance.h" 7 #include "base/lazy_instance.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "content/public/browser/render_frame_host.h" 9 #include "content/public/browser/render_frame_host.h"
10 #include "content/public/browser/render_process_host.h" 10 #include "content/public/browser/render_process_host.h"
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 : WebContentsObserver(guest->embedder_web_contents()), 63 : WebContentsObserver(guest->embedder_web_contents()),
64 destroyed_(false), 64 destroyed_(false),
65 guest_(guest) { 65 guest_(guest) {
66 } 66 }
67 67
68 virtual ~EmbedderWebContentsObserver() { 68 virtual ~EmbedderWebContentsObserver() {
69 } 69 }
70 70
71 // WebContentsObserver implementation. 71 // WebContentsObserver implementation.
72 virtual void WebContentsDestroyed() OVERRIDE { 72 virtual void WebContentsDestroyed() OVERRIDE {
73 // If the embedder is destroyed then destroy the guest.
73 Destroy(); 74 Destroy();
74 } 75 }
75 76
76 virtual void RenderViewHostChanged( 77 virtual void AboutToNavigateRenderView(
77 content::RenderViewHost* old_host, 78 content::RenderViewHost* render_view_host) OVERRIDE {
78 content::RenderViewHost* new_host) OVERRIDE { 79 // If the embedder navigates then destroy the guest.
79 Destroy(); 80 Destroy();
80 } 81 }
81 82
82 virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE { 83 virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE {
84 // If the embedder crashes, then destroy the guest.
83 Destroy(); 85 Destroy();
84 } 86 }
85 87
86 private: 88 private:
87 bool destroyed_; 89 bool destroyed_;
88 GuestViewBase* guest_; 90 GuestViewBase* guest_;
89 91
90 void Destroy() { 92 void Destroy() {
91 if (destroyed_) 93 if (destroyed_)
92 return; 94 return;
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 // WebContents. 292 // WebContents.
291 CHECK(!attached()); 293 CHECK(!attached());
292 CHECK_EQ(host->GetID(), embedder_render_process_id()); 294 CHECK_EQ(host->GetID(), embedder_render_process_id());
293 295
294 // This code path may be reached if the embedder WebContents is killed for 296 // This code path may be reached if the embedder WebContents is killed for
295 // whatever reason immediately after a called to GuestViewInternal.createGuest 297 // whatever reason immediately after a called to GuestViewInternal.createGuest
296 // and before attaching the new guest to a frame. 298 // and before attaching the new guest to a frame.
297 Destroy(); 299 Destroy();
298 } 300 }
299 301
300 void GuestViewBase::Destroy() {
301 DCHECK(web_contents());
302 content::RenderProcessHost* host =
303 content::RenderProcessHost::FromID(embedder_render_process_id());
304 if (host)
305 host->RemoveObserver(this);
306 WillDestroy();
307 if (!destruction_callback_.is_null())
308 destruction_callback_.Run();
309
310 webcontents_guestview_map.Get().erase(web_contents());
311 GuestViewManager::FromBrowserContext(browser_context_)->
312 RemoveGuest(guest_instance_id_);
313 pending_events_.clear();
314
315 delete web_contents();
316 }
317
318 void GuestViewBase::DidAttach(int guest_proxy_routing_id) { 302 void GuestViewBase::DidAttach(int guest_proxy_routing_id) {
319 // Give the derived class an opportunity to perform some actions. 303 // Give the derived class an opportunity to perform some actions.
320 DidAttachToEmbedder(); 304 DidAttachToEmbedder();
321 305
322 // Inform the associated GuestViewContainer that the contentWindow is ready. 306 // Inform the associated GuestViewContainer that the contentWindow is ready.
323 embedder_web_contents()->Send(new ExtensionMsg_GuestAttached( 307 embedder_web_contents()->Send(new ExtensionMsg_GuestAttached(
324 embedder_web_contents()->GetMainFrame()->GetRoutingID(), 308 embedder_web_contents()->GetMainFrame()->GetRoutingID(),
325 element_instance_id_, 309 element_instance_id_,
326 guest_proxy_routing_id)); 310 guest_proxy_routing_id));
327 311
328 SendQueuedEvents(); 312 SendQueuedEvents();
329 } 313 }
330 314
331 void GuestViewBase::ElementSizeChanged(const gfx::Size& old_size, 315 void GuestViewBase::ElementSizeChanged(const gfx::Size& old_size,
332 const gfx::Size& new_size) { 316 const gfx::Size& new_size) {
333 element_size_ = new_size; 317 element_size_ = new_size;
334 } 318 }
335 319
336 void GuestViewBase::GuestSizeChanged(const gfx::Size& old_size, 320 void GuestViewBase::GuestSizeChanged(const gfx::Size& old_size,
337 const gfx::Size& new_size) { 321 const gfx::Size& new_size) {
338 if (!auto_size_enabled_) 322 if (!auto_size_enabled_)
339 return; 323 return;
340 guest_size_ = new_size; 324 guest_size_ = new_size;
341 GuestSizeChangedDueToAutoSize(old_size, new_size); 325 GuestSizeChangedDueToAutoSize(old_size, new_size);
342 } 326 }
343 327
328 void GuestViewBase::Destroy() {
329 DCHECK(web_contents());
330 content::RenderProcessHost* host =
331 content::RenderProcessHost::FromID(embedder_render_process_id());
332 if (host)
333 host->RemoveObserver(this);
334
335 // Give the derived class an opportunity to perform some cleanup.
336 WillDestroy();
337
338 // Give the content module an opportunity to perform some cleanup.
339 if (!destruction_callback_.is_null())
340 destruction_callback_.Run();
341
342 webcontents_guestview_map.Get().erase(web_contents());
343 GuestViewManager::FromBrowserContext(browser_context_)->
344 RemoveGuest(guest_instance_id_);
345 pending_events_.clear();
346
347 delete web_contents();
348 }
349
344 void GuestViewBase::SetAttachParams(const base::DictionaryValue& params) { 350 void GuestViewBase::SetAttachParams(const base::DictionaryValue& params) {
345 attach_params_.reset(params.DeepCopy()); 351 attach_params_.reset(params.DeepCopy());
346 attach_params_->GetInteger(guestview::kParameterInstanceId, 352 attach_params_->GetInteger(guestview::kParameterInstanceId,
347 &view_instance_id_); 353 &view_instance_id_);
348 } 354 }
349 355
350 void GuestViewBase::SetOpener(GuestViewBase* guest) { 356 void GuestViewBase::SetOpener(GuestViewBase* guest) {
351 if (guest && guest->IsViewType(GetViewType())) { 357 if (guest && guest->IsViewType(GetViewType())) {
352 opener_ = guest->AsWeakPtr(); 358 opener_ = guest->AsWeakPtr();
353 return; 359 return;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 GuestReady(); 395 GuestReady();
390 content::RenderViewHost* rvh = web_contents()->GetRenderViewHost(); 396 content::RenderViewHost* rvh = web_contents()->GetRenderViewHost();
391 if (auto_size_enabled_) { 397 if (auto_size_enabled_) {
392 rvh->EnableAutoResize(min_auto_size_, max_auto_size_); 398 rvh->EnableAutoResize(min_auto_size_, max_auto_size_);
393 } else { 399 } else {
394 rvh->DisableAutoResize(element_size_); 400 rvh->DisableAutoResize(element_size_);
395 } 401 }
396 } 402 }
397 403
398 void GuestViewBase::WebContentsDestroyed() { 404 void GuestViewBase::WebContentsDestroyed() {
405 // Let the derived class know that its WebContents is in the process of
406 // being destroyed. web_contents() is still valid at this point.
407 // TODO(fsamuel): This allows for reentrant code into WebContents during
408 // destruction. This could potentially lead to bugs. Perhaps we should get rid
409 // of this?
399 GuestDestroyed(); 410 GuestDestroyed();
411
412 // Self-destruct.
400 delete this; 413 delete this;
401 } 414 }
402 415
403 void GuestViewBase::ActivateContents(WebContents* web_contents) { 416 void GuestViewBase::ActivateContents(WebContents* web_contents) {
404 if (!attached() || !embedder_web_contents()->GetDelegate()) 417 if (!attached() || !embedder_web_contents()->GetDelegate())
405 return; 418 return;
406 419
407 embedder_web_contents()->GetDelegate()->ActivateContents( 420 embedder_web_contents()->GetDelegate()->ActivateContents(
408 embedder_web_contents()); 421 embedder_web_contents());
409 } 422 }
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 504
492 // static 505 // static
493 void GuestViewBase::RegisterGuestViewTypes() { 506 void GuestViewBase::RegisterGuestViewTypes() {
494 AppViewGuest::Register(); 507 AppViewGuest::Register();
495 ExtensionOptionsGuest::Register(); 508 ExtensionOptionsGuest::Register();
496 MimeHandlerViewGuest::Register(); 509 MimeHandlerViewGuest::Register();
497 WebViewGuest::Register(); 510 WebViewGuest::Register();
498 } 511 }
499 512
500 } // namespace extensions 513 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/browser/guest_view/guest_view_base.h ('k') | extensions/browser/guest_view/web_view/web_view_constants.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698